| Autor |
Beitrag |
darkdester
      
Beiträge: 100
|
Verfasst: Di 08.03.11 00:04
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 08.03.11 00: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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 08.03.11 03: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); : |
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.03.11 05:38
Wofür brauchst du Erg, c1 und c2?
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; |
Für diesen Beitrag haben gedankt: KleinesPferd
|
|
darkdester 
      
Beiträge: 100
|
Verfasst: Di 08.03.11 10:24
Einloggen, um Attachments anzusehen!
|
|
Gausi
      
Beiträge: 8553
Erhaltene Danke: 479
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 08.03.11 10: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. 
_________________ We are, we were and will not be.
|
|
darkdester 
      
Beiträge: 100
|
Verfasst: Di 08.03.11 10:43
OMG daran lags.
Danke!
allerdings hab ich wohl nene Gedankenfehler, das können nicht alle Plalindrome sein
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.03.11 10: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...  Dass die immer alle ignorieren...
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 
      
Beiträge: 100
|
Verfasst: Di 08.03.11 11: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
      
Beiträge: 8553
Erhaltene Danke: 479
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 08.03.11 11: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.
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. 
_________________ We are, we were and will not be.
|
|
darkdester 
      
Beiträge: 100
|
Verfasst: Di 08.03.11 11:10
Ok...
iregendwas stimmt trotzdem nicht
888888 kann nicht das Größte sein
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 08.03.11 11: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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.03.11 11:21
Zuletzt bearbeitet von jaenicke am Di 08.03.11 11:23, insgesamt 3-mal bearbeitet
|
|
Gausi
      
Beiträge: 8553
Erhaltene Danke: 479
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 08.03.11 11: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.
_________________ We are, we were and will not be.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 08.03.11 11: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.  | Stimmt, hier hat Result in der Tat eine Sonderstellung, daran habe ich gar nicht gedacht.
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. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
darkdester 
      
Beiträge: 100
|
Verfasst: Di 08.03.11 11: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
Ok jetzt noch die Rechenvorschrift dazwischen werfen.
edit: Hach ich bin zu leichtgläubig...ersparte euch die Antwort
edit2:
edit3:
SOLVED
DANKE an jeden!
|
|
|