Л а б о р а т о р н а р о б о т а N 6
Робота iз записами на мові Турбо Паскаль
Мета роботи: вивчення способів оголошення та алгоритмів
опрацювання даних структурних типів
1. Оголошення та доступ до полів
Запис - це структура даних, що складаїться із кінцевої кіль-
кості логічно зв'язаних компонентів, які називаються полями запису.
Від масивів записи відрізняються тим, що їх поля можуть бути різного
типу. Поля запису мають імена для посилання на них.
Структура оголошення типу запису:
type
ім'я_типу=record
ім'я_поля1: тип_поля1;
ім'я_поля2,...,ім'я_поляj: тип_полів2_j;
{........................}
ім'я_поляn: тип_поляn
end;
Імена полів запису ї правильними ідентифікаторами Турбо-Паска-
ля. В межах одного типу запису вони повинні бути унікальними, але
можуть співпадати з іншими ідентифікаторами поточного блоку програми,
або з полями інших записів. Ім'я поля від типу поля відділяїться
двокрапкою. Якщо декілька полів мають одинаковий тип, то вони можуть
задаватися через кому. В якості типу поля може використовуватися
довільний допустимий тип. Список полів охоплюїться ключовими словами
record-end. Після останнього опису поля перед end можна не ставити
крапку з комою.
Якщо поле запису в свою чергуї записом, то такі записи назива-
ються вкладеними.
Слід звернути увагу на те, що тип запису описуїться в блоці ty-
pe, а сам запис оголошуїться в блоці var.
Приклад оголошення запису:
type rozm=record
x,y,z:real
end;
var size1:rozm;
var product:record
name:string[20];
count:word;
size:rozm;
price:real
end;
Доступ до полів запису здійснюїться шляхом вказання
імені запису та імені поля, розділених крапкою, наприклад:
product.name:='Вирiб 001';
product.count:=1;
Для вкладених записів необхідне уточнення:
product.size.x;
product.size.y;
Імена полів запису можуть повторюватися на різних рівнях їх
вкладеності.
2. Оператор дії над записами
Для спрощення доступу до полів запису використовуїться оператор
with-do:
with ім'я_запису do оператор;
Ім'я запису ї правильним ідентифікатором і повинно бути попе-
редньо оголошене в блоці var. Ім'я запису може визначати елемент ма-
сиву записів.
В якості оперетора може використовуватися довільний оператор
Турбо-Паскаля, в тому числі складений.
Приклад використання оператора with:
var
date: record
month:byte;
year :word
end;
{........}
with date do
if month=12 then begin
month:=1;
year:=year+1
end
else
month:=month+1;
Приведений приклад еквівалентний наступному:
if date.month=12 then begin
date.month:=1;
date.year:=date.year+1
end
else
date.month:=date.month+1;
Оператор with може бути вкладеним:
with V1 do
with V2 do
{........}
with Vn do
оператор;
де V1,...,Vn - імена записів. Цей оператор еквівалентний наступному:
with V1,V2,...,Vn do оператор;
На i-му рівні вкладеності операторів with дії наступне правило:
ідентифікатор x вважаїться іменем поля запису Vi, потім - (i-1)-го
запису і т.д.; Імена записів перевіряються на вкладеність. Тому
ідентифікатор x буде в першу чергу полем вкладених записів. Якщо це
не так, то x перевіряїться на належність до окремих записів знизу
вгору. Якщо ідентифікатор x не входить ні в один із записів, то він
повинен бути описаний як елемент іншого типу даних.
3. Ініціалізація записів
Початкова ініціалізація записів може бути виконана одним із
наступних способів:
1) оголошенням типованих констант;
2) шляхом присвоїння значень полям в операторній частині програми;
3) при вводі значень полів з клавіатури.
При оголошенні типованих констант типу запис у круглих дужках
вказуються назви полів та їх значення. Назва поля від його значення
відокремлюїться символом "двокрапка", а одне поле від іншого - сим-
волом "крапка з комою". Приклад оголошення типованої константи:
Const m:product=(name:'Вирiб 001';
count:1;
size:(x:20;y:50;z:40);
price:890);
Полям змінної типу запис можна присвоїти значення в операторній
частині програми, наприклад:
Var m:product;
begin
with m,size do
begin
name:='Вирiб 001';
count:=1;
x:=20; y:=50; z:=40;
price:=890
end
{...}
end.
Ввід записів з клавіатури та вивід на екран або на принтер
здійснюїться по окремих полях. При вводі різнотипних полів необхідно
пам'ятати, що:
1) числові поля одне від одного та від полів іншого типу відділяють-
ся пропусками, символом табуляції або переходу на новий рядок;
2) в символьне поле (char або string) будуть прочитані один або
декілька символів розділення, розміщених зразу після останнього про-
читаного поля;
3) рядки символів читаються до вичерпання оголошеної довжини або до
символу EOLN, який формуїться при натисканні клавіші Enter. Символ
EOLN у рядок не потрапляї і може бути прочитаний наступним вводом
символьних даних.
Приклад вводу та виводу полів запису:
Var m:product;
begin
writeln('Введіть поля запису: string[20] word real real real real');
with m,size do readln(name,count,x,y,z,price);
with m,size do writeln(name,count,x,y,z,price);
{...}
end.
4. Операції над записами
Для тотожніх записів дозволяїться виконання операції присвоїння,
наприклад:
Type rec=record
move:(Right,Left,Ahead,Back,Stop);
x,y:real
end;
Const a:rec=(move:Ahead;x:2.0;y:5.0);
Var b:rec;
Begin
b:=a;
with b do
begin
case move of
Right: write('Right':-10);
Left: write('Left':-10);
Ahead: write('Ahead':-10);
Back: write('Back'):-10;
Stop: write('Stop':-10)
end;
writeln(x:5:2,y:5:2);
end
End.
Порівняння двох записів здійснюїться окремо по кожному полю,
наприклад: if (a.move=b.move) and (a.x=b.x) and (a.y=b.y) then
writeln('Записи співпадають');
5. Масиви записів
Записи можуть бути елементами масивів, наприклад:
var x:array[1..5] of product;
Тоді доступ до окремих полів здійснюїться вказанням індексів елемен-
та масиву, наприклад:
x[1].name:='Вирiб 001';
x[1].count:=1;
with x[1] do price:=890;
Ввід або вивід елементів масиву записів здійснюїться у циклі:
for i:=1 to 5 do
with x[i], size do
begin
readln(name,count,x,y,z,price);
writeln(name,count,x,y,z,price)
end;
6. Завдання для роботи
1. Заданий масив записiв з iнформацiїю про успiшнiсть групи сту-
дентiв по дисциплiнi програмування: прiзвище, iм'я, по-батьковi,
оцiнка:
а) знайти середнiй бал групи по цiй дисциплiнi;
б) вивести на друк прiзвища студентiв, якi мають незадовiльнi
оцiнки.
2. Вiдомостi про автомобiль складаються iз його марки, номера,
кольору, прiзвища власника:
а) пiдрахувати кiлькiсть автомобiлiв заданої марки;
б) пiдрахувати кiлькостi автомобiлiв кожної марки;
3. Заданий масив записiв з iнформацiїю про продукцiю пiдприїмства:
назва виробу, код виробу, кількість, цiна:
а) впорядкувати цей масив по зростанню коду виробу;
б) впорядкувати цей масив по зростанню коду виробу та його
ціни;
в) сформувати новий масив, вибравши в нього записи з цiною,
меншою заданої.
4. Сформувати масив записiв з iнформацiїю про успiшнiсть сту-
дентiв по 5-ти предметах:
а) знайти середнiй бал кожного студента;
б) вивести на друк прiзвища студентiв iз середнiм балом бiльшим
або рiвним 4.
5. У масивi записiв приведена iнформацiя про студентiв факульте-
ту: прiзвище, iм'я, по-батьковi, стать, вiк, курс, група,
оцiнки по 5-ти предметах.
Написати програму, яка виводить:
а) найбiльш розповсюдженi чоловiчi та жiночi iмена;
б) номери груп в порядку спадання середньої успiшностi сту-
дентiв першого курсу.
6. Записна книжка з телефонами може бути оголошена наступним чи-
ном:
type слово= packed array [1..9] of char;
номер_телефона = 100000..999999;
знайомий=record прiзвище:слово;
номер:номер_телефона
end;
сторiнка=array [1..20] of знайомий;
записна книжка = array ['A'..'Z'] of сторiнка;
Вважаючи, що на кожнiй сторiнцi записної книжки вказанi прiзви-
ща, що починаються з однiїї й тiїї ж букви, написати функцiю,
яка визначаї:
а) чи ї у записнику вiдомостi про знайомого з заданим прiзвищем,
i, якщо ї, вивести його номер телефона;
б) чи ї у записнику вiдомостi про знайомого з заданим
номером телефона i, якщо ї, то вивести його прiзвище.
7. Написати процедуру, яка обчислюї значення квадратного трьохчлена
2
ах + вх + с
з комплексними коефiцiентами а, в, с в комплекснiй точцi х:
type complex=record
re, im: real
end;
8. Шахматне поле може бути оголошене наступним чином:
type поле = record верт:(а, в, с, d, e, f, g, h);
гориз: 1..8
end;
Написати логiчну функцiю хiдферзя (n1, n2), яка перевiряї, чи
може ферзь за один хiд перейти з позицiї n1 у позицiю n2 (по-
зицiї n1 та n2 мають тип "поле").
9. Написати процедуру ДекПол (d,p), яка перетворюї координати точки
на площинi iз декартових d в полярнi p координати, i процедуру
ПолДек (p,d), яка виконуї зворотнї перетворення. Необхiднi типи
даних:
type декарт = record x,y : real end;
поляр = record r,fi: real end;
{r>=0, - П<=fi<=П}.
10. У масиві записів задана інформація про книги бібліотеки:
автор, назва, рік видання, код тематики, ціна. Вивести на екран інформацію
про книги, видані після 1991 року для заданого:
а) автора;
б) коду тематики.
11. Заданий масив структур з iнформацiїю про номенклатуру продукцiю
пiдприїмства: назва виробу, код виробу, цiна одного виробу. З клавiатури
вводяться записи з iнформацiїю про код виробу та їх кiлькiсть. Сформувати
новий масив структур (назва виробу, сума) для всiх кодiв виробiв, що вводяться з
клавiатури. Сума=кiлькiсть*цiна.
12. В масивi структур tabel заданi данi облiку робочого часу працiвникiв установи:
прiзвище та iн, табельний номер, код посади, кiлькiсть вiдпрацьованих годин за
мiсяць. В масивi структур normativ заданi тарифнi ставки для кожного коду
посади. Вивести на екран вiдомiсть для нарахування зарплати для кожного
працiвника: прiзвище та iн., сума зарплати. Сума зарплати обчислюїться для
кожного працiвника як добуток кiлькостi вiдпрацьованих годин на значення
тарифної ставки для заданого коду посади.
13. Заданий масив структур з iнформацiїю про вироби, якi зберiгаються на складi
пiдприїмства: код виробу, кiлькiсть виробiв, цiна одного виробу. З клавiатури
вводиться iнформацiя про продукцiю, вiдпущену зi складу на протязi дня, у
форматi: код виробу, кiлькiсть. Знайти загальну вартiсть продукцiї, вiдпущеної зi
складу, та залишок виробiв по всiй номенклатурi на кiнець робочого дня.
14. Заданий масив структур з нормативною iнформацiїю про продукцiю
пiдприїмства: код продукцiї, вартiсть одного виробу. З клавiатури вводиться
iнформацiя про продукцiю, виготовлену на протязi робочого дня трьома цехами
пiдприїмства, у форматi: номер цеху, код продукцiї, кiлькiсть. Знайти сумарну
вартiсть продукцiї по всiй номенклатурi, виготовленої кожним iз цехiв.
15. Заданий масив структур з iнформацiїю про продукцiю, виготовлену
пiдприїмством на протязi одного мiсяця: дата, назва продукцiї, код, кiлькiсть. По
кожному коду знайти сумарну кiлькiсть виробiв, виготовлених пiдприїмством на
протязi даного часу.
16. Заданий масив структур з iнформацiїю про продукцiю, виготовлену трьома
цехами пiдприїмства на протязi одного мiсяця: дата, номер цеху, назва продукцiї
,код, кiлькiсть. Знайти сумарну кiлькiсть виробiв кожного найменування,
виготовлених кожним iз цехiв пiдприїмства на протязi даного часу.