Podstawy Informatyki - Laboratorium
Politechnika Świętokrzyska, Wydział Elektrotechniki, Automatyki i Informatyki
Turbo Pascal
Instrukcja laboratoryjna nr 10
Opracował: dr inż. Grzegorz Słoń
luty 2005 r.
Zmienne dynamiczne - tablica wskaźników i stos dynamiczny
Dany jest zestaw informacji o n studentach: nazwisko, imię, rok urodzenia, średnia ocen. Napisać program, który umożliwi umieszczenie tych danych w pamięci komputera w taki sposób, że dostęp do nich będzie się odbywał za pośrednictwem tablicy zawierającej wskaźniki do informacji o poszczególnych osobach.
program z10_1;
uses Crt;
type TDane = record
nazwisko, imie: string[20];
rok_ur: integer;
srednia: real;
end;
TWsk = ^TDane;
TTab = array[1..100] of TWsk;
var tab: TTab;
n: integer;
{-----}
procedure Dodaj_studenta(var a:TTab; poz: integer);
begin
New(a[poz]);
with a[poz]^ do
begin
write('Nazwisko: '); HighVideo; readln(nazwisko); LowVideo;
write('Imie: '); HighVideo; readln(imie); LowVideo;
write('Rok urodzenia: '); HighVideo; readln(rok_ur); LowVideo;
write('Srednia ocen: '); HighVideo; readln(srednia); LowVideo;
end;
end;
{-----}
procedure Wprowadz_dane(var n: integer; var a: TTab);
var i: integer;
begin
write('Dane ilu osob chcesz wprowadzic?: '); readln(n);
for i:=1 to n do
begin
writeln(i,' osoba:');
Dodaj_studenta(a,i);
end;
end;
{-----}
procedure Pokaz_studenta(x:TWsk);
begin
with x^ do
begin
GoToXY(5,WhereY); write(nazwisko); GoToXY(26,WhereY);
write(imie); GoToXY(48,WhereY); write(rok_ur:4); GoToXY(55,WhereY);
writeln(srednia:5:2);
end;
end;
{-----}
procedure Wyswietl_dane(n: integer; a: TTab);
var i: integer;
begin
HighVideo;
write('Lp.'); GoToXY(5,WhereY); write('Nazwisko'); GoToXY(26,WhereY);
write('Imie'); GoToXY(47,WhereY); write('Rok ur.'); GoToXY(55,WhereY);
writeln('Srednia');
LowVideo;
for i:=1 to n do
begin
write(i:3);
Pokaz_studenta(a[i]);
end;
end;
{-----}
begin
ClrScr;
Wprowadz_dane(n,tab);
ClrScr;
writeln('Wprowadzono nastepujace dane:');
Wyswietl_dane(n,tab);
writeln; writeln('Nacisnij dowolny klawisz...');
ReadKey;
end.
Uzupełnić program z punktu 1 o funkcję wyznaczającą średnią arytmetyczną ocen wszystkich wprowadzonych studentów oraz o procedurę uwalniającą pamięć zajętą przez dane studentów. Sprawdzić dostępność danych po odblokowaniu przypisanej im pamięci.
{-----}
function Sred_a(n: integer; a: TTab): real;
var s: real;
i: integer;
begin
s:=0;
for i:=1 to n do s:=s+a[i]^.srednia;
if n>0 then s:=s/n;
Sred_a:=s;
end;
{-----}
procedure Uwolnij_pamiec(n: integer; a: TTab);
var i: integer;
begin
for i:=1 to n do Dispose(a[i]);
end;
{-----}
Zmodyfikować rozwiązanie zadania z punktu 1 poprzez wykorzystanie stosu dynamicznego do przechowywania danych.
program z10_2;
uses Crt;
type TDane = record
nazwisko, imie: string[20];
rok_ur: integer;
srednia: real;
end;
TWsk = ^TElement;
TElement = record
d: TDane;
w: TWsk;
end;
var P: TWsk;
n: integer;
{-----}
procedure Wprowadz_studenta(var x: TDane);
begin
with x do
begin
write('Nazwisko: '); HighVideo; readln(nazwisko); LowVideo;
write('Imie: '); HighVideo; readln(imie); LowVideo;
write('Rok urodzenia: '); HighVideo; readln(rok_ur); LowVideo;
write('Srednia ocen: '); HighVideo; readln(srednia); LowVideo;
end;
end;
{-----}
procedure Na_stos(var P: TWsk; x: TDane);
var Q: TWsk;
begin
New(Q);
Q^.d:=x; Q^.w:=P;
P:=Q;
end;
{-----}
procedure Wprowadz_dane(var P: TWsk);
var i,n: integer;
x: TDane;
begin
P:=NIL;
write('Dane ilu osob chcesz wprowadzic?: '); readln(n);
for i:=1 to n do
begin
writeln(i,' osoba:');
Wprowadz_studenta(x);
Na_stos(P,x);
end;
end;
{-----}
procedure Usun_ze_stosu(var P: TWsk; var x: TDane);
var Q: TWsk;
begin
Q:=P;
x:=P^.d;
P:=P^.w;
Dispose(Q);
end;
{-----}
procedure Pokaz_studenta(x:TDane);
begin
with x do
begin
GoToXY(5,WhereY); write(nazwisko); GoToXY(26,WhereY);
write(imie); GoToXY(48,WhereY); write(rok_ur:4); GoToXY(55,WhereY);
writeln(srednia:5:2);
end;
end;
{-----}
procedure Usun_stos(var P: TWsk);
var x: TDane;
i: integer;
begin
i:=0;
HighVideo;
write('Lp.'); GoToXY(5,WhereY); write('Nazwisko'); GoToXY(26,WhereY);
write('Imie'); GoToXY(47,WhereY); write('Rok ur.'); GoToXY(55,WhereY);
writeln('Srednia');
LowVideo;
while P<>NIL do
begin
i:=i+1;
write(i:3);
Usun_ze_stosu(P,x);
Pokaz_studenta(x);
end;
end;
{-----}
begin
ClrScr;
Wprowadz_dane(P);
ClrScr;
writeln('Wprowadzono nastepujace dane:');
Usun_stos(P);
writeln; writeln('Nacisnij dowolny klawisz...');
ReadKey;
end.
Uzupełnić program z punktu 3 o procedurę wyświetlającą zawartość stosu bez jego likwidacji.
{-----}
procedure Wyswietl_stos(P: TWsk);
var x: TDane;
i: integer;
begin
i:=0;
HighVideo;
write('Lp.'); GoToXY(5,WhereY); write('Nazwisko'); GoToXY(26,WhereY);
write('Imie'); GoToXY(47,WhereY); write('Rok ur.'); GoToXY(55,WhereY);
writeln('Srednia');
LowVideo;
while P<>NIL do
begin
i:=i+1;
write(i:3);
x:=P^.d; P:=P^.w;
Pokaz_studenta(x);
end;
end;
{-----}
Uzupełnić program z punktu 4 o procedury lub funkcje wykonujące następujące operacje:
wyznaczenie średniej arytmetycznej ocen wszystkich wprowadzonych studentów;
znalezienie osób: najstarszej i najmłodszej;
zapisanie zawartości stosu do pliku o nazwie oceny.dat;
umożliwienie pobrania danych z pliku o nazwie oceny.dat, umieszczenia ich na stosie, a następnie dodania do stosu danych n nowych osób;
znalezienie na stosie osób o podanym nazwisku i wyświetlenie ich danych na ekranie
(w przypadku braku takich osób powinien się pojawić stosowany komunikat).
str. 4/4 Turbo Pascal - Instrukcja nr 10
Turbo Pascal - Instrukcja nr 10 str. 3/4