Autor Beitrag
A_Checker
Hält's aus hier
Beiträge: 14



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

ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am So 28.02.2010 um 17:45
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 28.02.10 19:29 
es soll ein Zahlen intervall sein. Deine Hilfe versteh ich leider nicht so ganz :s
bole
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Mo 01.03.10 10:58 
Hallo,
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 01.03.10 17:28 
Ich habs jetzt so:
ausblenden 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 user profile iconNarses: 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: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mo 01.03.10 17:42 
user profile iconA_Checker hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 01.03.10 18:00 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 01.03.10 19:53 
user profile iconSvenAbeln 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 user profile iconSvenAbeln vor mir geschrieben hat, hast Du ja gerade vorher listbox1.Clear; gemacht - also kann da nichts ausgelesen werden.
A_Checker Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



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

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 01.03.10 20:37 
Das klingt mir nach etwa einem solchen Lösungsansatz:
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:
var Zufallszahl1,Zufallszahl2,anzahlDurchlaeufe,hoechstwert: integer;
    zufallszahl_2_IstDran,geschafft:bool;
begin
hoechstwert:={hier darfst Du Deinen Höchstwert hinschreiben};
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: Di 02.03.10 11:56 
Ich verstehe die Aufgabe eher so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var x, n, y, : integer;
begin
  x:=0;   // Zufalszahl
  y:=0;   // letzte Zufallszahl
  n:=50;  // Obergrenze

  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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 02.03.10 14:13 
user profile iconA_Checker hat folgendes geschrieben Zum zitierten Posting springen:

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).

user profile iconbole hat folgendes geschrieben Zum zitierten Posting springen:
Ich verstehe die Aufgabe eher so:
ausblenden 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. ;)