Napisać działający kod, w którym...:
w dedykowanym zadaniu odbywają się czasochłonne obliczenia numeryczne polegające (najogólniej mówiąc) na wyznaczaniu coraz lepszego przybliżenia poszukiwanej wartości. Niestety dokładne wyznaczenie tej wartości trwałoby nieskończenie długo, więc w jakimś momencie obliczenia te trzeba w końcu przerwać i zadowolić się ostatnio wyznaczoną liczbą.
Należy zatem zaimplementować obiekt (może task, może protected?) udostępniający następujące procedury (/wejścia?):
Start_Calc(Init_Value: in Integer);
--rozpoczyna wykonywanie obliczen (dla podanej wartosci poczatkowej)
Get_Result(The_Result: out Integer);
--wymusza przerwanie obliczen. Parametr odbiera wynik obliczen
tak, aby w programie głównym następujące wywołania spowodowały odpowiednio: rozpoczęcie wykonywania obliczeń (podany parametr ustawia wartość początkowego przybliżenia poszukiwanej wartości) oraz wymuszenie przerwania obliczeń i odebranie wyznaczonej wartości:
C.Start_Calc(123); -- uruchomienie obliczen numerycznych
C.Get_Result(V); -- TERAZ potrzebny jest wynik. Przerwij obliczenia i daj, co masz.
Dodatkowe wymaganie na ocenę powyżej 3: nie wolno ingerować w ciało pętli wykonującej obliczenia (innymi słowy: między loop i end loop mają znaleźć się tylko te dwie linijki umieszczone w kodzie poniżej). Przerywanie wykonywania obliczeń trzeba wtedy zrobić jakoś poza ciałem pętli...
Rozwiązanie ma się znaleźć w katalogu nazwanym od swojego nazwiska. Niech w katalogu tym będą również wszystkie dodatkowe, wykorzystywane moduły.
W rozwiązaniu warto/należy oprzeć się na poniższym kodzie (tzn. kod ten uzupełnić, i/lub zmodyfikować...) :
with Ada.Text_IO; use Ada.Text_IO; -- + ew. inne pomocne moduly ...??...
procedure tresc is
--stosowne definicje typow zadaniowych i/lub chronionych, w tym:
... type Calculator is
--gdzies wewnatrz musi znalezc sie niniejsza petla, ktora wykonuje
--(symuluje wykonywanie) owe zlozone obliczenia numeryczne
--{parametr w Start_Calc ustala poczatkowa wartosc zmiennej Wynik_Obliczen}
loop
delay 0.0001; -- symuluje czas wykonywania obliczen
Wynik_Obliczen := (Wynik_Obliczen + 1) mod 123456; --"obliczenia"
end loop;
--... i w jakis sposob na sygnal Get_Result petla ta ma byc przerwana,
--a wartosc zmiennej Wynik_Obliczen ma byc zwrocona na zewnatrz
--program glowny:
C: Calculator; --'obiekt' odpowiadajacy za wykonanie obliczen
V: Integer;
begin
C.Start_Calc(123); -- uruchomienie obliczen numerycznych
delay 1.234; -- czas wyczekiwania. Obliczenia trwaja...
C.Get_Result(V); -- TERAZ potrzebny jest wynik. Przerwij obliczenia i daj, co masz.
Put_Line("Wynik obliczen: " & Integer'Image(V)); --wyswietlenie wyniku
end tresc;