Autor |
Beitrag |
A_Checker
Hält's aus hier
Beiträge: 14
|
Verfasst: So 28.02.10 18:42
Hey Leute,
ich hab bin blutiger Anfänger im Programmieren von Delphi und soll jetzt ein Programm erstellen, das in einer Listbox zahlen ausgibt im intervall I(1;n), wobei n eingegeben werden kann, bist die letzte Zahl kleiner als die davor ist.
so weit bin ich schon gekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var i, x, n, anz: integer;
begin
n:= strtoint(edit1.Text); listbox1.Clear; randomize; repeat x := random(n) + 1; until x<i
anz := ListBox1.Items.Count; label2.caption := anz + ' Zufallszahlen';
end;
end. |
Wie sage ich ihm jetzt, dass i, die zahl vor der kleineren ist?
lg
Moderiert von Christian S.: Delphi-Tags hinzugefügtModeriert von Christian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am So 28.02.2010 um 17:45
|
|
Sylvus
      
Beiträge: 195
|
Verfasst: So 28.02.10 18:52
drücke dich mal bitte exakter aus
Intervall: Ist das ein Timer, also ein Zeitintervall oder ein Zahlenintervall?
Auf jeden Fall, musst du die letzte Zahl immer in einer Variable speichern.
Also in Pseudocode:
1. Setzte alte Zahl auf die aktuelle Zahl
2. Erzeuge eine neue aktuelle Zahl
3. gebe die neue Zahl aus, wenn sie kleiner als die alte ist und beginne bei 1)
Wenns nicht klappt, melde dich nochmal, dann helfe ich auch gerne detaillierter
P.S.
Listbox1.Items.Add(inttostr(X)); falls du den Befehl nicht kennst 
|
|
A_Checker 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 28.02.10 19:29
es soll ein Zahlen intervall sein. Deine Hilfe versteh ich leider nicht so ganz :s
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: So 28.02.10 20:50
Vielleicht bin ich zu blöd, aber ich verstehe immer noch nicht genau was Dein Programm machen soll...
Kannst Du das bitte nochmals genau erklären. Praktisch wäre wohl auch ein Beispiel (Eingabe / Ausgabe).
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
Sylvus
      
