While loop stopt niet

Status
Niet open voor verdere reacties.

Singha

Gebruiker
Lid geworden
21 nov 2015
Berichten
5
Hallo,

Ik ben net begonnen met programmeren via PSD en dan vertalen naar Pascal, en ik zit vast omdat de While loop niet stopt.
Tenminste, hij stopt wel, maar niet wanneer ik dat zogezegd vraag. En het ontbreekt mij aan ervaring om te zien wat ik waar net fout plaats.

Bedoeling is: als de invoer een '=' teken is, dan moet hij stoppen, zoniet, moet hij om de beurt een getal vragen en dan een bewerking.
Maar wat hij doet is nadat ik als bewerking '=' ingeef, vraagt hij toch nog een tweede getal en dan pas stopt hij.

In bijlage stuur ik de bestandjes mee (zowel PSD als, .pas), van alles wat ik al geprobeerd heb, werkt deze het 'best'.

Ik zou graag een uitleg over het probleem hebben en niet zozeer een pasklare oplossing, want ik wil het zelf snappen.

Alvast bedankt,
Singha
 

Bijlagen

  • Rekenmachine.zip
    1,2 KB · Weergaven: 72
Laatst bewerkt:
Wat er gebeurt is logisch omdat na ingave van het = teken direct de volledige behandeling volgt.
Het teken wordt ingelezen bij: readln(bewerking);
Op dat moment is de While instructie niet aan de beurt voor de controle.

Zet direct onder die regel eens dit:
If bewerking = '=' Then Break;
 
Laatst bewerkt:
Hartelijk bedankt voor uw antwoord.

Helaas werkt het niet: syntax error, DO expected, THEN found...

Als ik de DO BEGIN laat staan en de if bewerking ergens anders toevoeg, dan stopt hij direct met de lus, ook al geef ik een ander char in dan '='.

Als het voor jou helpt om de hele opgave te zien voor het programma, dan post ik die even?

Thx!!
 
Post hem eens zoals je hem nu hebt, dus waar die syntax error in optreedt. Ik heb echter geen Pascal compiler dus kan het niet testen.
 
Laatst bewerkt:
Dit is 'm
 

Bijlagen

  • RekenmachineSyntax.zip
    538 bytes · Weergaven: 56
Daar heb je dus niet gedaan wat ik zei. Wat ik zei was dit: (Zie rode regel)
Code:
{ (Generated by Structorizer) }
program Rekenmachine;

{ TODO declare your variables here }
   var eersteGetal, tweedeGetal, uitkomst: real;
  var bewerking: char;
begin

  writeln('geef een eerste getal in');
  readln(eersteGetal);
  while (bewerking <> '=') do
  begin
    writeln('geef een bewerking in, +, -,* of /.');
    readln(bewerking);
    [COLOR="#FF0000"]if bewerking = '=' then break;[/COLOR]
    writeln('geef een tweede getal in');
    readln(tweedeGetal);
    case (bewerking) of
      '+':
        begin
          uitkomst := eersteGetal + tweedeGetal;
        end;
      '-':
        begin
          uitkomst := eersteGetal - tweedeGetal;
        end;
      '*':
        begin
          uitkomst := eersteGetal * tweedeGetal;
        end;
      else
        if (tweedeGetal = 0) then
        begin
          writeln('deling door 0 gaat niet, geef een ander getal in');
          readln(tweedeGetal);
        end;
        uitkomst := eersteGetal / tweedeGetal;
    end;
    uitkomst := eersteGetal;
  end;
  writeln('De uitkomst van uw bewerking( en ) : ',uitkomst:0:2, '.');
  writeln('');
  writeln('druk < ENTER > om te stoppen.');
  Readln;
end.

De opdracht break; zorgt ervoor dat de loop wordt verlaten.
In plaats van break; kan je ook exit; gebruiken.
Dan stopt het programma helemaal.
 
Laatst bewerkt:
Ok sorry, inderdaad, nu werkt het wel.

Ik vraag me nu af welk nut de voorwaarde bij while dan heeft, als je de voorwaarde toch nog eens moet schrijven?
Of is het gewoon slecht geschreven om te beginnen?
Had ik de bewerking al een keer moeten vragen vragen vóór de while loop en dan op het einde van loop nog eens?

Ik snap het niet omdat in de cursus niet wordt uitgelegd wanneer je je voorwaarde precies moet inlezen. En ook maken ze geen melding van wat jij me nu zegt 'then break' toevoegen.

Bedankt nogmaals en alvast voor je hulp!!!
 
Die While loop zorgt er alleen voor dat hij constant dezelfde dingen uitvoert.
Je kan daar nu bijvoorbeeld ook while 1 = 1 do zetten.

Overigens ken ik de Pascal taal verder niet, maar dit lijkt een aardige referentie site:
http://www.tutorialspoint.com/pascal/
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan