Autor Beitrag
darkdester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 08.03.11 00:04 
Erstmal sorry für den miesen Titel!

Hier mal der Code

ausblenden 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 user profile iconKha: Delphi-Tags hinzugefügt
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

ausblenden 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;                     // Annahme wahr, weil die AND-Abfrage erfolgt
  s := Trim(AnsiUppercase(s));     // Auch bei Texten anwendbar, Leerzeichen vorher und hinterher löschen.
  l := Length(s);
  if l>1 then                      // einbuchstabige Texte sofort als wahr ausgeben, ansonsten Schleife durchlaufen 
  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;

// Deine IF-Abfrage wäre dann:

:
   if Palindrom(s) then Listbox2.Add(s);
:

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.03.11 05:38 
Wofür brauchst du Erg, c1 und c2? :gruebel:

Außerdem kann man sich die Rechnerei beim Zeichenzugriff auch sparen:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 08.03.11 10:24 
ausblenden 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

Screen

Linkerkasten sind alle Produkte von 1x1 bis 99x99 und rechts in der Listbox sollten die Palindrome stehen, wo nur 1 erscheint.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 08.03.11 10:43 
OMG daran lags.

Danke!

allerdings hab ich wohl nene Gedankenfehler, das können nicht alle Plalindrome sein
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.03.11 10:52 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. :D

Edit:
user profile icondarkdester hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 08.03.11 11:10 
Ok...

iregendwas stimmt trotzdem nicht :D

888888 kann nicht das Größte sein
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.03.11 11:21 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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.


Zuletzt bearbeitet von jaenicke am Di 08.03.11 11:23, insgesamt 3-mal bearbeitet
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 08.03.11 11:22 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 08.03.11 11:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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:

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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 :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!