Beiträge: 195
|
Verfasst: So 28.02.10 21:08
wie schon geschrieben
Also dein Ansatz ist ja richtig:
Generiere solange neue Zahlen bis die aktuelle grad eben generierte Zahl kleiner als die davor erzeugte ist.
Außerdem gebe die Zahl aus!
also:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| while (I<X) do begin I:=X; X:=Random(N); Listbox1.Items.Add(X); end; |
versuchs mal so 
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: So 28.02.10 21:14
Beachte aber das Du I und X korrekt initialisierst (I<X) sonst kommst Du gar nie in die While Schleife...
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Mo 01.03.10 10:58
Hallo,
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var i,n: Integer; begin n := 5; for i := 1 to n-1 do lst1.AddItem(IntToStr(i),nil); end; |
ist der Code dafür. Wobei lst1 die Listbox ist.
|
|
A_Checker 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 01.03.10 17:28
Ich habs jetzt so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var x, v, n, anz: integer; var i: string;
begin
n:= strtoint(edit1.Text); listbox1.Clear; v:= Listbox1.items.count -1; i := ListBox1.Items.Strings[v]; randomize; repeat x := random(n) + 1; until x<=strtoint(i);
anz := ListBox1.Items.Count; label2.caption := inttostr(anz) + ' Zufallszahlen';
end;
end. |
aber es funktioniert trotzdem irgendwie nicht...:S
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 01.03.10 17:37
auch du darfst gerne den [delphi][/delphi]-Tag verwenden um deinen Quelltext zu markieren. Der ist nicht nur "älteren" usern vorbehalten.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mo 01.03.10 17:42
|
|
A_Checker 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 01.03.10 18:00
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var x, n, i, anz: integer; var v : string;
begin n:= strtoint(edit1.Text); listbox1.Clear; randomize; repeat v := Listbox1.Items.Strings[i]; i := Listbox1.items.count -1; x := random(n) + 1; until x<strtoint(v); Listbox1.Items.add(inttostr(x));
anz := ListBox1.Items.Count; label3.caption := inttostr(anz) + ' Zufallszahlen';
end;
end. |
so weit so gut. das programm lässt sich auch öffnen. Gibt man aber iene zahl ein erscheint folgendes:
Im Projekt Projekt2.exe ist eine Exception der Klasse EStringListError aufgetreten. Meldung: 'Listindex überschreitet das Maximum (o)'. Prozess wurde angehalten. Mit Einzlne Anweisungen oder Start fortsetzen.
dann makiert er mir die zeil : v := Listbox1.Items.Strings[i];
mit einem grünen pfeil und blau makiert.
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Mo 01.03.10 18:49
Du hast gleich mehrere Fehler, die beim ersten Schleifendurchlauf zu einem Fehler in dieser Zeile führen:
v := Listbox1.Items.Strings[i];
- i ist undefiniert
- Deine Listbox ist Leer, du kannst also auch nichts auslesen
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 01.03.10 19:53
SvenAbeln hat folgendes geschrieben: | i ist undefiniert
|
Ja, solange Du der Variable zu Anfang nicht irgendwie einen bestimmten Wert zuweist, kann sie 2348^7 (einfach mal ausgedachte Zahl) oder so sein.
Damit kann es ja keinen angesprochenen Index geben.
Und wie es SvenAbeln vor mir geschrieben hat, hast Du ja gerade vorher listbox1.Clear; gemacht - also kann da nichts ausgelesen werden.
|
|
A_Checker 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 01.03.10 20:09
aber i soll ja die Position sein, an der sich die zahl befindet, die größer sein soll, damit das programm aufhört zu laufen.
Ich schick euch noch mal die ganze Aufgabenstellung:
Aufgabe 2
Nach Eingabe einer Zahl bildet dieses Programm so lange Zufallszahlen aus dem Intervall
I = [ 1 ; n ], bis die zuletzt gebildete Zufallszahl kleiner als die vorherige ist - in diesem
Falle bricht die Zahlenreihe, die also mit Ausnahme der letzten Zahl monoton wachsend
ist, ab. Das Programm weist sämtliche Zufallszahlen in einer ListBox aus und gibt auch
die Anzahl der insgesamt gebildeten Zufalls zahlen an (vgl. Skizze 2 auf der folgenden
Seite).
|
|
A_Checker 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 01.03.10 20:35
habe den Fehler gefunden. musste eine for schleife setzten, weil er den ersten wert ja nicht kannte also -1 z.b und da ist er dann abgestürzt.
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: 27: 28: 29: 30:
| var x, n, i, anz: integer; var v : string; var runde1 : boolean;
begin
listbox1.items.Clear; n:= strtoint(edit1.Text); runde1:=true; randomize;
repeat if runde1=true then begin v:='0'; runde1:=false; end else begin i := Listbox1.items.count; v := Listbox1.Items.Strings[i-1]; end; x := random(n) + 1; Listbox1.Items.add(inttostr(x)); until x<=strtoint(v);
anz := ListBox1.Items.Count; label3.caption := inttostr(anz) + ' Zufallszahlen';
end;
end. |
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 01.03.10 20:37
Das klingt mir nach etwa einem solchen Lösungsansatz:
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:
| var Zufallszahl1,Zufallszahl2,anzahlDurchlaeufe,hoechstwert: integer; zufallszahl_2_IstDran,geschafft:bool; begin hoechstwert:=; randomize(); Zufallszahl1:=random(hoechstwert) zufallszahl_2_IstDran:=true; geschafft:=false; while not geschafft do begin anzahlDurchlaeufe:=anzahlDurchlaeufe+1; if zufallszahl_2_IstDran then begin Zufallszahl2:=random(hoechstwert); end else begin Zufallszahl1:=random(hoechstwert); end; if ((not zufallszahl_2_IstDran)and(Zufallszahl1<Zufallszahl2)) or ((zufallszahl_2_IstDran)and(Zufallszahl1>Zufallszahl2)) then geschafft:=true; end; end; |
Ich hoffe, dass ich nichts falsches geschrieben habe und dass Du da durchsteigst...
...und natürlich, dass ich Dein Problem überhaut richtig verstanden habe.
Das ist leider nicht so einfach, da durchzusteigen, was genau Du möchtest.
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Di 02.03.10 11:56
Ich verstehe die Aufgabe eher so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var x, n, y, : integer; begin x:=0; y:=0; n:=50; randomize; listbox1.clear;
repeat y:=x; x := random(n) + 1; Listbox1.Items.add(inttostr(x)); until x<=y |
Was aber genau erwartet wird kann vielleicht A_Checker sagen. Eventuell wäre ,wie ich schon früher geschrieben habe, ein Bsp des erwarteten Outputs hilfreich....
nicht getestet da ich hier kein delphi zur verfügung habe.
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 02.03.10 14:13
|
|