Reputation: 113
you've all been so helpful so far, so heres another annoying problem for you!
I've got a basic word guessing game, written in Pascal for a console in Delphi 7, where the guesses (right or wrong) are stored in a fixed array named "guesses" now what i need to do is test to see if they have guessed that letter already. I have the following code...
Write ('Guess a letter: '); Readln (guess); Guess := UpCase(Guess); repeat for i := 1 to 20 do begin if guess = guesses[i] then begin guessed := true; end else begin guessed := false; end; end; until (guessed = true) or (i = 20) ;
My problem is it follows the for loop 20 times, and should end as it is the first letter and is not in the "guesses" array, but keeps repeating. after its looped the for loop 20 times and found no entry of the guess letter, it should exit with the boolean "guessed" as false.
Thanks in advance for your help!
Upvotes: 5
Views: 2897
Reputation: 68872
The code you have written makes no sense.
To exit the for loop when you find your guess, add a break
below the guessed := true.
Why are you repeating the same logic infinitely using one condition that will always be true, and one condition that might easily be never true? I'm guessing you've shown part of your code inside that repeat loop, and not all of it. In that case, a good convention on stackoverflow for code samples is to put in something like: do_something_here();
in the place where you really have 100 more lines you didn't want to show here.
It would be great if you showed the var declarations so we can see your types.
Your code would make sense again if:
here's some code that does something at least useful:
(1) it will ask you to enter something, and repeat until you enter something that matches an element in the hard coded list.
(2) It will terminate, given certain inputs from you, unlike your code which may never terminate. It also doesn't waste time in the for loop on the other elements once it finds a match.
(3) It shows trivially that you should validate the inputs, or you will have exceptions. What if you entered nothing and just hit enter in your code? You would get an endless loop.
procedure Demo;
var
guess:Char;
guesses:Array of Char;
i: Integer;
guessed:Boolean;
begin
repeat
setup_guesses(guesses); // not shown
Write ('Guess a letter: ');
Readln (guess);
Guess := UpCase(Guess);
if (Ord(Guess)>='A') and (Ord(Guess)<='Z') then begin
guessed := false;
for i := Low(guesses) to High(Guesses) do // why hard code 1..20???
begin
if guess = guesses[i] then
begin
guessed := true;
break;
end;
end;
end;
until (guessed = true);
if guessed then
WriteLn('An element in guesses matched your input')
else
WriteLn('No element in guesses array matches your input')
end;
Upvotes: 9
Reputation: 436
My problem is it follows the for loop 20 times, and should end as it is the first letter and is not in the "guesses" array, but keeps repeating. after its looped the for loop 20 times and found no entry of the guess letter, it should exit with the boolean "guessed" as false.
You can not use loop variable I outside for loop:
Pascal For Loop
Design Choices: Loop var must be an ordinal type of usual scope
After normal termination, loop var is undefined
The loop var cannot be changed in the loop
The loop parameters can be changed, but they are evaluated just once, so it does not affect loop control
http://courses.cs.vt.edu/~cs3304/Spring00/notes/Chapter-7/tsld026.htm
Upvotes: 7