Тема_7: Записи. Тип даних RECORD.
План.
Поняття та призначення записів.
Фіксовані записи.
Оператор приєднання WITH.
Записи з варіантами.
Приклади використання записів.
1. Поняття та призначення записів.
Запис – це структура даних, що складається з фіксованої кількості елементів, які називаються полями. Поля можуть мати різний тип даних.
Записи доцільно використовувати там, де необхідно об’єднати різнорідні дані, що відносяться до однієї і тієї ж величини. Наприклад, в запис про книгу може входити шифр, автор, назва, видавництво, рік видання, а в запис про студента – прізвище, ім’я, по-батькові, рік народження, курс, група.
Записи бувають двох видів: фіксовані та з варіантами.
2. Фіксовані записи.
Фіксовані записи мають фіксовану кількість полів. Вони оголошуються в розділі оголошення типів даних таким чином:
Type назва запису = record
поле 1: тип даних;
поле 2: тип даних;
……………………
поле n: тип даних
end; { record }
Var ім’я змінної: назва запису;
Звернення до полів запису здійснюється за іменем змінної, після якого через крапку вказують назву поля.
Приклади.
1). Оголосити тип даних «дата». Поля запису : день, місяць, рік.
Type
mon = ( jan, feb, mar, apr, may, jun, jul, aus,sep, oct, nov, dec) ;
data = record
day: 1..31; {день}
month: jan..dec; {місяць}
year: integer {рік}
end; {data}
2). Оголосити змінні «d1», «d2» типу даних дата.
Var d1, d2: data;
3). Присвоїти полям змінних типу даних «data» певні значення:
d1.day: = 1;
d1.month: = sep;
d1.Year: = 2010;
d2.day: = d1.Day:
d2.month: = pred(d1.Month); {aug}
d2.year: = Succ(d1.Year); {2011}
4). Оголосити тип даних “ студент ”. Поля запису: ім я, прізвище, рік народження, курс, група.
Type stud = record
name: string[15]; {ім’я}
fam: string [25]; {прізвище}
year: integer; {рік народження}
kurs, group: byte {курс, група}
end; { stud }
5). Оголосити змінні «st1» та «st2» типу даних «студент».
Var st1, st2: stud;
6). Оголосити масив «Gr_7» типу даних «студент», який складається з 25-ти елементів:
Var Gr_7: array [1..25] of stud;
7). Організувати введення інформації для заповнення полів запису «студент» масиву «Gr_7».
for i: = 1 to 25 do
begin
write ( ‘ Прізвище: ’ ); readln (Gr_7[i].fam);
write ( ‘ Ім’я: ’ ); readln (Gr_7[i].name );
write (‘ Рік народження:’ );readln Gr_7[i].year );
write(‘Курс:’); readln (Gr_7[i].kurs);
write (‘Група:’); readln(Gr_7[i].group)
end;
3. Оператор приєднання with
Оператор приєднання with застосовується лише до записів. Він використовується для того, щоб баготоразово не писати ім’я змінної, яка відноситься до поля запису. Формат оператора with:
WITH ім’я змінної DO оператор;
Приклад. Присвоїти полям запису змінної d1 із попереднього прикладу певні значення, використовуючи оператор приєднання with.
with d1 do
begin day: = 1;
month: = sep;
year: = 2010
end;
Без оператора with ці присвоєння здійснюють таким чином:
d1.day:=1;
d1.month:=sep;
d1.year:=2010 ;
4. Записи з варіантами
Записи з варіантами – це такі записи, у яких є спільна частина для всіх даних заданого типу та варіантна частина, що складається з поля-ознаки і однієї чи кількох варіантних компонентів.
Варіантні компоненти включаються до конкретного елементу типу даних за альтернативним принципом в залежності від значення поля-ознаки.
Приклад. Оголосити видавничу продукцію. Спільні поля запису: назва видавничої продукції, рік видання. Варіативні поля: якщо це книга, то оголосити поля запису автор і видавництво, якщо це журнал, то оголосити поля запису рубрика і номер видання, якщо це стаття, то оголосити поля запису назва статті і автор.
Type
Variaty = (book, mag, article) ;
Edition = record {видавнича продукція}
Name: string; {назва видавничої продукції}
Year: integer; {рік видання}
Case V: variaty of
book: (autor: string[25]; vidav: string [20]); {книга}
mag: ( rubrica: string[40]; nom: byte); {журнал}
article: (name_vid : string [40]; autor: string) {стаття}
end; {record}
Приклад. Створити масив записів про квартири. Поля запису: загальна площа квартири, площа кухні, кількість поверхів у будинку, поверх, район, адреса, вартість. Використовуючи дані про квартири, організувати пошук квартир за заданими параметрами. На екран вивести інформацію про усі квартири, що задовольняють вказаним значенням відповідних параметрів.
Довідки:
1. Дані про всі квартири.
2. Дані про квартири вказаного району.
3. Дані про квартири, вартість яких менша 100000$.
4. Дані про квартири 9-типоверхових будинків.
5. Дані про квартири, площа яких більша 40 квадратних метрів.
Текст програми:
Program PR_10;
Uses crt;
Const n=3; {кількість записів}
type
kvartira=record
zag_ploscha: integer; {загальна площа}
kuhnia_pl: string; {площа кухні}
k_st_pov: byte; {кількість поверхів у будинку}
poverh: byte; {поверх}
rayon: string; {район}
adresa: string; {адреса}
vartist: longint; {вартість}
end; {record}
Var kvart: array[1..n] of kvartira; {масив записів про квартири}
i: byte; {параметр циклу}
user_case: byte; {номер довідки }
rayoni: string; {район для пошуку}
Begin clrscr;
for i:=1 to n do {вводимо інформацію про квартири}
begin with kvart[i] do
begin
write('Введіть загальну площу квартири (в квадратних метрах):');
readln(zag_ploscha);
write('Введіть площу кухні (в квадратних метрах):');
readln(kuhnia_pl);
write('Введіть кількість поверхів у будинку:');
readln(k_st_pov);
write('Введіть номер поверху:');
readln(poverh);
write('Введіть район:');
readln(rayon);
write('Введіть адресу:');
readln(adresa);
write('Введіть вартість ($):');
readln(vartist);
end;
end;
repeat clrscr;
writeln(‘ВИБЕРІТЬ ОДИН З ПУНКТІВ МЕНЮ (від 1-го до 6-го)’);
writeln(‘Введіть номер потрібного пункту меню та натисніть <Enter>’);
writeln;
writeln('1.Показати дані про всі квартири');
writeln('2.Показати дані про квартири вказаного району');
writeln('3.Показати дані про квартири вартістю менше 10000$');
writeln('4.Показати дані про квартири 9- типоверхових будинків');
writeln('5.Показати дані про квартири, загальна площа яких більша 40 квадратних метрів');
writeln('6.Вихід');
readln(user_case);
case user_case of {вибір пункту від 1-го до 6-го}
1: begin {Дані про всі квартири}
clrscr;
writeln(‘ДАНІ ПРО ВСІ КВАРТИРИ’);
writeln;
writeln('заг пл|кухня|к-сть пов|поверх| район | адреса |вартість| ');
for i:=1 to n do
begin with kvart[i] do
writeln(zag_ploscha:6,'|',kuhnia_pl:5,'|',k_st_p ov:9,’|', poverh:6, ’|’, rayon:14,’|’, adresa:24,’|’,vartist:8,’|’);
end;
end;
2: begin {дані про квартири вказаного району}
clrscr;
writeln(‘Введіть район:’);
readln(rayoni);
writeln(‘ДАНІ ПРО КВАРТИРИ РАЙОНУ “’,rayoni,’”’);
writeln;
writeln('заг пл|кухня|к-сть пов|поверх| район | адреса |вартість| ');
for i:=1 to n do
if kvart[i].rayon=rayoni then
begin with kvart[i] do
writeln(zag_ploscha:6,'|',kuhnia_pl:5, '|',k_st_pov:9,’|',poverh:6,’|’, rayon:14, ’|’,adresa:24,’|’,vartist:8,’|’);
end;
end;
3: begin {дані про квартири дешевші 10000$}
clrscr;
writeln(‘ДАНІ ПРО КВАРТИРИ ВАРТІСТЮ МЕНШЕ 100000$’);
writeln;
writeln('заг пл|кухня|к-сть пов|поверх| район | адреса |вартість| ');
for i:=1 to n do
if kvart[i].vartist<100000 then
begin
with kvart[i] do
writeln(zag_ploscha:6,'|',kuhnia_pl:5,' |',k_st_pov:9,’|',poverh:6,’|’, rayon:14,’|’,adresa:24,’|’,vartist:8,’|’);
end;
end;
4:begin {дані про квартири 9-типоверхових будинків}
clrscr;
writeln(‘ДАНІ ПРО КВАРТИРИ 9- ТИПОВЕРХОВИХ БУДИНКІВ’);
writeln;
writeln('заг пл|кухня|к-сть пов|поверх| район | адреса |вартість| ');
for i:=1 to n do
if kvart[i].k_st_pov=9 then
begin with kvart[i] do
writeln(zag_ploscha:6,'|',kuhnia_pl:5,'|',k_st_pov:9, ’|', poverh:6,’|’, rayon:14,’|’,adresa:24,’|’, vartist:8,’|’);
end;
end;
5: begin { дані про квартири з загальною площею більше 40 квадратних метрів}
clrscr;
writeln(‘ДАНІ ПРО КВАРТИРИ З ЗАГАЛЬНОЮ ПЛОЩЕЮ БІЛЬШЕ 40 КВАДРАТНИХ МЕТРІВ’);
writeln;
writeln('заг пл|кухня|к-сть пов|поверх| район | адреса |вартість| ');
for i:=1 to n do
if kvart[i].zag_ploscha>40 then
begin
with kvart[i] do
writeln(zag_ploscha:6,'|',kuhnia_pl:5,'|',k_st_pov:9,’|', poverh:6,’|’, rayon:14,’|’,adresa:24,’|’,vartist:8,’|’);
end;
end;
6:halt; {вихід з програми}
end; {case}
writeln;
readln
until user_case=6;
readln
End.
Результати виконання програми:
Приклад 11. Оголосити тип даних «ПК» (персональний комп’ютер). Поля запису: прізвище, якщо студент має персональний комп’ютер вдома (відповідь так), то оголосити поля запису: скільки часу витрачає на заняття, перегляд фільмів та ігри, якщо студент не має ПК вдома (відповідь ні), то оголосити поле запису: в які дні працює в комп’ ютерному класі самостійно.
Текст програми:
Program PR_11;
Uses crt;
Type
variaty=(tak,ni);
PK=record
Surname: string; {прізвище студента}
case vidp: variaty of {варіантна частина запису}
tak: (lessons,games,films:string); {студент має ПК вдома}
ni: (PK_class:string); {студент не має ПК вдома}
end;{record}
Var m: array[1..20] of PK; {масив записів}
n: byte; {кількість студентів}
vib: byte; {відповідь користувача на питання про наявність ПК вдома}
i:byte; {параметр циклу}
Begin
clrscr;
writeln(‘Введіть кількість студентів:');
readln(n);
for i:=1 to n do
begin
write('Введіть прізвище студента:');
readln(m[i].Surname);
writeln(' Наявний ПК вдома(1) чи ПК вдома немає(2)?');
readln(vib);
case vib of
1: m[i].vidp:=tak;
2: m[i].vidp:=ni;
end;{case}
case m[i].vidp of
tak: { у випадку, коли студент має ПК вдома}
begin
with m[i] do
begin
write('Скільки часу витрачає на заняття?:');
readln(lessons);
write('Скільки часу витрачає на ігри?:');
readln(games);
write('Скільки часу витрачає на перегляд фільмів?:');
readln(films)
end;
end;
ni: { у випадку, коли студент не має ПК вдома}
begin
write('В які дні працює в комп’ ютерному класі самостійно?:');
readln(m[i].PK_class);
end;
end;{case}
end;{кінець циклу}
writeln;
writeln('Студенти, які мають ПК вдома:');
writeln;
for i:=1 to n do
if m[i].vidp=tak then
with m[i] do
begin
writeln(Surname,' витрачає на ');
writeln('заняття: ',lessons);
writeln('ігри : ',games);
writeln('фільми: ',films)
end;
writeln;
writeln('Студенти, які не мають ПК вдома:');
writeln;
for i:=1 to n do
if m[i].vidp=ni then
writeln(m[i].Surname,' самостійно працює в комп’ютерному класі в такі дні: ',m[i].PK_class);
readln
End.
Результати виконання програми:
Введіть кількість студентів:
3
Введіть прізвище студента: Анцебурова
Наявний ПК вдома(1) чи ПК вдома немає(2)?
1
Скільки часу витрачає на заняття?: 6 год
Скільки часу витрачає на ігри?: 1 год
Скільки часу витрачає на перегляд фільмів?: 2 год
Введіть прізвище студента: Коваленко
Наявний ПК вдома(1) чи ПК вдома немає(2)?
2
В які дні працює в комп’ ютерному класі самостійно?: вівторок, середа, четвер
Введіть прізвище студента: Дубович
Наявний ПК вдома(1) чи ПК вдома немає(2)?
1
Скільки часу витрачає на заняття?: 2 год
Скільки часу витрачає на ігри?: 1 год
Скільки часу витрачає на перегляд фільмів?: 3 год
Студенти, які мають ПК вдома:
Анцебурова витрачає на
заняття: 6 год
ігри: 1 год
фільми: 2 год
Дубович витрачає на
заняття: 2 год
ігри: 1 год
фільми: 3 год
Студенти, які не мають ПК вдома:
Коваленко самостійно працює в комп’ютерному класі в такі дні: вівторок, середа, четвер