Frage zu while-Schleife

Status
Für weitere Antworten geschlossen.
T

Trekkii

Gast
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
 
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.
 
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.
 
Wenn "gefunden" = true ist, wird die Schleife nicht mehr durchgeführt.
 
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 :/
 
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
 
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.
 
@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
 
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.
 
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
Für weitere Antworten geschlossen.

Ähnliche Themen

B
Antworten
8
Aufrufe
1.447
Bizepsbenny
B
Antworten
13
Aufrufe
5.476
Antworten
7
Aufrufe
3.542
R
Zurück
Oben