Podstawy Informatyki - Laboratorium
Politechnika Świętokrzyska, Wydział Elektrotechniki, Automatyki i Informatyki
Turbo Pascal
Instrukcja laboratoryjna nr 11
Opracował: dr inż. Grzegorz Słoń
luty 2005 r.
Zmienne dynamiczne - kolejka dynamiczna
Napisać program sterujący ruchem pacjentów oczekujących na prześwietlenie RTG. Dane pacjenta: nazwisko, imię, data urodzenia, płeć. Założenia programu:
pacjenci są wstępnie rejestrowani w jednej wspólnej kolejce;
po zakończeniu wstępnej rejestracji, pacjenci są rozdzielani na dwie oddzielne kolejki, zależnie od płci;
po uformowaniu dwóch odrębnych kolejek pacjenci są kierowani do gabinetu RTG grupami: na zmianę 5 kobiet, następnie 5 mężczyzn, itd.;
nie może zaistnieć sytuacja, w której w jednej grupie znalazłyby się osoby różnych płci.
W charakterze materiału wyjściowego wykorzystać poniższy program:
program z11_1;
uses Crt;
type TData = record
d: 1..31;
m: 1..12;
r: integer;
end;
TPacjent = record
nazwisko,imie:string[25];
data_ur: TData;
plec: char;
end;
TWsk = ^TElement;
TElement = record
pacjent: TPacjent;
nast: TWsk;
end;
var P,K,P_k,K_k,P_m,K_m: TWsk;
{-----}
function Max_liczba_dni(miesiac:byte;rok:integer):byte;
var rok_przest: boolean;
begin
rok_przest:=false;
if ((rok mod 4= 0)and(rok mod 100<> 0))or(rok mod 400= 0) then rok_przest:=true;
case miesiac of
1,3,5,7,8,10,12: Max_liczba_dni:=31;
4,6,9,11 : Max_liczba_dni:=30;
2 : if rok_przest then Max_liczba_dni:=29
else Max_liczba_dni:=28;
end;
end;
{-----}
procedure Wprowadz_date(var x:TData; var blad:byte);
var data,pom:string[10];
dd,mm:string[2];
k1,k2:byte;
blad_liczby:integer;
begin
blad:=0;
readln(data);
k1:=Pos('.',data);
if k1=2 then dd:=copy(data,1,1)
else if k1=3 then dd:=copy(data,1,2)
else begin blad:=1; exit; end;
val(dd,x.d,blad_liczby);
if (blad_liczby<>0) then begin blad:=1; exit; end;
pom:=copy(data,k1+1,Length(data)-k1);
k2:=Pos('.',pom);
if k2=2 then mm:=copy(pom,1,1)
else if k2=3 then mm:=copy(pom,1,2)
else begin blad:=1; exit; end;
val(mm,x.m,blad_liczby);
if (blad_liczby<>0)or(not (x.m in [1..12])) then begin blad:=1; exit; end;
pom:=copy(pom,k2+1,Length(pom)-k2);
val(pom,x.r,blad_liczby);
if (blad_liczby<>0)or(x.d>Max_liczba_dni(x.m,x.r)) then begin blad:=1; exit; end;
end;
{-----}
procedure Wyswietl_date(x:TData);
var dd,mm: string[2];
begin
str(x.d,dd); if Length(dd)=1 then dd:='0'+dd;
str(x.m,mm); if Length(mm)=1 then mm:='0'+mm;
write(dd,'.',mm,'.',x.r);
end;
{-----}
procedure Wprowadz_pacjenta(var x:TPacjent);
var blad_daty: byte;
begin
with x do
begin
write('Nazwisko: '); readln(nazwisko);
write('Imie: '); readln(imie);
repeat
write('Data urodzenia (dd.mm.rrrr): '); Wprowadz_date(data_ur,blad_daty);
if blad_daty=1 then writeln('Nie ma takiej daty. Sprobuj jeszcze raz.');
until blad_daty=0;
write('Plec (K/M): ');
repeat
plec:=UpCase(ReadKey);
until plec in ['K','M'];
writeln(plec);
end;
end;
{-----}
procedure Wyswietl_pacjenta(x:TPacjent);
begin
with x do
begin
write(nazwisko,' ',imie); GoToXY(53,WhereY);
if plec='K' then write('Kobieta') else write('Mezczyzna');
GoToXY(65,WhereY); Wyswietl_date(x.data_ur);
end;
writeln;
end;
{-----}
procedure Do_kolejki(var P,K:TWsk; x:TPacjent);
var Q:TWsk;
begin
New(Q);
Q^.pacjent:=x; Q^.nast:=NIL;
if P=NIL then P:=Q
else K^.nast:=Q;
K:=Q;
end;
{-----}
Procedure Usun_z_kolejki(var P:TWsk; var x:TPacjent);
var Q:TWsk;
begin
x:=P^.pacjent;
Q:=P;
P:=P^.nast;
Dispose(Q);
end;
{-----}
procedure Zapisz_pacjentow(var P,K:TWsk);
var z: char;
x: TPacjent;
begin
P:=NIL; K:=NIL;
write('Czy chcesz wprowadzac dane? (T/N): ');
repeat
z:=UpCase(ReadKey);
until z in ['N','T'];
writeln(z);
while z='T' do
begin
writeln('Wprowadz dane pacjenta:');
Wprowadz_pacjenta(x);
Do_kolejki(P,K,x);
write('Czy wprowadzasz nastepne dane? (T/N): ');
repeat z:=UpCase(ReadKey); until z in ['N','T'];
writeln(z);
end;
end;
{-----}
procedure Wyswietl_kolejke(P:TWsk);
var x:TPacjent;
begin
while P<>NIL do
begin
Wyswietl_pacjenta(P^.pacjent);
P:=P^.nast;
end;
end;
{-----}
begin
ClrScr;
Zapisz_pacjentow(P,K);
Wyswietl_kolejke(P);
ReadKey;
end.
Program przedstawiony w punkcie 1 zawiera procedury wprowadzania danych, tworzenia wstępnej (wspólnej) kolejki pacjentów oraz wyświetlania zawartości kolejki. Uzupełnić ten program o procedury realizujące następujące działania:
rozdzielenie wspólnej kolejki pacjentów na dwie kolejki: kobiet i mężczyzn;
wyświetlanie kolejnych, 5-o osobowych, grup pacjentów do prześwietlenia (na przemian kobiet i mężczyzn);
Działanie ww. procedur powinno jednocześnie powodować zwalnianie pamięci zajętej przez już niepotrzebne dane.
Uzupełnić program z poprzedniego punktu procedury lub funkcje wykonujące następujące operacje:
wyznaczenie liczby kobiet i mężczyzn w kolejce;
znalezienie osób: najstarszej i najmłodszej;
zapisanie zawartości kolejki głównej do pliku o nazwie pacjenci.dat;
umożliwienie pobrania danych z pliku o nazwie pacjenci.dat, umieszczenia ich w kolejce i ew. dodania na koniec kolejki nowych pacjentów;
znalezienie w kolejce osób o podanym nazwisku i wyświetlenie ich danych na ekranie
(w przypadku braku takich osób powinien się pojawić stosowny komunikat).
str. 2/3 Turbo Pascal - Instrukcja nr 11
Turbo Pascal - Instrukcja nr 11 str. 3/3