Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pascal for loops within repeat loops

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!

like image 663
Chunky1318 Avatar asked Jun 10 '11 00:06

Chunky1318


People also ask

How do you use a repeat loop in Pascal?

For example, repeat sum := sum + number; number := number - 2; until number = 0; Notice that the conditional expression appears at the end of the loop, so the statement(s) in the loop execute once before the condition is tested.

What is nested loop Pascal?

PASCAL - NESTED LOOPS. Pascal allows using one loop inside another loop. Following section shows few examples to illustrate the concept. The syntax for a nested for-do loop statement in Pascal is as follows − for variable1:=initial_value1 to [downto] final_value1 do.

How do you break out of a loop in Pascal?

When the break statement is encountered inside a loop, the loop is immediately terminated and program control resumes at the next statement following the loop. It can be used to terminate a case in the case statement (covered in the next chapter).

What is the effect of using Repeat until and do while blocks in the code?

The repeat / until loop is a loop that executes a block of statements repeatedly, until a given condition evaluates to true . The condition will be re-evaluated at the end of each iteration of the loop, allowing code inside the loop to affect the condition in order to terminate it.


1 Answers

The code you have written makes no sense.

  1. To exit the for loop when you find your guess, add a break below the guessed := true.

  2. 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.

  3. It would be great if you showed the var declarations so we can see your types.

Your code would make sense again if:

  1. You break from the for loop.
  2. You only need to do the While loop if you do something variant in each case, such as ask the user to input some new input.

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;
like image 163
Warren P Avatar answered Oct 01 '22 02:10

Warren P