Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Collatz Verfahren


kulka1 - Mi 02.09.09 19:56
Titel: Collatz Verfahren
hallo leute,

ich muss eine hausaufgabe erledigen und bräuchte eure hilfe.
die aufgabenstellung lautet so:

1. beginne mit einer natürlichen zahl n
2. ist n gerade,so nimm für n als nächstes n/2,sonst 3n+1
3. falls n>1 gehe zu schritt 2

also ich muss ja irgendwie herausfinden ob die zahl gerade bzw ungerade ist.
und das alles, also die ganzen zahlen sollen in einem Memo dargestellt sein.

die zahl soll in einem edit feld eingegeben werden und der button darf natürlich nicht fehlen.

ich hoffe ihr könnt mir weiterhelfen, für euch müsste das ja ein kinderspiel sein^^... oder? :P

mfg kulka

p.s.: mein lehrer hat dazu collatz verfahren gesagt^^


Martok - Mi 02.09.09 20:03

Und, wo ist das Problem?

Konkrete Fragen beantworten wir gerne... wenn sie denn gestellt werden und Eigeninitiative erkennbar ist.

Ansonsten ist das die falsche Sparte, Jobs sind nebenan.


kulka1 - Mi 02.09.09 20:06

ich hoffe das ich hier im richtigen bereich ist, ist ja eigtl auch ne normale frage:

wie kriege ich heraus das die eingegebene zahl gerade oder ungerade ist,

ja und wenn die dann halt gerade ist soll die immer durch 2 geteilt werden, und diese zahlen sollen dann in der MEMO angezeigt werden,

in der memo soll angezeigt werden: z.B.: 16 -> 16,8,4,2,1


elundril - Mi 02.09.09 20:12

mit mod bekommst du den rest einer ganzzahlendivision ;) und gerade heißt das es durch 2 ohne rest teilbar ist. ;)

lg elundril


kulka1 - Mi 02.09.09 20:13

mhm, und wie krieg ich das dann in einer "if" klausel rein, also wie man das genau schreibt?

und wenn ich das dann habe, wie bekomme ich die ergebnisse in das MEMO dingen ...

sorry für diese dummen fragen^^


elundril - Mi 02.09.09 20:31

formulieren wir es gemeinsam:


Quelltext
1:
2:
3:
4:
5:
6:
7:
WÄHREND Zahl > 1 MACHE
  WENN Rest von Zahl dividiert 2 gleich 0 DANN
    Zahl soll die Zahl durch 2 sein;
  ANDERNFALLS
    Zahl soll (zahl mal 3) plus 1 sein;
  Gib Zahl aus;
fertig mit Während;


na, jetzt sollte es aber gehen oder? Du musst dir es einfach immer so überlegen, wie du es beschreiben würdest ;)


lg elundril


kulka1 - Mi 02.09.09 21:16

hab da jetzt was geschrieben, aber das stimmt irgendwie vorne und hinten nicht^^, könnt ihr mal bitte drüber gucken? =)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,ergebnis : Integer;
begin
a := StrToInt(Edit1.Text);

  while a = 4 do
  begin
    b := a div 2;
    if b = 0 then
    ergebnis := a div 2
    else

      begin
      ergebnis := (a*3)+1;
      end;
    Memo1.Text := IntToStr(ergebnis);
  end;
end;


Xentar - Mi 02.09.09 21:43

Du weist a innerhalb der Schleife niemals einen neuen Wert zu - wie soll die Schleife dann jemals beendet werden?
Wie kommst du eigentlich auf die Bedingung a = 4 ??? Das heißt doch, dass die Schleife nur ausgeführt wird, wenn man in das Edit Feld eine 4 eintippt. Die Collatz Vermutung besagt doch, dass man immer bei 1 rauskommt, egal mit welcher Zahl man anfängt.
http://de.wikipedia.org/wiki/Collatz-Problem


kulka1 - Mi 02.09.09 21:48

ups, das mit der 4 war ein versehen xD ...

ich hatte vorher was anderes da stehen, aber das ist jetzt egal, ich hab es hingekriegt ;)

trotzdem danke =)


kulka1 - Mi 16.09.09 21:12


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var a,i : Integer;
    s : string;
