Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi LiebesTester (https://www.delphipraxis.net/67153-liebestester.html)

toredo 10. Apr 2006 13:06


LiebesTester
 
hay,

ich möchte so ein liebes-tester-proggi machen.
als ausgabe sollte kommen, zu wie viel prozent zwei leute zusammenpassen.
aber ich ich möchte das nicht mit random(100) machen, weil dann kann man ja mit den selben zwei namen x verschiedene ergebnisse bekommen...

ich hab mal nachgedacht, wie ichs machen könnte und dann bin ich auf eine idee gekommen:
das Programm shcneidet die beiden namen einfach in die einzelnen buchstaben, jedem buchstaben ist eine primzahl zugeordnet.
die zahlen aus dem ersten namen werden miteinander multipliziert und die zahlen aus dem zweiten namen auch.
diese zwei neuen zahlen zählt man nun zusammen und schneidet falls die zahl mer als zwei stellen hat, alle stellen nach der 1ner und 10ner stelle ab.
ich muss jetzt einfach wissen wie die buchstaben zu einer multiplikatioon gemacht werden können und wie ich die letzten zwei stellen abschneiden kann.

hier ein beispiel:

1.name= eva
2.name= paul

hier die 26.primzahlen (das programm sollte ä,ö und ü zu ae, oe und ue machen und erst dann rechnen.):
a=2
b=3
c=5
d=7
e=11
f=13
g=17
h=19
i=23
j=29
k=31
l=37
m=41
n=43
o=47
p=53
q=59
r=61
s=67
t=71
u=73
v=79
w=83
x=89
y=97
z=101
eva= 11*79*2=1738
paul=53*2*73*37=286306

1738+286306=288044

2880|44
=44
Also passen Eva und Paul zu 44% zueinander;)


mfG benj

Nicodius 10. Apr 2006 13:10

Re: LiebesTester
 
die buchstaben haben alle einen wert (A = 65 zb B = 66) usw


mit ord('A') kommt zb der wert 65 zurück :) - und dann mulitplizierst du den

sakura 10. Apr 2006 13:10

Re: LiebesTester
 
So, und wie lautet jetzt Deine Frage :gruebel:

...:cat:...

Matze 10. Apr 2006 13:12

Re: LiebesTester
 
Hi, moment mal. Dann hat das Teil ja 0% Wahrheitsgehalt, ist das gewollt? Wäre es nicht gescheiter, durch die Angabe von Hobbies etc. so etwas zu machen, oder habe ich den Sinn des Programmes total misverstanden?

@Sakura:
Zitat:

Zitat von toredo
ich muss jetzt einfach wissen wie die buchstaben zu einer multiplikatioon gemacht werden können und wie ich die letzten zwei stellen abschneiden kann.

Ich würde ein Array nehmen und das dort entsprechend zuweisen und mit Delphi-Referenz durchsuchenCopy/Delphi-Referenz durchsuchenDelete kannst du dann den String zurechtschneiden.

Edit:
@Nicodius: Dann wäre a eber <> 2 und b <> 3 etc., wie er es gerne hätte ;)

Edit: Tippfehler und Edits. ^^

pacman1986 10. Apr 2006 13:12

Re: LiebesTester
 
Zitat:

Zitat von toredo
ich muss jetzt einfach wissen wie die buchstaben zu einer multiplikatioon gemacht werden können und wie ich die letzten zwei stellen abschneiden kann.

//ARG ROTER KASTEN WO WARST DU

TeronG 10. Apr 2006 13:16

Re: LiebesTester
 
Zerschneiden musste ja garnet ... mit StringVariabel[x] kannste ja die einzelnen Stellen abfragen .. sollte ja reichen ... und wenn du dich von den Primzahlen lösen kannst und auf ord umsteigst ist das ganze nicht mal mehr n 10-zeiler.

for x := 0 to Length(vString) do Ord(vString[x]) ...

Klaus01 10. Apr 2006 13:17

Re: LiebesTester
 
eine Möglickeit:

machst Dir einen String s mit dem Inhalt 'abcdefg...xyz'
und eine Array of Integer aPrim mit Deinen Primzahln [2,3,5....]

dann kannst Du mit

aPrim[pos('a',s)] = primzahl von a

daraufzugreifen.

Das alles dann in ein Schleife bauen

Delphi-Quellcode:
for i:=1 to length(name) do
  zahl1:=zahl1*aPrim[pos(name[i],s)];
