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

  1. Napisać program sterujący ruchem pacjentów oczekujących na prześwietlenie RTG. Dane pacjenta: nazwiskoimię, data urodzenia, płeć. Założenia programu:

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.

  1. 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:

    1. rozdzielenie wspólnej kolejki pacjentów na dwie kolejki: kobiet i mężczyzn;

    2. 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.

  1. Uzupełnić program z poprzedniego punktu procedury lub funkcje wykonujące następujące operacje:

    1. wyznaczenie liczby kobiet i mężczyzn w kolejce;

    2. znalezienie osób: najstarszej i najmłodszej;

    3. zapisanie zawartości kolejki głównej do pliku o nazwie pacjenci.dat;

    4. umożliwienie pobrania danych z pliku o nazwie pacjenci.dat, umieszczenia ich w kolejce i ew. dodania na koniec kolejki nowych pacjentów;

    5. 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