Podstawy Informatyki - Laboratorium
Politechnika Świętokrzyska, Wydział Elektrotechniki, Automatyki i Informatyki
Turbo Pascal
Instrukcja laboratoryjna nr 12
Opracował: dr inż. Grzegorz Słoń
marzec 2005 r.
Zmienne dynamiczne - lista dynamiczna (dwukierunkowa)
Napisać program sortujący alfabetycznie listę kandydatów na studia. Dane o pojedynczej osobie powinny zawierać: Nazwisko i Imię, Datę urodzenia, Kierunek studiów. Program powinien sortować listę rosnąco wg daty urodzenia.
W charakterze materiału wyjściowego wykorzystać poniższy program:
uses Crt,Dos;
type TNazwa = string[50];
TStudent = record
naz_im:TNazwa;
data_ur: DateTime;
kier: TNazwa;
end;
TWsk = ^TElement;
TElement = record
student: TStudent;
prev, next: TWsk;
end;
var P,K: TWsk;
{-----}
procedure Wprowadz_studenta(var x:TStudent);
begin
with x do
begin
write('Nazwisko i imie: '); readln(naz_im);
write('Data urodzenia: ');
with data_ur do readln(day,month,year);
write('Kierunek studiow: '); readln(kier);
end;
end;
{-----}
procedure Pokaz_studenta(x:TStudent);
begin
with x do
begin
write(naz_im); GoToXY(52,WhereY);
with data_ur do write(day:2,'.',month:2,'.',year:4);
GoToXY(63,WhereY); writeln(kier);
end;
end;
{-----}
function Miejsce_wstawienia(P:TWsk; x:TStudent):TWsk;
var d1,d2:longint;
begin
PackTime(x.data_ur,d1);
PackTime(P^.student.data_ur,d2);
while (P<>NIL) and (d2<d1) do
begin
P:=P^.next;
if P<>NIL then PackTime(P^.student.data_ur,d2);
end;
Miejsce_wstawienia:=P;
end;
{-----}
procedure Dodaj_do_listy(var P,K:TWsk; x:TStudent);
var Q,W:TWsk;
begin
New(Q);
Q^.student:=x; Q^.prev:=NIL; Q^.next:=NIL;
if P=NIL then begin
P:=Q; K:=Q;
end
else begin
W:=Miejsce_wstawienia(P,x);
if W=P then begin
P^.prev:=Q; Q^.next:=P;
P:=Q;
end
else if W=NIL then begin
K^.next:=Q; Q^.prev:=K;
K:=Q;
end
else begin
W^.prev^.next:=Q;
Q^.prev:=W^.prev;
W^.prev:=Q;
Q^.next:=W;
end;
end;
end;
{-----}
procedure Dodaj_nowe_dane(var P,K:TWsk);
var x:TStudent;
z:char;
begin
write('Czy chcesz dodac nowe dane? (T/N): ');
repeat z:=UpCase(ReadKey) until z in ['N','T'];
writeln(z);
while z='T' do
begin
Wprowadz_studenta(x);
Dodaj_do_listy(P,K,x);
write('Czy chcesz dodac nowa osobe? (T/N): ');
repeat z:=UpCase(ReadKey) until z in ['N','T'];
writeln(z);
end;
end;
{-----}
procedure Wyswietl_liste(P:TWsk);
begin
while P<>NIL do
begin
Pokaz_studenta(P^.student);
P:=P^.next;
end;
end;
{-----}
begin
P:=NIL;
ClrScr;
Dodaj_nowe_dane(P,K);
ClrScr;
writeln('Wprowadzone dane:');
Wyswietl_liste(P);
ReadKey;
end.
Program przedstawiony w punkcie 1 zawiera procedury wprowadzania danych, tworzenia listy (dwukierunkowej) studentów oraz wyświetlania zawartości listy (od początku do końca). Uzupełnić ten program o procedury lub funkcje realizujące następujące działania:
uzupełnienie procedury wprowadzania daty o mechanizmy kontroli poprawności danych;
wyszukiwania na liście osoby o wskazanym nazwisku;
c) likwidacji listy.
Uzupełnić program z poprzedniego punktu o procedury lub funkcje wykonujące następujące operacje:
wyznaczenie liczby studentów na liście;
sortowania listy według porządku alfabetycznego;
zapisanie zawartości listy do pliku o nazwie studenci.dat;
umożliwienie pobrania danych z pliku o nazwie studenci.dat, umieszczenia ich na liście i ew. dodania do listy nowych studentów;
usunięcie z listy osób o wskazanych danych (np. nazwisku bądź dacie urodzenia);
rozbicia listy głównej na dwie listy, na których znajdą się osoby urodzone przed rokiem 1980 lub później.
str. 2/3 Turbo Pascal - Instrukcja nr 12
Turbo Pascal - Instrukcja nr 12 str. 3/3