Nur ein Ansatz.
Wie sinnvoll das ganze ist, sei mal dahingestellt.

Grüße
Klaus

toredo 10. Apr 2006 13:23

Re: LiebesTester
 
ich lieb dieses forum, kaum hab ich den beitrag geschrieben hab ich auch schon x antworen bekommen, ich werde mal eine anch der anderen durchprobieren, danke@all :roll:
Zitat:

Hi, moment mal. Dann hat das Teil ja 0% Wahrheitsgehalt, ist das gewollt? Wäre es nicht gescheiter, durch die Angabe von Hobbies etc. so etwas zu machen, oder habe ich den Sinn des Programmes total misverstanden?
das wäre mir alles schon zu kompliziert, ich wüsste da nicht mal wie ich beim code anfangen müsste...

obwohldas programm an sich sinnlos ist, lern ich dabei trozdem einige neue funktionen kennen :mrgreen:



mfG toredo

TeronG 10. Apr 2006 13:28

Re: LiebesTester
 
Zitat:

Zitat von toredo
obwohldas programm an sich sinnlos ist, lern ich dabei trozdem einige neue funktionen kennen :mrgreen:

Also isses doch nicht komplett sinlos ^^

@Klaus01: Nette Idee das mit dem Array und dem String :gruebel:

JasonDX 10. Apr 2006 13:37

Re: LiebesTester
 
Zitat:

Zitat von Klaus01
eine Möglickeit:

machst Dir einen String s mit dem Inhalt 'abcdefg...xyz'
und eine Array of Integer aPrim mit Deinen Primzahln [2,3,5....]

dann kannst Du mit

aPrim[pos('a',s)] = primzahl von a

daraufzugreifen.

Es ginge noch etwas eleganter:
Delphi-Quellcode:
const
  zahlen: array['a'..'z'] of byte = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101);
//...
zahl := zahlen['e'] * zahlen['m'] * zahlen['i'] * zahlen['l'];
was das wegschneiden der restlichen Ziffern angeht: Delphi-Referenz durchsuchenmod: Der Restbetrag der Division durch 100 gibt die letzten beiden Stellen der Zahl :)

greetz
Mike

gmc616 10. Apr 2006 13:38

Re: LiebesTester
 
OT: Hmmm, mal sehn

Christoph-Maria + Eva = G.L.??

mal fix im Kopf zusammen rechnen:

Christoph-Maria = 30008325104105
Eva = 1738

30008325104105 + 1738 = 30008325105843
300083251058|43 = 6978680257,16

Also passen Christoph-Maria und Eva zu 6978680257 % zusammen !? :shock:

Na dann dürfte es sich mit dem Nachwuchsproblem in Deutschland erledigt haben :lol:

JWeis 10. Apr 2006 13:42

Re: LiebesTester
 
Zitat:

Zitat von gmc616
OT: Hmmm, mal sehn

Christoph-Maria + Eva = G.L.??

mal fix im Kopf zusammen rechnen:

Christoph-Maria = 30008325104105
Eva = 1738

30008325104105 + 1738 = 30008325105843
300083251058|43 = 6978680257,16

Also passen Christoph-Maria und Eva zu 6978680257 % zusammen !? :shock:

Na dann dürfte es sich mit dem Nachwuchsproblem in Deutschland erledigt haben :lol:


sie passen 43 zusammen es werden die letzten 2 stellen als Ergebnis genommen und nicht geteilt durch die letzten 2 stellen

toredo 10. Apr 2006 13:42

Re: LiebesTester
 
Zitat:

Zitat von gmc616
OT: Hmmm, mal sehn

Christoph-Maria + Eva = G.L.??

mal fix im Kopf zusammen rechnen:

Christoph-Maria = 30008325104105
Eva = 1738

30008325104105 + 1738 = 30008325105843
300083251058|43 = 6978680257,16

Also passen Christoph-Maria und Eva zu 6978680257 % zusammen !? :shock:

Na dann dürfte es sich mit dem Nachwuchsproblem in Deutschlan erledig haben :lol:

:mrgreen: 6978680257 %^^

du hast nen kleinen fehler gemacht;)
diese zeile stimmt noch:
30008325104105 + 1738 = 30008325105843

dann wird die 43 abgetrent, weil das die letzten zwei ziffern sind, d.h. die beiden passen nur zu 43% zusammen:)



