Witam! Podobny temat był już na forum http://4programmers.net/Forum/viewtopic.php?id=61458 i zastosowałem (chyba) taki samo sposób, jak rozwiązanie tam podane. Jednakże mój program zapętla się po podaniu innej wartości niż liczba rzeczywista:
WITH Ada.Text_IO;
USE Ada.Text_IO;
WITH Ada.Float_Text_IO;
USE Ada.Float_Text_IO;
WITH Ada.IO_Exceptions;
USE Ada.IO_Exceptions;
PROCEDURE Rownanie IS
--program pobiera od uzytkownika dwa rownania postaci Ax+By+C=0 i Dx+Ey+F=0
--po czym metoda macierzowa sprawdza ilosc rozwiazan
--i ewentualnie wypisuje rozwiazania jednoznaczne
Wsp_A1,
Wsp_B1,
Wsp_C1,
Wsp_A2,
Wsp_B2,
Wsp_C2 : Float := 0.0;
Wyroznik,
Rozw1,
Rozw2,
Det1,
Det2 : Float;
Koniec : Boolean := False;
PROCEDURE Petla_Programu IS
BEGIN
WHILE Koniec = False LOOP
BEGIN
Put("Do wykonania programu koniecznie jest wprowadzenie dwoch rownan liniowych postaci Ax+By+C=0 i Dx+Ey+F=0");
New_Line;
--wczytanie danych do rownan
Put("Podaj wspolczynnik przy x dla pierwszego rownania: ");
Get(Wsp_A1);
Put("Podaj wspolczynnik przy y dla pierwszego rownania: ");
Get(Wsp_B1);
Put("Podaj wyraz wolny dla pierwszego rownania: ");
Get(Wsp_C1);
Put("Podaj wspolczynnik przy x dla drugiego rownania: ");
Get(Wsp_A2);
Put("Podaj wspolczynnik przy y dla drugiego rownania: ");
Get(Wsp_B2);
Put("Podaj wyraz wolny dla drugiego rownania: ");
Get(Wsp_C2);
New_Line(2);
Put("Pierwsze rownananie ma postac: ");
--zilustrowanie postaci rownań (wypisanie ich na standardowe urzadzenie wyjsciowe):
Put(Wsp_A1,1,1,0);
Put("x");
IF Wsp_B1> 0.0 THEN
Put("+");
END IF;
Put(Wsp_B1,1,1,0);
Put("y");
IF Wsp_C1>0.0 THEN
Put("+");
END IF;
Put(Wsp_C1,1,1,0);
Put("=0.0");
New_Line(2);
Put("Drugie rownanie ma postac: ");
Put(Wsp_A2,1,1,0);
Put("x");
IF Wsp_B2> 0.0 THEN
Put("+");
END IF;
Put(Wsp_B2,1,1,0);
Put("y");
IF Wsp_C2>0.0 THEN
Put("+");
END IF;
Put(Wsp_C2,1,1,0);
Put("=0.0");
New_Line(2);
--obliczenie wyznacznika macierzy kwadratowej
Wyroznik:=Wsp_A1*Wsp_B2-Wsp_B1*Wsp_A2;
IF Wyroznik /= 0.0 THEN
--obliczenie wyznacznikow macierzy powstalych po podstawieniu kolumny wyrazow wolnych w odpowiednie kolumny
Det1:=(-Wsp_C1)*Wsp_B2-Wsp_B1*(-Wsp_C2);
Det2:=Wsp_A1*(-Wsp_C2)-(-Wsp_C1)*Wsp_A2;
--obliczenie rozwiazan
Rozw1:=Det1/Wyroznik;
Rozw2:=Det2/Wyroznik;
Put("Poniewaz wyznacznik jest rowny: ");
Put(Wyroznik,2,3,3);
New_Line;
Put("Rozwiazaniami rownania sa x rowne ");
Put(Rozw1);
Put(" i y rowne ");
Put(Rozw2);
ELSE
Put("Rownanie nie ma rozwiazan jednoznacznych");
END IF;
Koniec:=True;
--obsluga bledow:
EXCEPTION
WHEN Constraint_Error=>
Put("Podales liczby o zbyt duzych lub zbyt malych wartosciach");
WHEN Ada.IO_Exceptions.Data_Error=>
Put("Wprowadziles niepoprawne dane");
New_Line;
Put("Nastapi zakonczenie programu");
WHEN OTHERS=>
Put("Wystapil nieznany blad i nastapi zakonczenie programu");
END;
END LOOP;
END Petla_Programu;
BEGIN
Petla_Programu;
END Rownanie;
Czy można w Ada 95 jakoś wyczyścić bufor klawiatury? Czy może trzeba jakiś inny "myk" zastosować? Bo chyba to jest powodem zapętlania się programu. Z góry dziękuję za pomoc.