begin
  Memo1.Clear;
  a := strtoint(edit1.text);

  Memo1.Lines.Add(inttostr(a));

  while (a<>1and (a<>5and (a<>17do
    begin

    if a mod 2 = 0 then
      a := a div 2
    else
      a := a*3-1;

   Memo1.Lines.Add(inttostr(a));
  end;

end;


wenn ich zb ins edit feld eine 16 eingebe, dann erscheinen 5 zahlen, bei 17 nur 1 ...

ich habe das programm mal beigelegt, wie kann ich neben

16
8
4
2
1

jeweils die nr anzeigen lassen, also so:

5 - 16
4 - 8
3 - 4
2 - 2
1 - 1

wäre nett wenn ihr mir das sagen könntet^^


Xentar - Mi 16.09.09 21:53

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
jeweils die nr anzeigen lassen, also so:

5 - 16
4 - 8
3 - 4
2 - 2
1 - 1

Dafür müsstest du im voraus wissen, wie viele Schritte es gibt -> geht nicht.
Du kannst jedoch aufwärts zählen.
Dafür brauchst du ne Zählvariable, die du in der Schleife erhöhst, und fügst dann im Memo IntToStr(i) + ' - ' + IntToStr(a) ein.

Außerdem: die reine exe nützt uns nichts. Um den Fehler zu finden, wäre es wesentlich leichter, wenn du das Projekt hochlädst.

Da dies aber ein leichter Fehler ist, frage ich dich einfach mal: Wie zum Teufel komsmt du auf die Abbruchbedingung while (a<>1and (a<>5and (a<>17do
Da ist doch klar, dass der bei 17 nur einen Schritt macht - weil der die schleife gar nich durchläuft.

Ich verweise nochmal auf meinen vorherigen Post.. Lies dir durch, wie der Algorithmus funktioniert!


kulka1 - Mi 16.09.09 22:01

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Da dies aber ein leichter Fehler ist, frage ich dich einfach mal: Wie zum Teufel komsmt du auf die Abbruchbedingung while (a<>1and (a<>5and (a<>17do
Da ist doch klar, dass der bei 17 nur einen Schritt macht - weil der die schleife gar nich durchläuft.

Ich verweise nochmal auf meinen vorherigen Post.. Lies dir durch, wie der Algorithmus funktioniert!

versteh das bitte jetzt nicht falsch^^

unser lehrer will das :D, weil würde man and (a<>5and (a<>17) nicht hinzufügen, dann würde das programm wegen dem 3*a-1 abschmieren ;)

hatte die exe hinzugefügt, damit ihr sehen könnt wie viele zahlen das sind, aber wurscht^^, ich probiere es mal mit der laufvariable ;)

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.


Xentar - Mi 16.09.09 22:04

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
unser lehrer will das :D, weil würde man and (a<>5and (a<>17) nicht hinzufügen, dann würde das programm wegen dem 3*a-1 abschmieren ;)


Hä? Wieso sollte das abschmieren? Ich denke mal, damit meinst du, dass das Programm in eine Endlosschleife gerät, und nicht mehr reagiert.
Aber genau DAS sagt doch die Collatz Vermutung: Dass am Ende IMMMER 1 rauskommt (ist auch bewiesen bis kA wieviel Millionen).

Ich schau mir das grad mal kurz an.

Edit:

Delphi-Quelltext
1:
      a := a*3-1;                    

Da ist der Fehler - finden darfst du ihn selber.
Dann klappt es auch mit der "echten" Abbruchbedingung.


kulka1 - Mi 16.09.09 22:07

ja genau wegen der endlosschleife, aber dann lässt sich ncihts mehr machen, ausser das programm zurückzusetzen, jedenfalls war es bei mir immer der fall^^


Xentar - Mi 16.09.09 22:07

Ach du warst zu schnell ;)
Siehe mein Edit oben.


kulka1 - Mi 16.09.09 22:12

a := a*3-1;

ich habe es einmal in

b := a*3-1; gemacht, das ergebnis ist, wenn ich 17 eingebe kommen lauter 50

a := (a*3)-1;, das programm schmiert nicht ab, aber es läuft immer weiter,


oder was meinst du genau?


Xentar - Mi 16.09.09 22:17

Ne ne, hat nix mit den Variablen zu tun.
Vergleich das mal mit der Originalformel, aus deinem ersten Post.