ich hab auch noch ne frage:
ich bin jetzt dran das ganze auf die weise von Klaus1 zu verwirklichen, aber ich weiss ned wie man einen "Array of Integer" macht, kann mir das bitte jemand erklären weil ich kenn nur Integer^^



mfG toredo

Klaus01 10. Apr 2006 13:47

Re: LiebesTester
 
const
aPrim: Array [1..26] of Integer = (2,3,5, ...,101 );

Steht aber auch in der OH unter Array

Grüße
Klaus

gmc616 10. Apr 2006 13:51

Re: LiebesTester
 
@JWeis und toredo: Stimmt, mein Fehler. :thumb: Das erklärt auch | und nicht / ! :duck:

Doch nichts mit Nachwuchs in D. :sharkylinchen:

Nicodius 10. Apr 2006 14:00

Re: LiebesTester
 
er rechnet einfach minus 65 ;)

toredo 10. Apr 2006 15:11

Re: LiebesTester
 
das proggi ist gleich fertig ich ahb nur ncoh zwei ganz kleine probs.
wie schaff ich es, dass alle buchstaben in diese zeile kommen:
zahl := zahlen['e'] * zahlen['m'] * zahlen['i'] * zahlen['l'];
also damit mein ich, dass das wort so zerlegt wird.

und das zweite problem ist, dass grossbuchstaben nicht angenommen werden, d.h. wenn ich statt zahlen['e'] zahlen['E'] hinschreibe kommt ein fehler beim kompilieren.




mfG toredo

Klaus01 10. Apr 2006 15:14

Re: LiebesTester
 
Zitat:

zahl := zahlen['e'] * zahlen['m'] * zahlen['i'] * zahlen['l'];
also damit mein ich, dass das wort so zerlegt wird.
Delphi-Quellcode:
for i:= 1 to length(name) do
  zahl:= zahl*zahlen[name[i]];
Aus der Unit SysUtils

Delphi-Quellcode:
name:=lowercase(name)
Grüße
Klaus

toredo 10. Apr 2006 15:21

Re: LiebesTester
 
dann werd ich das prog mal vertigstellen udn es dann in den open-source bereich reinmachen, thx an alle die geholfen haben.



mfG toredo

freak4fun 10. Apr 2006 15:23

Re: LiebesTester
 
Hier glaubt wohl einer nicht an die "Große Liebe". :mrgreen: Wenn du nur die letzten 2 Zeichen ausgibst kann das nie 100% werden. Also bei 00 am Ende noch per zufall eine 1 vor schreiben, oder prüfen, ob die 3. letzte Stelle einen 1 ist oder sowas. :zwinker:

MfG
freak

Tonic1024 10. Apr 2006 15:33

Re: LiebesTester
 
Erstmal ist es eine schöne Umsetzung eines alten Klassikers. Das haben bei uns zumeist die Mädels mit Stift und Papier in der Grundschule gemacht. Allerdings denke ich, dass sie nen andern Algo verwendet haben :wink: Nachdem auch Jamba und Co schon auf die Idee gekommen sind das zu vermarkten ist das nun genau das was der Welt noch gefehlt hat... *läster* Aber es ging ja primär um den Lerneffekt und somit kann ich damit leben.

Zitat:

Zitat von freak4fun
Hier glaubt wohl einer nicht an die "Große Liebe". :mrgreen: Wenn du nur die letzten 2 Zeichen ausgibst kann das nie 100% werden. Also bei 00 am Ende noch per zufall eine 1 vor schreiben, oder prüfen, ob die 3. letzte Stelle einen 1 ist oder sowas.

Bei statistischen Erhebungen (also schummeln mit Zahlen) gibt es nie die vollen 100% :wink:


Toni

toredo 10. Apr 2006 15:44

Re: LiebesTester
 
hay,

:gruebel: kann es sein das wenn ich lowercase benutze immer 0 zurückkommt?
weil nach dem lowercase bekommt die variable imemr den wert 0.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
name1:=Edit1.Text;
name1:=Edit2.Text;
name1:=LowerCase(name1);
name2:=LowerCase(name1);
for i:= 1 to length(name1) do
  zahl1:= zahl1*zahlen[name1[i]];
for i:= 1 to length(name2) do
  zahl2:= zahl2*zahlen[name2[i]];
