![]() |
While schleife endlos? oder nicht?
hey leute,
wir sollen in der Berufsschule ein "LottoProgramm" schreiben. Ich bin in der Stunde nicht fertig geworden und hab es Zuhause neu geschrieben. Später habe ich meinen Lehrer gefragt wieso mein Programm "hängt" (mir war klar das es an den Endlosschleife hing, allerdings hab ich die den logichen fehler nicht gefunden). Anschließend hab ich Algorithmus neu geschrieben. natürlich anders :) und nun Funktioniert das Programm ohne Probleme. Ich weiß nicht wieso weil es eigentlich beim ersten durchlaufen der schleife eine endlosschleife ergeben müsste.
Delphi-Quellcode:
Das Array "Feld" beinhaltet die ersten 6 Zahlen die die Funktion random ausgibt (sie legen zwischen 0 und 48). Die erste Zahl war immer eine 6. Somit würde ja die IF Bedingung nicht erfüllt und er durchläuft die schleife erneut mit der ersten Zahl in dem Array (welche ja 6 wäre). Somit wäre ja wieder eine endlosschleife entstanden. Allerdings funktioniert das programm so einmandfrei :?:
procedure TForm1.BtnGroClick(Sender: TObject);
var x,a,i,zahl:Integer; begin x:=0; a:=0; zahl:=0; while x<=5 do begin If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; x:=x+1 end; Label1.Caption:=inttostr(zahl); end; ALso dachte ich mir (bevor ich das Programm geteste habe), das doch ein ELSE noch benötigt wird fals die bedingung nicht erfüllt ist (Schließlich will ich alle 6 Werte die im Array stehen vergleichen) Also hab ich ein else geschrieben.
Delphi-Quellcode:
So hat er es mir erst garnicht von der Syntax her angenommen, also habe ich es mit begin und end versucht, ohne erfolg. Nun hatte ich das Programm so ausgeführt und es hatte funktioniert ohne Endlosschleife.
procedure TForm1.BtnGroClick(Sender: TObject);
var x,a,i,zahl:Integer; begin x:=0; a:=0; zahl:=0; while x<=5 do begin If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; x:=x+1; else x:=x+1; end; Label1.Caption:=inttostr(zahl); end; Kann mir jemand erklären wo nun genau mein Denkfehler ist? Danke schonmal. LG JumpFrog
Delphi-Quellcode:
(Hier noch die procedure die die Zahlen erstellt)
procedure TForm1.BtnerzClick(Sender: TObject);
var i,a,c,LoZahl:Integer; begin a:=0; i:=0; c:=0; while i<=5 do // Schleifenbegin für 6 Ziehungen begin LoZahl:=random(48)+1; Feld[a]:=LoZahl; while c<=5 do begin while Feld[a]= LoZahl do LoZahl:=random(48)+1; c:=c+1; end; a:=a+1; i:=i+1; end; end; |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
ohne jetzt auf die Logik des Programms einzugehen, mir schein, dass Du Probleme mit der Formatierung des Quelltextes hast. Versuche Deine Anweisungen in Begin/End - Blöcke zu setzen. Bis bald Chemiker |
Re: While schleife endlos? oder nicht?
Zitat:
Delphi-Quellcode:
wie du siehst, bleiben beide Seiten der Bedingung gleich (also ungleich :) ), der index des arrays wird erst nach verlassen der while-schleife gesetzt.
while x<=5 do
begin If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; x:=x+1 end; HTH Frank |
Re: While schleife endlos? oder nicht?
nihms mir nicht übel....
aber...
Delphi-Quellcode:
Wenn das die While schleife ist
while x<=5 do
begin If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; x:=x+1 end; müsste hier
Delphi-Quellcode:
stehen damit es ausserhalb der schleife ist oder nicht?
while x<=5 do
begin If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; end; x:=x+1; |
Re: While schleife endlos? oder nicht?
Hallo,
Da gebe ich Chemiker recht, ich habe mal hier eine Stück Code von dir kopiert, schau mal,
Delphi-Quellcode:
Wenn man den Code nimmt, wird im Fall von , das if nicht gleich ist, nur die Zeile zahl:= zahl+1 ausgelassen, die anderen Zeilen werden immer ausgeführt.
begin
If Feld[a]>=10 then zahl:=zahl+1; a:=a+1; x:=x+1; else Der Code sollte also lauten...
Delphi-Quellcode:
Bedenke bitte auch, das das 'end' vor dem else, nicht mit einem ';' abgeschlossen wird.
begin
If Feld[a]>=10 then begin zahl:=zahl+1; a:=a+1; x:=x+1 end else Gruß Jens |
Re: While schleife endlos? oder nicht?
Sorry,habe jetzt erst gesehen, was du vorhast. Wenn du die While-Schleife betrachtest, hast Du recht. Ich testen es mal.
Gruß Jens
Delphi-Quellcode:
[EDIT] Recht schon, aber der Fehler ist trotzallem durch die fehlenden Blöcke
begin
Delphi-Quellcode:
aufgetreten.
begin
... ... ... end [EDIT]
Delphi-Quellcode:
end.
|
Re: While schleife endlos? oder nicht?
ahhh jetzt das bedeutete das immer nur die erste Zeile nach dem If zu der IF bedingung gehört. versteh ich das richtig?
|
Re: While schleife endlos? oder nicht?
Hi!
Das hast du richtig erkannt! Ciao, Frederic |
Re: While schleife endlos? oder nicht?
Das mit der if-Abfrage siehst du richtig. Deshalb, setzt am besten immer begin und end, damit ist für jeden eindeutig, was zusammen gehören soll.
Gruß Jens |
Re: While schleife endlos? oder nicht?
wie schön das unser Lehrer das uns mal gesagt hat :)
Delphi-Quellcode:
So sieht mein Quelltext jetzt aus. Und wie sollte es anders sein es Funktioniert nicht. Mich wundert es schon das die erste Zahl von der funktion random nicht 6 sondern diesmal 1 ist. Jedenfalls ist die ausgabe 0 obwoll es Zahlen gibt über 10. Dabei habe ich nur das else angefügt :) . Von der Logik her müsste es ja stimmen. Weil sonst ja eine endlosschleife enstehen würde(ohne das ELSE).
procedure TForm1.BtnGroClick(Sender: TObject);
var x,a,i,zahl:Integer; begin x:=0; a:=0; zahl:=0; while x<=5 do begin If Feld[a]>=10 then begin zahl:=zahl+1; a:=a+1; x:=x+1; end else x:=x+1; end; Label1.Caption:=inttostr(zahl); end; Also wo is nun wieder mein Fehler... :wall: @Jens: Ja, habe ich gemacht allerdings mit else und es hat nicht funktioniert, also habe ich das alles wieder weggenommen :wall: |
Re: While schleife endlos? oder nicht?
Zitat:
Gruß Frank |
Re: While schleife endlos? oder nicht?
Zeig mal den rest von deine Code.
In der While Schleife passiert folgendes...
Delphi-Quellcode:
Ist also soweit OK. Bist du sicher das Feld[a] in dieser Zeit größer 10 ist.
procedure TForm1.BtnGroClick(Sender: TObject);
var x,a,i,zahl:Integer; begin x:=0; a:=0; zahl:=0; while x<=5 do //solang x <= 5 wird die Schleife ausgführt begin If Feld[a]>=10 then //if Abfrage auf <= 10 begin zahl:=zahl+1; //die 3 folgenden Zeilen werden ausgeführt, wenn if = true a:=a+1; x:=x+1; end else begin x:=x+1; // immer noch Schleif als x+1 wenn nicht if = true. end; end; Label1.Caption:=inttostr(zahl); end; Gruß Jens |
Re: While schleife endlos? oder nicht?
bevor wir weiter rumrätseln...
das einfachste wäre, das programm zu starten und bei der Endlosschleife mit dem Debugger anzuhalten...dann siehst wo der momentane Ausführungspunkt ist... evtl kannst du auch mal den kompletten code veröffentlichen. Gruß Frank |
Re: While schleife endlos? oder nicht?
Delphi-Quellcode:
So da habt ihr den gesammten code.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) BtnInz: TButton; Btnerz: TButton; BtnEnde: TButton; BtnAnz: TButton; BtnGro: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; ListBox1: TListBox; Label1: TLabel; procedure BtnEndeClick(Sender: TObject); procedure BtnInzClick(Sender: TObject); procedure BtnerzClick(Sender: TObject); procedure BtnAnzClick(Sender: TObject); procedure BtnGroClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Feld: array[0..5] of integer; implementation {$R *.dfm} procedure TForm1.BtnAnzClick(Sender: TObject); var i:integer; begin for i := 0 to 5 do begin Edit1.Text:=inttostr(Feld[0]); Edit2.Text:=inttostr(Feld[1]); Edit3.Text:=inttostr(Feld[2]); Edit4.Text:=inttostr(Feld[3]); Edit5.Text:=inttostr(Feld[4]); Edit6.Text:=inttostr(Feld[5]); end; end; procedure TForm1.BtnEndeClick(Sender: TObject); begin close; end; procedure TForm1.BtnerzClick(Sender: TObject); var i,a,c,LoZahl:Integer; begin a:=0; i:=0; c:=0; while i<=5 do // Schleifenbegin für 6 Ziehungen begin LoZahl:=random(48)+1; Feld[a]:=LoZahl; ListBox1.Items.Add(floattostr(Feld[a])); while c<=5 do begin while Feld[a]= LoZahl do LoZahl:=random(48)+1; c:=c+1; end; a:=a+1; i:=i+1; end; end; procedure TForm1.BtnGroClick(Sender: TObject); var x,a,i,zahl:Integer; begin x:=0; a:=0; zahl:=0; while x<=5 do begin If Feld[a]>=10 then begin zahl:=zahl+1; a:=a+1; x:=x+1; end else x:=x+1; end; Label1.Caption:=inttostr(zahl); end; procedure TForm1.BtnInzClick(Sender: TObject); begin edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit6.Clear; end; end. |
Re: While schleife endlos? oder nicht?
Liste der Anhänge anzeigen (Anzahl: 1)
meinte zwar alle code-dateien (also auch die projektdatei und das formular),
aber ich habs jetzt mal zusammengebastelt, hab aber noch keine endlosschleife provozieren können. bei welcher konstellation kommt diese denn in welcher methode? Gruß Frank |
Re: While schleife endlos? oder nicht?
achso meinstest du das sorry...
um eine endlosschleife geht es gerade nicht ;) sondern um die ausgabe der anzahl der zahlen die größer sind als 10 schau dir dein programm an und erzeuge zahlen, lass se anzeigen und dann schaun welche größer sind als 10 du wirst sehen deine aussageb wird 0 sein. Was ja eigentlich nicht stimmt. |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
ich hatte dein Code erstmal nur überflogen, aber ein paar Sachen möchte ich noch anmerken:
Ansonsten wie gesagt einfach mal Debuggen! MfG xZise |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
Delphi-Quellcode:
welchen Sinn soll hier die For-Schleife ergeben?
procedure TForm1.BtnAnzClick(Sender: TObject);
var i:integer; begin for i := 0 to 5 do begin Edit1.Text:=inttostr(Feld[0]); Edit2.Text:=inttostr(Feld[1]); Edit3.Text:=inttostr(Feld[2]); Edit4.Text:=inttostr(Feld[3]); Edit5.Text:=inttostr(Feld[4]); Edit6.Text:=inttostr(Feld[5]); end; end; Bis bald Chemiker |
Re: While schleife endlos? oder nicht?
tja zum glück hatten wir das Debuggen schon dran in der schule ;) *ironie off*
Stimmt, ich könnte "x:=x+1" auch ausserhalb der If bedinung schreiben, darauf bin ich noch nicht gekommen ;) das c ist für die vorangegangenen While schleife. Damit das keine entlosschleife wird. Mit For habe ich es schon versucht und nicht auf anhieb hinbekommen, also dachte ich mich versuch ich es so und später nochmal mit for ;) @ Chemiker: Danke das du mich darauf aufmerksam machst, is mir garnicht aufgefallen. Das is natürlich Quatsch dort. k.A. wieso das dort steht :) mit RANDOMIZE hab ich noch keine erfahrung ( weil ich es noch nicht verstanden habe), ich will auch erstmal eine funktionierende Version und dann andere Methoden der Problemlösung versuchen. |
Re: While schleife endlos? oder nicht?
Liste der Anhänge anzeigen (Anzahl: 1)
der Zählfehler kommt daher, dass du zwar bis 5 gehst, aber den index nirgends nutzt.
hier mal bisschen gekürzt...a und i brauchst nicht.
Delphi-Quellcode:
Guß Frank
procedure TForm1.BtnGroClick(Sender: TObject);
var x,zahl:Integer; begin x:=0; zahl:=0; while x<=5 do begin If Feld[x]>=10 then zahl:=zahl+1; x:=x+1; end; Label1.Caption:=inttostr(zahl); end; |
Re: While schleife endlos? oder nicht?
Ist jetzt vielleicht nicht so wichtig, aber
Delphi-Quellcode:
gibt nur 48 Zahlen. (1-48 )
random(48)+1;
|
Re: While schleife endlos? oder nicht?
Zitat:
Gruß Frank |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
randomize musst Du nicht verstehen nur mit F1 die Funktionsweise nachsehen. Des Weiteren macht es sich gut Variable mit einem definierten Zustand einzusetzen.
Delphi-Quellcode:
Bis bald Chemiker
procedure TfrmLotto.FormCreate(Sender: TObject);
var i: integer; begin randomize; for I := 0 to high(Feld) do begin Feld[i]:= 0; end; end; |
Re: While schleife endlos? oder nicht?
Also Lotto geht ja laut meines wissens (Bin kein Lottospieler) bis 49 und da random aber bei 0 anfängt und es keine 0 gibt addiere ich zu der erzeugten zahl einfach 1 dazu.
Ok, verstehen war falsch Formuliert, ich meine nicht wie es funktioniert sondern eben den aufbau der Syntax verstehen und das habe ich im moment noch nicht. :duck: auf jedenfall Funktioniert jetzt das Programm richtig. Wieso weiß ich noch nicht genau aber ich werde es mir nochmal anschauen. So etwas macht se bestimmt gut :) nur leider muss so ein Wissen ersteinmal vorhanden sein um es anzuwenden. Ich bin ja in einer Ausbildung zum IT-Systemelektroniker, da gehört programmieren nunmal nicht zum a und o :) aber danke das für das Beispiel :) |
Re: While schleife endlos? oder nicht?
Zitat:
@JumpFrog Random(x) gibt x-Anzahl Zahlen, beginnend bei 0... bei Random(48 ) gibt es 48 Zahlen, beginnend bei 0 (also 0-47). Bei +1 also nur 1-48. |
Re: While schleife endlos? oder nicht?
Zitat:
Gruß Frank |
Re: While schleife endlos? oder nicht?
achso :?: :?:
ich dachte Immer das sei der bereich aus dem er die Zahlen generieren soll. Also ist das nur die angabe der Anzahl der Zahlen die er ziehen soll oder wie darf ich das verstehen? :gruebel: :gruebel: Bin gerade ein wenig verwirrt, weil mein Programm keine Zahlen höher als 48 anzeigt. :gruebel: :gruebel: |
Re: While schleife endlos? oder nicht?
Zitat:
|
Re: While schleife endlos? oder nicht?
Ist wohl wegen der 1 Frage-Regel OT, aber dafür ein neuer Thread wäre fast übertrieben?
Zitat:
Random(x) Zufallszahl mit Bedingung 0 <= ? < X oder x-Zufallszahlen beginnend bei 0 oder Zufallszahlen 0 bis (x - 1) Such Dir eine Erklärung aus, die Du Dir am besten merken kannst. Die mittlere hat sich bei mir festgesetzt. |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
normalerweise sind die Lottozahlen bei dem Lotto, beidem ich mitspiele immer verschieden.
Delphi-Quellcode:
Diese beiden Schleifen werden doch nur einmal durchlaufen und anschließend steht c auf 6.
while c<=5 do
begin while Feld[a]= LoZahl do LoZahl:=random(48)+1; c:=c+1; end; Bis bald Chemiker |
Re: While schleife endlos? oder nicht?
der arme JumpFrog...wir finden mehr Fehler als ihm lieb ist.
einen hab ich noch: er vergleicht immer nur das aktuelle feld mit der aktuellen Zufallszahl.es sind also doppelte werte möglich. ich denke mal, er versucht mit der inneren schleife dies zu verhindern. dazu müsste er aber feld[c] mit loZahl vergleichen und auch nur bis a (=aktuelle position) die schleife laufen lassen. natürlich c zurücksetzen, was Chemiker schon angedeutet hat ;) oder das gleich mit for-schleifen machen... @frog:schau dir mal den algo an, der ist auch für deinen Zweck verwendbar: ![]() Gruß Frank |
Re: While schleife endlos? oder nicht?
Hallo JumpFrog,
Delphi-Quellcode:
Mal eine andere Version.
procedure TfrmLotto.btMeineVersionClick(Sender: TObject);
var i, intTip: integer; LottoArr: Array[1..49] of Boolean; begin for I := 1 to high(LottoArr) do begin LottoArr[i]:= FALSE; end; for I := 1 to 6 do begin repeat intTip:= Random(49)+1; until not LottoArr[intTip]; LottoArr[intTip]:= TRUE; end; for I := 1 to high(LottoArr) do begin if LottoArr[i] then // Der Index i ist die Lottozahl begin ListBox1.Items.Add(inttostr(i)); end; end; end; Bis bald Chemiker |
Re: While schleife endlos? oder nicht?
Zitat:
Naja ich bin nunmal ein Ass im Programmieren. Ich merke nur wieviel mist wir hier in der Berufsschule beigebracht bekommen :( eigentlich traurig. Ich werde mir den Quelltext den ihr mir gegeben habt anschauen, aber im ersten Moment seh ich da nicht durch :) Bin gerade in der Berufsschule, falls ich es schaffe werde ich die Lösung vom Lehrer mal Posten. LG JumpFrog |
Re: While schleife endlos? oder nicht?
der code, den ich angehängt hatte war doch deiner nur bisschen verändert ;)
Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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 by Thomas Breitkreuz