Rekordy
Typ rekordowy jest typem strukturalnym o strukturze jednowymiarowej i o składowych dowolnych typów, które nazywają się polami:
Opis typu:
record
lista_nazw_pól_1: typ1;
lista_nazw_pól_2: typ2;
........
end;
np.
type data = record
rok: 1900.. 2000;
mies: 1..12;
dzien: 1..31;
end;
type osoba = record
nazw: string[20];
imie: string[15];
data_ur: data;
stopnie: array[1.. 5] real;
end;
var student: osoba;
Uwagi
• W powyższym przykładzie osoba jest typem.
• student jest zmienną typu rekordowego (zmienną rekordową). W rekordzie tym występują cztery pola o nazwach: nazw, imie, data_ur oraz stopnie. Pola nazw oraz imię są typu tekstowego, data_ur jest typu rekordowego (ten typ musi być zdefiniowany wcześniej) a stopnie jest typu tablicowego.
• Zmienne rekordowe oznaczają zawartość całych rekordów. Dla zmiennych rekordowych tego samego typu dostępna jest tylko operacja przypisania jednemu rekordowi wartości drugiego rekordu.
• Do pól rekordu istnieje dostęp bezpośredni, odwołanie do pola zmiennej odbywa się przez nazwę zmiennej rekordowej i nazwę pola, oddzielonych kropką.
nazwa_zmiennej.nazwa_pola[.ewentualnie_nazwa_pola_składowego ...]
• Na zmiennych składowych można dokonywać operacji dopuszczalnych dla ich typu, np.: student. nazw := 'Kowalski' ;
if student. data_ur. rok < 1975 then ...
• W jednym typie rekordowym wszystkie pola muszą mieć różne nazwy.
• Zmienne rekordowe można zgromadzić w tablicy, np.:
var grupa: array[1..30] of osoba; {wcześniej musi być zdefiniowany typ osoba}
lub
var grupa: array[1..30] of record pole1: typ1;
pole2: typ2;
...
end;
begin
...
grupa[1]. nazw := ' Nowak'; if grupa[2]. data_ur. rok < 1975 then writeln(‘weteran’);
...
end.
1
Rekordy
Instrukcja wiążąca with upraszcza zapis dostępu do pól rekordu. Odwołanie w instrukcji (także złożonej) może nastąpić bezpośrednio do nazw pól wymienionych w liście zmiennych, bez wyspecyfikowanej nazwy zmiennej całościowej.
with lista_zmiennych_rekordowych do Istrukcja; Na przykład:
with student do
begin
nazw
:= ’Nowak’;
imie := ‘Jan’;
with data_ur do
begin
rok := 1978;
mies := 1;
dzien := 14;
end;
end;
Ćwiczenie 1
• Przeanalizuj kod poniższego programu, następnie sprawdź jego działanie.
Program Magazyn_towarow;
uses crt;
const N = 20;
type nz_twaru = string[15];
towar = record
nazwa:
nz_twaru;
ilosc:
Integer;
cna_jd:
Real;
end;
var magazyn: array[1..N] of towar; lba_danych,
{rzeczywista liczba towarów w magazynie}
k,
nr_opt: Integer;
{numer najwartościowszego towaru}
wart_opt: Real; {wartość największa}
nz_pom:
nz_twaru;
begin
clrscr;
writeln('Podaj dane o towarach - nazwę w jednym wierszu,'); writeln(' - ilość i cenę w kolejnym jednym lub dwóch');
writeln('Zakończ podawanie danych pustą nazwą:'); lba_danych := N;
{początkowo zakłada się pełny wektor danych}
for k := 1 to N do begin {wprowadzanie danych}
readln(nz_pom);
{wczytanie
nazwy
towaru}
if ord(nz_pom[0]) = 0 then begin
{badanie końca danych}
lba_danych := k - 1;
break
{zakończenie iteracji wyprowadzania danych}
end;
with magazyn[k] do begin
{wprowadzenie danych o towarze do wektora}
nazwa := nz_pom;
readln(ilosc,
cna_jd)
end;
end;
2
Rekordy
{wybieranie najwartościowszego towaru}
nr_opt := 1;
with magazyn[1] do wart_opt := ilosc * cna_jd; for k := 2 to lba_danych do
with magazyn[k] do
if ilosc * cna_jd > wart_opt then begin wart_opt := ilosc * cna_jd;
nr_opt
:=
k
end;
{wyświetlanie stanu magazynu}
writeln('Stan magazynu:');
writeln('Nazwa towaru ilość cena jedn.[zł] wartość [zł]'); for k := 1 to lba_danych do begin with magazyn[k] do write(nazwa:15, ilosc:6, cna_jd:14:2, ilosc *
cna_jd:14:2);
if k = nr_opt then writeln('***':8) else writeln;
end;
writeln('-------Koniec----------');
readln;
end.
Zadania
1. Napisz program, który umożliwia wprowadzanie danych osobowych dla 5 pracowników, a następnie wyświetla wprowadzone dane w układzie kolumnowym. Rekord ma zawierać następujące pola: Nr_ew, Nazwisko, Imie, Płeć. Zadanie rozwiąż dwoma sposobami: bez instrukcji with oraz z wykorzystaniem instrukcji with.
2. Napisz program, który:
• wprowadzi z klawiatury liczbę całkowitą n (mniejszą od 10), która określa liczbę studentów
• dla każdego studenta wprowadzi z klawiatury następujące dane: numer studenta (liczba całkowita),
nazwisko studenta (do 20 znaków),
średnią ocen studenta (liczba rzeczywista),
• umieści te dane w tablicy jednowymiarowej (wektorze rekordów),
• wprowadzi z klawiatury liczbę, która określa średnią powyżej której studentom przyznaje się stypendium,
• wszystkim studentom, którzy osiągnęli tę średnią przyznaje stypendium dowolnej wysokości (wartość stypendium zapisuje do rekordu w polu stypendium),
• wyświetla tablicę,
• wyświetla nazwisko studenta, który ma najwyższą średnią.
3. Napisz program, który:
• wprowadzi z klawiatury pewną liczbę serii danych o studentach, zakończonych liczbą 0, o organizacji: numer studenta (liczba całkowita),
nazwisko studenta (do 20 znaków),
wysokość stypendium (liczba rzeczywista),
• umieści te dane w tablicy jednowymiarowej (wektorze rekordów),
• wyznaczy i wyświetli na ekranie wartość średnią stypendiów,
• wyświetli dane o wszystkich studentach, pokazane w układzie kolumnowym, w którym dane o jednym studencie są pokazane w jednym wierszu,
• obok wartości stypendium tych studentów, którzy mają stypendia większe od średniej, postawi trzy znaki gwiazdek (***).
4. Napisz program, który pobierze z klawiatury ciąg danych o towarach w magazynie, podających dla każdego towaru jego nazwę, ilość i cenę jednostkową. Pusta nazwa towaru oznacza zakończenie pobierania danych.
Dane należy umieścić w wektorze. Program ma wyznaczyć towar o największej wartości.
3