zahl3 := zahl1 + zahl2;
zahl3 := zahl3 mod 100;
Edit3.Text := IntToStr(zahl3);
end;


mfG toredo

Alloc 10. Apr 2006 15:53

Re: LiebesTester
 
Halb OT ;) :

Zitat:

Das haben bei uns zumeist die Mädels mit Stift und Papier in der Grundschule gemacht. Allerdings denke ich, dass sie nen andern Algo verwendet haben
Joa, das gabs sogar bei uns noch :D
Habs mir mal irgendwann erklären lassen... Mit der Umsetzung davon könnte man sogar noch ein bisschen mehr lernen als bei einem einfachen Buchstaben addieren ;)

Beispiel:
Christoph-Maria + Eva (weils so schön viele Buchstaben sind ;) )
Test auf: Liebe

1. Buchstabe: L: kommt in beiden Namen zusammen 0 mal vor.
2. Buchstabe: I: kommt 2 mal vor
3. Buchstabe: E: 1
4. Buchstabe: B: 0
5. Buchstabe: E: 1

Verrechnet wird das dann nach diesem Schema:
http://chrilly.net/liebestest.gif

Wenn zwei solche Zahlen addiert zusammen größer 10 sind, wird einfach aus dieser Zahl noch die Quersumme genommen. (5+8 = 13 => 4)

@toredo: Setz das doch mal um für die Nostalgiker unter uns ;)

mfG, Chris

toredo 10. Apr 2006 17:28

Re: LiebesTester
 
Zitat:

Zitat von Alloc
@toredo: Setz das doch mal um für die Nostalgiker unter uns ;)

mfG, Chris

:mrgreen: würd ich gern machen, aber ist mir zu schwer, :???: ich habe ja auch erst am dienstag das erste mal was mit delphi gemacht^^

aber noch mals chnel zum code, weil den möcht ich fertigbringen :zwinker:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
name1:=LowerCase(Edit1.Text);
name2.Text:=LowerCase(Edit2.Text);
----------------------------------------
for i:= 1 to length(name1) do
  zahl1:= zahl1*zahlen[name1[i]];
for i:= 1 to length(name2) do
  zahl2:= zahl2*zahlen[name2[i]];
----------------------------------------
zahl3 := zahl1 + zahl2;
zahl3 := zahl3 mod 100;
Edit3.Text := IntToStr(zahl3);
end;
nach dem makierten code kommt für zahl1 und zahl2 immer 0 raus, das versteh ich nicht richtig...


mfG toredo

Klaus01 10. Apr 2006 17:34

Re: LiebesTester
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin

  name1:=LowerCase(Edit1.Text);
  name2:=LowerCase(Edit2.Text);
   
  showMessage(name1,name2);

  zahl1:=1;        // <-------------
  for i:= 1 to length(name1) do
    zahl1:= zahl1*zahlen[name1[i]];

  zahl2:=1;        // <-----------
  for i:= 1 to length(name2) do
    zahl2:= zahl2*zahlen[name2[i]];
 
  zahl3 := zahl1 + zahl2;
  zahl3 := zahl3 mod 100;
  Edit3.Text := IntToStr(zahl3);

end;
einrücken nicht vergessen, macht den Code lesbarer,
zahl1 und zahl2 sind nicht initialisiert worden - daher wahrscheinlich 0
und ein Produkt mit 0 gibt 0.

Grüße
Klaus

toredo 10. Apr 2006 17:46

Re: LiebesTester
 
:cheers: thx jetzts funzts...
aber etwas funzt an dem prog noch nicht, aber den fehler im source find ich noch:

alles hat geklappt bis ich meinen namen+den namen eines bestimmten girls eingegeben habe dann kam -99 raus :?



mfG toredo


-edit-

problem ist gelöst

Klaus01 10. Apr 2006 17:53

Re: LiebesTester
 
kann es sein das es zu einem Überlauf bei zahl1 und zahl2 kommt.
Wenn die beiden Zahlen als Integer deklariert sind dann kann
es bei der Multiplikation zu einem Überlauf kommen, der Wert
wird größer als 2147483647. Vielleicht kannst Du dann
LongInt oder Cardinal verwenden.

Grüße
Klaus

toredo 10. Apr 2006 18:35

Re: LiebesTester
 
man kann das proggi jetzt saugen:
http://www.delphipraxis.net/internal...=530551#530551
thx an alle helfer.



mfG toredo


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz