Wątek przeniesiony 2016-01-18 18:49 z Delphi i Pascal przez furious programming.

Pętla repeat unitil nie działa poprawnie

0

Cześć, "klepie" właśnie programik w Pascalu i na samym końcu chciałem, aby program pytał o powtórzenie obliczeń dla innych danych. Wrzuciłem więc pętlę repeat until, ale niestety pętla nie wykonuje się poprawnie.

program project1;
{$N+,E-}
uses dos, Crt;
type vector = array [0..20] of Extended;
var i, it, mit, n, st : Integer;
    xw                 : Double;
    pyt                : Char;
    eps, w, x          : Extended;
    a                  : vector;
    plik               : text;
{$I D:\MetNum\NWTROOTS.PAS}
begin
  ClrScr;
  Assign(plik, 'Wynik.txt');
  Rewrite(plik);
  repeat
  ClrScr;
  Writeln(plik, 'Dla danych: ');
  close(plik);
  ClrScr;
  Writeln ('* Newtonroots test *');
  Writeln;
  Write ('n (<=20 due to the definition of type "vector") = ');
  Readln (n);
  for i:=0 to n do
    begin
      Write ('a[', i, '] = ');
      Readln (a[i]);
      Append(plik);
      Writeln(plik, 'a', i, ' = ', a[i]:5:3);
      Close(plik);
    end;
  Write ('x = ');
  Readln (xw);
  x  := xw;
  Write ('mit = ');
  Readln (mit);
  Write ('eps = ');
  Readln (eps);
  Writeln ('Newtonroots (n, a, x, mit, eps, w, it, st) = ',
           Newtonroots (n, a, x, mit, eps, w, it, st));
  Writeln ('w = ', w, '   it = ', it, '   st = ', st);
  Append(plik);
  Writeln(plik, 'n = ', n,'  ', 'mit = ', mit, '  ', 'x = ', xw:2:2, '  ', 'eps = ', eps:3:2);
  Writeln(plik, 'Wynik wynosi : ');
  Writeln(plik, 'w = ', w, '   it = ', it, '   st = ', st);
  Close(plik);
  Writeln('Czy chcesz obliczyc pierwiastek metoda Newtona dla innych danych?');
  Writeln('Y = Tak, N = Nie');
  Readln(pyt);
  until (pyt=chr(78));
  Readln
end.

Pascala nie używałem już kilka lat, ale chyba jest dobrze. Dlaczego więc program "olewa" repeat until? Mimo, że pyt nie jest równe N program przechodzi dalej.

0

Masz mały przykład, ale z funkcją ReadKey, aby nie trzeba było walić w Enter:

uses
  Crt;
const
  CHAR_EXIT = Char('E');
var
  chrRepeat: Char;
begin
  repeat
    ClrScr();
    Write('Type "', CHAR_EXIT, '" to exit: ');
    chrRepeat := UpCase(ReadKey());
  until chrRepeat = CHAR_EXIT;
end.

Dodatkowo funkcja UpCase załatwia sprawę wielkości liter; Ewentualnie krótsza wersja, bez zmiennej:

uses
  Crt;
const
  CHAR_EXIT = Char('E');
begin
  repeat
    ClrScr();
    Write('Type "', CHAR_EXIT, '" to exit: ');
  until UpCase(ReadKey()) = CHAR_EXIT;
end.

W przyszłości wątki dotyczące podstaw języka zakładaj w dziale Newbie, gdzie ten wątek przenoszę.

0

Mimo wszystko nie działa. Przy drugim sposobie wciśnięcie czegokolwiek poza e wywala program a wciśnięcie e wychodzi z pętli.

2

Wywala program, bo zamyka po raz drugi zamkniety plik?

0

@Kuba_Pascal - najpierw sprawdź czy plik istnieje i jeśli nie, utwórz go i otwórz za pomocą Rewrite, a jeśli istnieje - otwórz go w trybie dopisywania, czyli za pomocą Append; Przy okazji - wszystko rób wewnątrz pętli;

PS: Opis problemu to także wklejenie dokładnej treści błędu; "wywala program" kompletnie nic nie tłumaczy;
PPS: Pobierz Lazarusa i pisz w Pascalu jak człowiek.

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