Frage zu while-Schleife

Status
Es sind keine weiteren Antworten möglich.
T

Trekkii

Gast
#1
Das folgende Programm stellt fest, ob ein Suchwert in einem Feld von bis zu 100 integer Zahlen vorkommt:

HTML:
program FeldSucheA (input, output);
{ stellt fest, ob ein Suchwert in einem Feld
* von bis zu 100 integer-Zahlen vorkommt }

  const
  MAX = 100;
  MAXPLUS1 = 101;
  
  type
  tIndex = 1..MAX;
  tZahlenfeld = array [tIndex] of integer;
  tIndexPlus1 = 1..MAXPLUS1;
  
  var
  Feld : tZahlenFeld;
  Groesse,
  Suchwert : integer;
  i : tIndexPlus1;
  gefunden : boolean;
  
begin
  { Eingabe der Feldgroesse solnage, bis eine 
  * Feldgroesse zwischen 1 und MAX eingegeben wird. }
  repeat
    write ('Anzahl Werte (max. ', MAX, '): ');
    readln (Groesse)
  until (1 <= Groesse) and (Groesse <= MAX);
  
  { Eingabe des Zahlenfelds und des Suchwerts }
  for i := 1 to Groesse do
  begin
    write (i, '. Wert: ');
    readln (Feld[i]);
  end;
  write ('Suchwert: ');
  readln (Suchwert);
  
  {Prüfen des gesamten Feldes bis zum Sucherfolg oder
  * bis zum letzten eingelesenen Wert }
  gefunden := false; 
  i := 1;
  while (i <= Groesse) and (not gefunden) do
    if Feld[i] = Suchwert then
      gefunden := true
    else
      i := i + 1;
  { Ende der while Schleife }
  {Falls Groesse = MAX ist und Suchwert nicht gefunden
  * wird, gilt nach Verlassen der while-Schleife
  * i := MAXPLUS1. Daher obige Deklaration für i. }
  if gefunden then
    writeln ('Der Wert steht an Position ', i, '.')
  else
    writeln ('Der Wert kommt nicht vor.')
end. { FeldSucheA }
Hallo zusammen,

meine Frage: Warum steht in Zeile 42 in der 2.Bedingung der while-Schleife (not gefunden) ?

Das ist mir irgendwie noch nicht verständlich.

LG
 

Raybeez

Lt. Junior Grade
Dabei seit
Dez. 2006
Beiträge
359
#2
Die Schleife läuft das komplette Feld durch (i <= Groesse) aber nur, bis es einen Treffer gibt (not gefunden). Denn sobald es einen Treffer gibt wird gefunden in Zeile 44 auf true gesetzt und die Schleife wird nicht noch einmal durchlaufen.
 
Dabei seit
Juni 2009
Beiträge
563
#3
Die 2. Bedingung ändert nichts am Ergebnis, verkürzt aber die Laufzeit des Programms.
Es ist ja nicht notwendig weiter nach der Zahl zu suchen, wenn sie bereits gefunden wurde.
 

Axxid

Rear Admiral
Dabei seit
Feb. 2012
Beiträge
5.798
#4
Wenn "gefunden" = true ist, wird die Schleife nicht mehr durchgeführt.
 

fuchen

Lt. Junior Grade
Dabei seit
Nov. 2004
Beiträge
295
#5
Kurz mal überflogen
"gefunden" ist die Variable, die in der while-Schleife auf "true" gesetzt wird, wenn der Wert gefunden wurde.
In der while-Schleife wird i immer um 1 erhöht und geprüft, ob die Zahl bereits gefunden wurde (gefunden = true).
Die while-Schleife wird dann beendet, wenn gefunden = true (und sorgt dafür, dass nicht der Rest auch noch durchgesucht wird

EDIT: huch - viel zu langsam :/
 
T

Trekkii

Gast
#8
Hallo zusammen,

danke für die vielen Antworten! :)

Zur Info: Die Sprache ist Pascal.

Was mir aber immer noch nicht einleuchtet ist folgendes:

In Zeile 40 wird die Variable als "false " initialisiert. In der 2.Schleifenbedingung (Zeile 42) gilt aber (not false) und das ist ja "true".

Also sind die Schleifenbedingungen: (i <= Groesse) und (true).

Aber wenn die Variable VOR der while Schleife als "false" initialisiert ist, dann ist die 2. Schleifenbedingung doch gar nicht erfüllt oder? Somit dürfte die while Schleife doch gar nicht starten ?

LG
 
Dabei seit
Juni 2006
Beiträge
2.932
#9
Die wird halt vor der While Schleife auf "false" initialisiert. Falls z.B. in einem vorherigen Lauf das Ergebnis schon mal "true" war.

Edit: das "not gefunden" ist dann gültig, wenn die Variable auf "False" steht.
 
T

Trekkii

Gast
#11
@JesterFox

Klar, und wenn in der while-Schleife gefunden := true, dann ist (not gefunden) = false und die Schleife bricht ab...

Also muss ein boolean immer "true" sein, um eine Schleifenbedingung zu erfüllen?

Gruß
BB
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
35.236
#12
Es hängt von der Schleife ab ob true oder false für ein weiterlaufen der Schleife erwartet wird. Die while Schleife benutzt eine Lauf-Bedingung, braucht also true. Bei until und for sind es Abbruchbedingungen, die müssen false sein damit die Schleife läuft.
 
Dabei seit
Juni 2009
Beiträge
563
#14
Jesterfox, eine For-Schleife muss auch wahr sein.
for i=1; i<10;i++{} läuft solange bis i den Wert 10 annimmt.

Am besten kann man es sich eigentlich mit der deutschen Übersetzung der Begriffe merken:
While: Solange... Mache solange die Bedingung erfüllt ist folgendes...
Until: Bis... Mache BIS Bedingung erfüllt ist folgendes...
 
Status
Es sind keine weiteren Antworten möglich.
Top