Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi kuerzen von 3 werten (https://www.delphipraxis.net/32857-kuerzen-von-3-werten.html)

glkgereon 28. Okt 2004 21:15


kuerzen von 3 werten
 
also, ich hab drei werte zu einem record zusammengefasst und das in einen array gepackt...nun will ich den ganzen kram kürzen, nur irgendwas stimmt da nicht...

die werte können minimal 1 sein und höchstens 20

es soll nur gekürzt werden wenns bei allen geht

also im Button2Click wird jedes element erst gekürzt, und dann in die listbox geschrieben
nur in der listbox steht dann 100mal "0:0:0"

gesamt is die anzahl der elemente
results is der array

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
  procedure kuerzen(i:integer);
  var j:integer;
  begin
    for j:=20 downto 2 do
      if (results[i].metall mod j=0) and
          (results[i].kristall mod j=0) and
          (results[i].tritium mod j=0)
      then begin
            results[i].metall:=results[i].metall div j;
            results[i].kristall:=results[i].kristall div j;
            results[i].tritium:=results[i].tritium div j;
            end;
  end;
begin
ListBox1.Clear;
  for i:=1 to gesamt do
    begin
    kuerzen(i);
    ListBox1.Items.Add(inttostr(results[i].metall)+':'
                      +inttostr(results[i].kristall)+':'
                      +inttostr(results[i].tritium));
    end;
end;
also ich find das eigentlich total logisch, aber irgendwie haut das nicht hin.... :gruebel:

auch wenn ichs in kuerzen nur von 2 bis 2 laufen lasse kommt der fehler...

nochma edit:

folgender code funzt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var t1,t2,i:integer;
begin
  t1:=strtoint(Edit1.Text);
  t2:=strtoint(Edit2.Text);
  for i:=20 downto 2 do
    if (t1 mod i=0) and (t2 mod i=0)
    then begin
          t1:=t1 div i;
          t2:=t2 div i;
          end;
  showmessage(inttostr(t1)+':'+inttostr(t2));
end;

jim_raynor 29. Okt 2004 10:10

Re: kuerzen von 3 werten
 
Wie ist denn das Array results definiert?

himitsu 29. Okt 2004 11:10

Re: kuerzen von 3 werten
 
Hast du mal "kuerzen" weggelassen und nachgeschaut, was dann in der ListBox steht?

Delphi-Quellcode:
    begin
    //kuerzen(i);
    ListBox1.Items.Add(inttostr(results[i].metall)+':'

glkgereon 29. Okt 2004 12:46

Re: kuerzen von 3 werten
 
also, das array is wie folgt definiert:

Delphi-Quellcode:
type
  TKurs = record
            metall, kristall, tritium:integer;
          end;
var
  results: array[1..155] of TKurs;
und zum zweiten..ähhhh, da kommt auch 0...das KANN nicht sein


also hier nochma der gesamte code:

Delphi-Quellcode:
var
  Form1: TForm1;
  results: array[1..155] of TKurs;
  gesamt:integer;

implementation

{$R *.dfm}

//"tripel" suchen
procedure TForm1.Button1Click(Sender: TObject);
var metall,kristall,tritium,i:integer;
begin
ListBox1.Clear;
gesamt:=0;
for metall:=1 to 20 do
  for kristall:=1 to 20 do
    for tritium:=1 to 20 do
      begin
//wenn es passt dann eintragen
      if abs(metall/kristall-2.2)<0.5
      then if abs(metall/tritium-2.1)<0.5
            then if abs(kristall/tritium-1)<1
                  then begin
//in listbox
                        ListBox1.Items.Add(inttostr(metall)+':'+inttostr(kristall)+':'+inttostr(tritium));
                        inc(gesamt);
                        label1.Caption:=inttostr(gesamt);
//und in array
                        results[i].metall:=metall;
                        results[i].kristall:=kristall;
                        results[i].tritium:=tritium;
                        end;
      end;
end;

//kuerzen
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
  procedure kuerzen(i:integer);
  var j:integer;
  begin
    for j:=20 downto 2 do
      if (results[i].metall mod j=0) and
          (results[i].kristall mod j=0) and
          (results[i].tritium mod j=0)
      then begin
            results[i].metall:=results[i].metall div j;
            results[i].kristall:=results[i].kristall div j;
            results[i].tritium:=results[i].tritium div j;
            end;
  end;
begin
ListBox1.Clear;
  for i:=1 to gesamt do
    begin
    kuerzen(i);
    ListBox1.Items.Add(inttostr(results[i].metall)+':'
                      +inttostr(results[i].kristall)+':'
                      +inttostr(results[i].tritium));
    end;
end;

end.
so, ich hab ma ausprobiert ob in results[i].xxx überhaupt was drinsteht....
bei folgendem code in Button1Click kommt das richtige ergebnis:

Delphi-Quellcode:
results[i].metall:=metall;
results[i].kristall:=kristall;
results[i].tritium:=tritium;
ListBox1.Items.Add(inttostr(results[i].metall)+':'+inttostr(results[i].kristall)+':'+inttostr(results[i].tritium));

jim_raynor 29. Okt 2004 13:02

Re: kuerzen von 3 werten
 
:coder2:
Ich glaube in button1Click solltest du auch mal i erhöhen. Sonst schreibt er die Werte immer auf den ersten Eintrag und das möchtest du doch nicht, oder?
Zum dem solltest du i überhaupt mit einem Wert initsialisiern. Am besten 1.
P.S: Alles auf Button1Click bezogen!

Steve 29. Okt 2004 13:05

Re: kuerzen von 3 werten
 
hi,

results wird nicht initialisiert! ;)

Gruß
Stephan :dance:

glkgereon 29. Okt 2004 13:34

Re: kuerzen von 3 werten
 
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

ich musste in Button1Click i durch gesamt ersetzen ARGHHHHH


aba jetzt funzt es...

danke für den hinweis.. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

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