
Л.В.Рибакова Модуль 4 Лабораторна робота 15
ЛАБОРАТОРНА РОБОТА №15
Тема : записи.
Мета :
Одержання навичок в організації вводу(виводу) значень комбінованих типів даних .
Одержання практичних навичок програмування задач з використанням записів.
Теоретичні відомості.
ЗАПИСИ - це сукупність обмеженого числа логічно пов'язаних компо-нентів, які належать до різних типів.
Приклад запису:
TYPE
<ім’я запису >= RECORD
<ім’я компоненти-1>:<тип компоненти-1>;
<ім’я компоненти-2>:<тип компоненти-2>;
....
<ім’я компоненти-n>:<тип компоненти-n>;
END;
Наприклад:
TYPE
ZAP=RECORD
FAM:ARRAY[1..15] OF STRING;
B1,B2,B3,B4,B5:2..5;
SB: REAL;
END;
VAR
Z1,Z2:ZAP;
Завдання:
Для кожного студента вказані прізвище i оцінка(в балах) по п'яти дисцип-лінах. Потрібно вирахувати середній бал і надрукувати анкетні дані студента.
Припустимо, що в групі 25 студентів. Для збереження одного прізвища студента потрібен масив із 15 символів, тоді для збереження всіх прізвищ потрібний двомірний масив розміром 25х15. Для збереження інформації про всіх 25 студентів, необхідно її зберігати в пам’яті ЕОМ, для цього вводиться масив TBL, який представляє собою масив записів:
VAR
TBL : ARRAY[1..25] OF Zap;
Компонента запису(масиву записів) знаходиться по імені запису (масиву) i імені цієї компоненти, розділених крапкою.
Наприклад:
Z1.FAM, Z2.B3, TBL[2].SB.
В програмах вони називаються селекторами запису i використовуються так, як i змінні інших типів. Для знаходження значення середнього балу може бути використаний оператор присвоєння:
TBL[I].SB:=(TBL[I].B1+TBL[I].B2+TBL[I].B3+TBL[I].B4+TBL[I].B5)/5;
Імена компонентів в середині запису не повинні повторюватися. В мові Паскаль немає операції, яка сприймала б запис, як щось ціле. Однак значення запису можна пересилати в інші змiннi-записи за допомогою операторів присвоєння. Повертаючись до розглянутого прикладу, можна написати:
Z1:=Z2; .....
Останній оператор присвоєння еквівалентний наступним операторам:
Z1.FAM:=Z2.FAM; Z1.B1:=Z2.B1;
Z1.B2:=Z2.B2; Z1.B3:=Z2.B3; Z1.B4:=Z2.B4;
Z1.B5:=Z2.B5; Z1.SB:=Z2.SB;
Запис можна передавати в якості параметра процедури або функції але значенням функції запис бути не може.
Програма для прикладу може бути записана в наступному вигляді (без впорядкування по зменшенню середнього балу):
PROGRAM BAL;
{*Визначення середнього балу для кожного студента*}
TYPE
Zap= RECORD
FAM:string[45];
B1,B2,B3,B4,B5: 2.. 5;
SB: REAL
END;
VAR
TBL:ARRAY[1..25] OF Zap;
I: INTEGER;
BEGIN
FOR I:=1 TO 5 DO
BEGIN
WRITE('Введите Ф.И.О. и оценки по 5 дисциплинам');
READLN(TBL[I].FAM,
TBL[I].B1,
TBL[I].B2,
TBL[I].B3,
TBL[I].B4,
TBL[I].B5);
END;
FOR I:=1 TO 5 DO
BEGIN
TBL[I].SB:=(TBL[I].B1+TBL[I].B2+
TBL[I].B3+TBL[I].B4+TBL[I].B5)/5;
WRITELN(TBL[I].SB)
END
END.
При зверненні до компонент запису, ми стикаємось з необхідністю вказати в окремих операторах селекторів запису (складових імен), що приводить до збільшення програми i її громіздкості. Для усунення цієї незручності в мові Паскаль використовується оператор приєднання (оператор WITH), який дозволяє здійснювати доступ до компонент запису таким чином, якщо б вони були простими змінними.
Загальний вигляд оператора приєднання такий:
WITH <ім’я – запису> DO
<Оператор>; .........................
Другий варіант програми :
………..
For i:= 1 to 25 do
With TBL[i] do
Begin
Read(f, fam);
Read(f, b1,b2,b3,b4,b5)
Sb:=(b1+b2+b3+b4+b5)/5
Writeln(i:2,fam:15, b1:2,b2:2,b3:2,b4:2,b5:2,sb:6:2)
End;
Значення компонентів читають з текстового файлу, який пов’язаний зі змінною f у програмі (Див. Приклад у файлі text_file_use.doc).