Entwickler-Ecke
Sonstiges (Delphi) - for schleife mit if abfrage failed...
darkdester - Di 08.03.11 01:04
Titel: for schleife mit if abfrage failed...
Erstmal sorry für den miesen Titel!
Hier mal der Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var a,b,x:integer; begin
for a := 1 to 99 do begin for b := a to 99 do begin x:=a*b; s:=InttoStr(x); if s=reverse(s) then Listbox2.Items.Add(s) ; Listbox1.Items.Add(s); end; end; end; |
reverse ist ne Spiegelfunktion...geht um Palindromsuche.
Problem: Er gibt mir in Box 1 alle Produkte richtig aus, aber in Box1 gibt er nur 1 aus, was nichtsein kann, da allein 1-9 Palindrome sind.
Der Witz ist wenn ich es bei x:=8 einzeln teste funktioniert es....
Ich grübel seit 3h drüber nach. Dann hab ich mich überwunden hier zu fragen, in Ermangelung eines fachkundigen Kollegens...
Danke im Vorraus!
Moderiert von
Kha: Delphi-Tags hinzugefügt
elundril - Di 08.03.11 01:26
schon mal auf x und s und reverse(s) ne watch gelegt, nen Breakpoint gesetzt und dann durchgestept?
Vielleicht kommst du ja drauf, aber rein von der logik müsst er dir zuerst mal in der box2 alle zahlen von 1 bis 9 ausgeben und dann noch zusätzlich 11, 22,33,44,55,66,77,88,99. im ersten durchlauf von der äußeren schleife. wenns dann nicht machen hats vielleicht was bei der reversefunktion, da die beiden schleifen eig. richtig aussehen.
wie schaut denn die reversfunktion aus?
lg elundril
Tranx - Di 08.03.11 04:53
Gebe Elundril Recht. Wie sieht Deine Reverse-Funktion aus? Daran wird es liegen. Vielleicht hilft es, einfach, statt s = reverse(s) eine Funktion zu schreiben, welche einen Wahrheitswert ausgibt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function Palindrom(s : string) : boolean; var Erg : boolean; i, l : integer; c1, c2 : char; begin Erg := TRUE; s := Trim(AnsiUppercase(s)); l := Length(s); if l>1 then begin for i := 1 to l div 2 do begin c1 := s[i]; c2 := s[l-i+1]; Erg := Erg and (c1=c2); end; end; Result := Erg; end;
: if Palindrom(s) then Listbox2.Add(s); : |
jaenicke - Di 08.03.11 06:38
Wofür brauchst du Erg, c1 und c2? :gruebel:
Außerdem kann man sich die Rechnerei beim Zeichenzugriff auch sparen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function IsPalindrom(const Value: string): Boolean; var LeftPos, RightPos: PChar; UpperCaseValue: string; begin Result := True; if Length(Value) > 1 then begin UpperCaseValue := AnsiUpperCase(Value); LeftPos := @UpperCaseValue[1]; RightPos := @UpperCaseValue[Length(UpperCaseValue)]; while LeftPos < RightPos do begin Result := Result and (LeftPos^ = RightPos^); Inc(LeftPos); Dec(RightPos); end; end; end; |
darkdester - Di 08.03.11 11:24
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function reverse (Text:String):String; var z : integer;
begin for z:=length(Text) downto 1 do result:=result+Text[z]; end; |
da ein Bild
Linkerkasten sind alle Produkte von 1x1 bis 99x99 und rechts in der Listbox sollten die Palindrome stehen, wo nur 1 erscheint.
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Moderiert von
Narses: Bild als Anhang hochgeladen.
Gausi - Di 08.03.11 11:30
Ich bin mir nicht sicher, ob result einer Funktion automatisch initialisiert wird, würde aber da den Fehler vermuten. Versuch mal, das vorher zu initialisieren, also
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function reverse (Text:String):String; var z : integer; begin result := ''; for z:=length(Text) downto 1 do result:=result+Text[z]; end; |
Dass man das vermutlich anders und eleganter lösen könnte, ist wieder ne andere Sache. ;-)
darkdester - Di 08.03.11 11:43
OMG daran lags.
Danke!
allerdings hab ich wohl nene Gedankenfehler, das können nicht alle Plalindrome sein
jaenicke - Di 08.03.11 11:52
Gausi hat folgendes geschrieben : |
| Ich bin mir nicht sicher, ob result einer Funktion automatisch initialisiert wird, würde aber da den Fehler vermuten. |
Nein, werden nicht. Es ist definiertes Verhalten, dass da zufällige Werte drin stehen können.
Deshalb kommt ja auch eine Warnung vom Delphicompiler... :roll: Dass die immer alle ignorieren... :autsch:
Vorinitialisiert werden Felder eines Objektes sowie globale Variablen. Siehe Hilfe:
| Zitat: |
| Wenn Sie eine globale Variable nicht explizit initialisieren, wird sie vom Compiler mit 0 initialisiert. Objektinstanzdaten (Felder) werden auch mit 0 initialisiert. Auf der Wiin32-Plattform ist der Inhalt von lokalen Variablen so lange undefiniert, bis ein Wert zugewiesen wird. |
darkdester - Di 08.03.11 12:03
Wo soll die Warnung stehen?
Außerdem, wieso geht es wenn ich es so mache das ich etwas in ein Editfeld eingebe und mir dann in die Listbox schreiben lasse? oder automatisch, da ging es ja auch.
Aber mal was anderes: Sind das wirklich alle Palindrome? Er gibt mir als höchstes 888888 aus, allerdings ist das falsch bei meiner Aufgabe...
Gausi - Di 08.03.11 12:05
Bei lokalen Variablen ist klar, dass die nicht automatisch initialisiert werden. Es hätte nur sein können, dass "result" da eine Sonderstellung bekommt. Aber egal, ich lag ja richtig mit meiner Vermutung. :D
Edit:
darkdester hat folgendes geschrieben : |
Außerdem, wieso geht es wenn ich es so mache das ich etwas in ein Editfeld eingebe und mir dann in die Listbox schreiben lasse? oder automatisch, da ging es ja auch.
|
Das ist dann Zufall. ;-)
darkdester - Di 08.03.11 12:10
Ok...
iregendwas stimmt trotzdem nicht :D
888888 kann nicht das Größte sein
elundril - Di 08.03.11 12:15
stimmt, da 9779 das höchste sein kann. weil 99x99 = 9801 und damit muss jedes ergebnis kleiner als 9801 sein. und da ist 9779 das nächst kleinere palindrom.
lg elundril
jaenicke - Di 08.03.11 12:21
Gausi hat folgendes geschrieben : |
| Bei lokalen Variablen ist klar, dass die nicht automatisch initialisiert werden. Es hätte nur sein können, dass "result" da eine Sonderstellung bekommt. Aber egal, ich lag ja richtig mit meiner Vermutung. :D |
Stimmt, hier hat Result in der Tat eine Sonderstellung, daran habe ich gar nicht gedacht. :oops:
Denn bei einem String als Rückgabewert wird der Ergebnisstring vorinitialisiert mit einem Zeiger auf den Stack (wo der Wert nil steht) als letzter Parameter übergeben. Dementsprechend ist hier der String in der Tat leer und vorinitialisiert. Deshalb kommt auch keine Warnung vom Compiler, das passiert nur, wenn es kein String ist. Also kann das nicht die Fehlerquelle sein.
Gausi - Di 08.03.11 12:22
elundril hat folgendes geschrieben : |
stimmt, da 9779 das höchste sein kann. weil 99x99 = 9801 und damit muss jedes ergebnis kleiner als 9801 sein. und da ist 9779 das nächst kleinere palindrom.
|
Wobei das auch nicht gefunden wird, da man 9779 nicht in zwei Faktoren <= 99 zerlegen kann. Bei mir wird (Code von hier kopiert, nur s als lokale Variable hinzugefügt) 9009 als größtes Palindrom ausgegeben.
elundril - Di 08.03.11 12:25
jaenicke hat folgendes geschrieben : |
Gausi hat folgendes geschrieben : | | Bei lokalen Variablen ist klar, dass die nicht automatisch initialisiert werden. Es hätte nur sein können, dass "result" da eine Sonderstellung bekommt. Aber egal, ich lag ja richtig mit meiner Vermutung. :D | Stimmt, hier hat Result in der Tat eine Sonderstellung, daran habe ich gar nicht gedacht. :oops:
Denn bei einem String als Rückgabewert wird der Ergebnisstring vorinitialisiert mit Null als letzter Parameter übergeben. Dementsprechend ist hier der String in der Tat leer und vorinitialisiert. Deshalb kommt auch keine Warnung vom Compiler, das passiert nur, wenn es kein String ist. Also kann das nicht die Fehlerquelle sein. |
eventuell gleich lautende globale variablen oder sonstiges was da normalerweise reinpfuscht.
Gausi hat folgendes geschrieben : |
elundril hat folgendes geschrieben : | stimmt, da 9779 das höchste sein kann. weil 99x99 = 9801 und damit muss jedes ergebnis kleiner als 9801 sein. und da ist 9779 das nächst kleinere palindrom.
|
Wobei das auch nicht gefunden wird, da man 9779 nicht in zwei Faktoren <= 99 zerlegen kann. Bei mir wird (Code von hier kopiert, nur s als lokale Variable hinzugefügt) 9009 als größtes Palindrom ausgegeben. |
oh, richtig. darauf sollte man auch achten, ob man das überhaupt als produkt erzeugen kann. :oops:
darkdester - Di 08.03.11 12:33
Stimmt, das hab ich sogar aufgeschrieben wie man das berechnet, hats vergessen.
Ich brauch 999x999, hatte es bisher nur immer 99x99 getestet weil er schneller rechnet :D
Ok jetzt noch die Rechenvorschrift dazwischen werfen.
edit: Hach ich bin zu leichtgläubig...ersparte euch die Antwort :D
edit2:
edit3:
SOLVED ;)
DANKE an jeden!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!