Wątek przeniesiony 2014-11-19 19:59 z Inne języki programowania przez Ktos.

Pętla nie działa tak jak bym oczekiwał

0

Witam, a więc uczę się pascala.. dotychczas nie trafiałem na żadne problemy.. Lecz dziś pisząc podstawowy kalkulator z możliwością cofania się do menu . "Powtórz".
Napisałem już menu i opcję dodawania i odejmowania.
Gdy wybiorę dodawanie, to wszystko działa. Lecz potem, gdy wybiorę opcję powrotu do menu wyboru, program kontynuuje i przechodzi do odejmowania..

Mógłby ktoś mi podpowiedzieć co robię nie tak ?

program kalkulator;
uses
  crt;
var
  a:integer;
  q:real; { dodawanie }
  w:real; { odejmowanie }
  e:real; { mnozenie }
  r:integer; { dzielenie }
  x:real;
  y:real;
  powtorz: boolean;
  znak:char;
begin
  clrscr;
  powtorz:= True;
  writeln('Witam w kalkulatorze!');
  writeln;
  while Powtorz do begin
    writeln('1) Dodawanie');
    writeln('2) Odejmnowanie');
    writeln('3) Mnozenie');
    writeln('4) Dzielenie');
    write('Wybierz dzialanie i nacisnij [ENTER]: ');
    readln(a);
    clrscr;
    if a=1 then
    begin
      writeln('WYBRANO DODAWANIE');
      write('Prosze podac pierwsza liczbe: ');
      readln(x);
      write('Prosze podac druga liczbe: ');
      readln(y);
      q:=x+y;
      writeln('Wynik dodawania to:' ,q: 2:0);
    end;
    writeln('Aby zmienic wybor dzialania nacisnij t/T ');
    readln(znak);
    clrscr;
    writeln('Nacisnij dwa razy [ENTER]');
    writeln;

    if (znak='t') or (znak='n') then
      Powtorz := True;

    if a=2 then
      writeln('Wybrano odejmowanie!');
    write('Prosze podac pierwsza liczbe: ');
    readln(x);
    write('Prosze podac druga liczbe: ');
    readln(y);
    w:=x-y;
    writeln('Wynik odejmowania to: ' ,w);
    repeat until keypressed;
  end;
end. 
0

Niestety nie ja układam program nauczania :v
Jakbym mógł się czegoś uczyć to na pewno nie tego..

0

Tak na szybko:

  1. Nie masz begin i end w if a=2...
  2. Ja bym ten warunek if a=2... wstawił po warunku if a=1...
  3. Po co ci to repeat until key pressed?
  4. Nie rozumiem do końca o co chodzi z tym t/n - o co chodzi z T to wiem, ale co ma się dziać po tym jak wcisnę n?
  5. Nie wiem też po co było to 2x enter, ale podejrzewam, że to repeat until key pressed wymusiło na tobie to, żebyś to dodał.

Jakoś tak bym to widział (nie kompilowałem tego, bo nie mam tp):

program kalkulator;
uses
  crt;
var
  a:integer;
  q:real; { dodawanie }
  w:real; { odejmowanie }
  e:real; { mnozenie }
  r:integer; { dzielenie }
  x:real;
  y:real;
  powtorz: boolean;
  znak:char;
begin
  clrscr;
  powtorz:= True;
  writeln('Witam w kalkulatorze!');
  writeln;
  while Powtorz do begin
    writeln('1) Dodawanie');
    writeln('2) Odejmnowanie');
    writeln('3) Mnozenie');
    writeln('4) Dzielenie');
    write('Wybierz dzialanie i nacisnij [ENTER]: ');
    readln(a);
    clrscr;

    if a=1 then
    begin
      writeln('WYBRANO DODAWANIE');
      write('Prosze podac pierwsza liczbe: ');
      readln(x);
      write('Prosze podac druga liczbe: ');
      readln(y);
      q:=x+y;
      writeln('Wynik dodawania to:' ,q: 2:0);
    end

ELSE 
    if a=2 then
BEGIN
      writeln('Wybrano odejmowanie!');
    write('Prosze podac pierwsza liczbe: ');
    readln(x);
    write('Prosze podac druga liczbe: ');
    readln(y);
    w:=x-y;
    writeln('Wynik odejmowania to: ' ,w);
END;

    writeln('Aby zmienic wybor dzialania nacisnij t/T ');
    readln(znak);
    clrscr;
    {writeln('Nacisnij dwa razy [ENTER]');
    writeln;}
 
    if (znak='t') or (znak='n') then
      Powtorz := True;
 

    {repeat until keypressed;}
  end;
end. 
1

@Pacc2k12 - zastanów się jeszcze raz nad tym programem i najlepiej napisz go od początku; Za każdym razem główna pętla ma wyświetlać menu (uprzednio czyszcząc ekran konsoli) i oczekiwać na klawisz; Następnie po wybraniu opcji czyścić ekran, wyświetlać informację o podaniu liczb, obliczyć wynik, wyświetlić go i zapytać czy wrócić do menu; Jeśli użytkownik poda znak t lub T to pętla musi być wykonana od początku;

Zmienna Powtorz nie jest Ci potrzebna, bo główna pętla może bazować na sprawdzaniu literki ze zmiennej znak; Poza tym powinieneś wykorzystać pętlę Repeat, dlatego że za każdym razem pętla musi być wykonana co najmniej raz; No i pamiętaj o tym, żeby najpierw sprawdzić którą opcję wybrał użytkownik i obsłużyć odpowiednią, a prośba o potwierdzenie powrotu do menu była zaimplementowana na samym końcu głównej pętli;

Czyli coś w tym stylu:

var
  Opcja: Integer;
  Powrot: Char;
begin
  repeat
    { wyświetlenie głównego menu }

    { pobranie numeru opcji }
    ReadLn(Opcja);

    case Opcja of
      1: begin
           { obsługa dodawania }
         end;
      2: begin
           { obsługa odejmowania }
         end;
      3: begin
           { obsługa mnożenia }
         end;
      4: begin
           { obsługa dzielenia }
         end;
    end;

    { zapytanie o powrót do menu }

    { pobranie znaku 't' lub 'T' }
    Powrot := UpCase(ReadKey());

    { jeśli znak to nie jest litera T - zakończ pętlę i cały program }
  until Powrot <> 'T';
end.

Tyle że zamień komentarze na kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1