Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi While schleife endlos? oder nicht? (https://www.delphipraxis.net/132063-while-schleife-endlos-oder-nicht.html)

JumpFrog 5. Apr 2009 14:55


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:
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;
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 :?:

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

Kann mir jemand erklären wo nun genau mein Denkfehler ist?

Danke schonmal.

LG JumpFrog

Delphi-Quellcode:
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;
(Hier noch die procedure die die Zahlen erstellt)

Chemiker 5. Apr 2009 15:06

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

_frank_ 5. Apr 2009 15:07

Re: While schleife endlos? oder nicht?
 
Zitat:

Zitat von JumpFrog
Ich weiß nicht wieso weil es eigentlich beim ersten durchlaufen der schleife eine endlosschleife ergeben müsste.

Delphi-Quellcode:
...
while x<=5 do
begin
  If Feld[a]>=10 then
      zahl:=zahl+1;
      a:=a+1;
      x:=x+1
end;
...

deine Einrückung ist falsch :) wenn du sie richtig machst, wird der fehler klarer:

Delphi-Quellcode:
while x<=5 do
begin
  If Feld[a]>=10 then
      zahl:=zahl+1;
  a:=a+1;
  x:=x+1
end;
wie du siehst, bleiben beide Seiten der Bedingung gleich (also ungleich :) ), der index des arrays wird erst nach verlassen der while-schleife gesetzt.

HTH Frank

JumpFrog 5. Apr 2009 15:11

Re: While schleife endlos? oder nicht?
 
nihms mir nicht übel....

aber...

Delphi-Quellcode:
while x<=5 do
begin
  If Feld[a]>=10 then
      zahl:=zahl+1;
  a:=a+1;
  x:=x+1
end;
Wenn das die While schleife ist

müsste hier
Delphi-Quellcode:
while x<=5 do
begin
  If Feld[a]>=10 then
      zahl:=zahl+1;
  a:=a+1;
end;
x:=x+1;
stehen damit es ausserhalb der schleife ist oder nicht?

Jens Hartmann 5. Apr 2009 15:12

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:
begin
  If Feld[a]>=10 then
      zahl:=zahl+1;
      a:=a+1;
      x:=x+1;
  else
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.

Der Code sollte also lauten...

Delphi-Quellcode:
begin
  If Feld[a]>=10 then
    begin
      zahl:=zahl+1;
      a:=a+1;
      x:=x+1
    end
  else
Bedenke bitte auch, das das 'end' vor dem else, nicht mit einem ';' abgeschlossen wird.


Gruß Jens

Jens Hartmann 5. Apr 2009 15:14

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:
begin
[EDIT] Recht schon, aber der Fehler ist trotzallem durch die fehlenden Blöcke

Delphi-Quellcode:
begin
...
...
...
end
aufgetreten.
[EDIT]
Delphi-Quellcode:
 end.

JumpFrog 5. Apr 2009 15:15

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?

fkerber 5. Apr 2009 15:16

Re: While schleife endlos? oder nicht?
 
Hi!

Das hast du richtig erkannt!


Ciao, Frederic

Jens Hartmann 5. Apr 2009 15:18

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

JumpFrog 5. Apr 2009 15:24

Re: While schleife endlos? oder nicht?
 
wie schön das unser Lehrer das uns mal gesagt hat :)

Delphi-Quellcode:
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;
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).
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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz