Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - vorherige zahl größer listbox
A_Checker - So 28.02.10 18:42
Titel: vorherige zahl größer listbox
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 - 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 - So 28.02.10 19:29
es soll ein Zahlen intervall sein. Deine Hilfe versteh ich leider nicht so ganz :s
bole - 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
Sylvus - 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 - 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...
martin300 - 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 - 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 - 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
Marc. - Mo 01.03.10 17:42
A_Checker hat folgendes geschrieben : |
Ich habs jetzt so: aber es funktioniert trotzdem irgendwie nicht...:S |
"Funktioniert irgendwie nicht" ist defitinitv
keine ausreichende Fehlerbeschreibung! Was funktioniert nicht? Wo taucht der Fehler auf? Welche Fehlermeldungen erscheinen? :mahn:
Delphi-Quelltext
6: 7: 8:
| { ... } listbox1.Clear; v:= Listbox1.items.count -1; i := ListBox1.Items.Strings[v]; |
Du entfernst alle(!) Einträge der LB, um daraufhin die Anzahl dieser festzustellen und auf ein absolut nicht existentes Item zuzugreifen. Sauber! :? :think:
Delphi-Quelltext
8: 9: 10: 11:
| { ... } randomize; repeat x := random(n) + 1; until x<=strtoint(i); |
Randomize gehört einmal aufgerufen. Am besten beim Programmstart, da es den Pseudo-Zufallsgenerator über die Zeit initialisiert.
Zu Zeile 9-11: Würfele solange, bis [n] kleiner [n-1] ist. Welchen Zweck hat das ganze? :roll:
A_Checker - 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 - 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 - 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 - 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 - 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 - 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 - 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.
Marc. - Di 02.03.10 14:13
A_Checker hat folgendes geschrieben : |
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). |
bole hat folgendes geschrieben : |
Ich verstehe die Aufgabe eher so: Delphi-Quelltext 1: 2: 3: 4:
| y:=x; x := random(n) + 1; Listbox1.Items.add(inttostr(x)); until x<=y | |
:zustimm: So habe ich die Aufgabenstellung ebenfalls verstanden. Es geht allerdings auch eleganter, aber das überlassen wir wohl besser dem Threadersteller, der sonst gar keine Arbeit mehr hat. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!