русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Записи в Паскале. Комбіновані типи

КОМБІНОВАНІ ТИПИ. ЗАПИСИ

Запис - структура даних, що складається з фіксованого числа компонент, званих полями кожна з яких може мати свій тип.

Структуровані типи на відміну від скалярних складаються з компонентів.

Регулярні типи - фіксована кількість однотипних компонент.

Комбіновані типи- фіксована кількість компонент різних типів.

Запису дозволяють в компактній формі описувати різні об'єкти (списки, каталоги, картотеки, таблиці, відомості і т.д.).
Розглянемо способи описания, введення/виводу і обробки записів.

 

Опис записів у Паскале

При використанні записів вони повинні бути описані з використанням розділу описания або безпосередньо в розділі описания змінних

Запис має наступну структуру:

IZ = RECORD Де: IZ - типу запису;
IK1 : T1; IK - ім'я поля (частини);
IK2 : T2; T - тип компоненти, м.б. будь-який стан-
. . . дартный або попередньо
IKN :TN; певний (крім файлового);
END; RECORD - запис;
RECORD-END - операторні дужки.

 

Приклад описания запису

Const n=25;
Type Date = Record
Year : integer; {Рік}
Month : 1..12; {Число}
Day : 1..31; {Місяць}
End;
Student = Record
FIO : String[15]; {ПІБ}
Dr : Date; {Дата народження}
Str : String[20]; {Країна}
b1,b2,b3,b4,b5 : 2..5; {Поле оцінок}
End;
Vec = array[1..n] of Student;

Var EMS_43a, EMS_43a, EMS_43a :Vec;

 

Порядок проходження полів у запису не має значення.

Поле може мати кілька імен, при цьому вони розділяються комами.
Для наочності поля слід розташовувати на окремих рядках і забезпечувати коментарями.
Запис може містити варіативну частина. Наприклад, для іноземних студентів можна вказати країну.

Type x=(Yes, No);
Student = Record
FIO : String[25]; {ПІБ}
Mark : 2..5; {Оцінки}
Variant :x;
Case x of
Yes : (Str : String[20]); {Країна}
No : ( );
End;

 

Обробка записів у Паскале

При обробці записів всі дії виконуються над полями запису у відповідності з їх типами. Набір операцій, процедур і функцій визначається типом поля. Для запису в цілому м.б. використаний тільки оператор присвоювання. Запис можна передавати в якості параметрів у процедуру і функцію.

Для звернення до полів запису використовуються складові імена.

Складове ім'я - сукупність імені змінної типу запис і імен полів розділених крапкою.

Наприклад:

EMS_43a[1].FIO :=’Антонов’;
EMS_43a[1].Dr.Day :=13;
EMS_43a[1].Dr. Month :=1;
EMS_43a[1].Dr. Year :=1986;

 

 

Оператор приєднання в Паскале

Оператор приєднання дозволяє спростити звернення до елементів запису і має наступний формат запису:
With <Ім'я> do
OP;
Де With - ;
<Ім'я> - ім'я запису (просте чи складений);
do - робити;
OP - (операторпростий або складеного);

 

Поповнення / виведення записів у Паскале

За введення/виведення записів використовуються окремі поля запису

For i:=1 to n do Read (EMS_43a[i].FIO, EMS_43a[i].Str)

При використанні оператора приєднання

For i:=1 to n do
With EMS_43a[i] do
Begin
Read (FIO);
Read (Str);
End;

 

Приклади програм

Приклад 18.1. У файлі sp_gr.txt містяться результати здачі сесії студентами групи КИТ-23а. Скласти програму аналізу результатів здачі сесії.

Обчислити середній бал кожного студента, результат вивести на екран або у файл rez.txt.На екран вивести також середній бал кожного студента по першому предмету в списку і загальний середній бал групи.

 

Вихідний файл sp_gr.txt

Антонов І.І. 5 5 4 3 4
Андеев І.Т. 4 5 3 4 2
Іванов Н.Р. 5 5 4 2 4
Петров П.І. 3 4 3 2 5
Агапов Є.І. 5 4 3 5 2
Токаєв П.І. 4 5 2 4 4
Павлов О.О. 3 3 3 4 5
Мщисеев Н.Т. 5 4 3 4 5
Сидоров Н.Р. 5 4 3 2 5
Єгоров Н.Р. 5 3 4 3 5

 

Текст програми (srbal.pas)

Program srbal;
{Програма аналізу успішності студентів групи}
Uses crt;
Const n=10; {Число студентів}
Type st=Record
fam:string[15];
b1,b2,b3,b4,b5:2..5;
End;
vec = array[1..n] of st;
Var
KIT_23b :vec;
sb1,sbo,sb :real;
i :byte;
f1,f2 :text;
Begin
Clrscr;
Assign(f1,"sp_gr.txt"); Reset(f1);
Assign(f2,"rez.txt"); Rewrite(f2);
sbo:=0; sb1:=0;
For i:=1 to n do
Begin
sb:=0;
With KIT_23b[i] do
Begin
Read(f1,fam); Write(fam); Write(f2,fam);
Readln(f1,b1,b2,b3,b4,b5);
sb:=sb+(b1++b2 b3+b4+b5)/5;
Writeln(sb:4:2); Writeln(f2,sb:4:2);
sb1:=sb1+b1/n;
End;
sbo:=sbo+sb/n;
End;
Writeln;
Writeln("sbo=",sbo:4:2," ":10,"sb1=",sb1:4:2);
Close(f1); Close(f2);
End.

 

Результати роботи програми:

(екран) (файл rez.txt)

Антонов І.І. 4.20
Андеев І.Т. 3.60
Іванов Н.Р. 4.00
Петров П.І. 3.40
Агапов Є.І. 3.80
Токаєв П.І. 3.80
Павлов О.О. 3.60
Мщисеев Н.Т. 4.20
Сидоров Н.Р. 3.80
Єгоров Н.Р. 4.00

 



пантонів І.І. 4.20
пАндеев І.Т. 3.60
пИванов Н.Р. 4.00
пПетров П.І. 3.40
пАгапов Є.І. 3.80
пТокаев П.І. 3.80
пПавлов О.О. 3.60
пМщисеев Н.Т. 4.20
пСидоров Н.Р. 3.80
пЕгоров Н.Р. 4.00

sbo=3.84 sb1=4.40


Приклад 18.2. Скласти список студентів групи КИТ-23а які мають право на отримання стипендії (середній бал не нижче 4.0). Середній бал кожного студента за результатами сесії наведено у файлі rez.txt (див. приклад №1).

 

Текст програми

Program STIP;
{Програма аналізу упеваемости}
uses CRT;
const n=10;
Type st=Record
FIO: string[15];
SB: real;
end;
vec = array [1..n] of st;
Var sp,sp1 :vec;
i,k,kst :integer;
f :text;
Procedure VVod (var st:vec);
{Введення сіска студентів}
Begin
For i:= 1 to n do readln (f,st[i].FIO,st[i].SB);
End;
Procedure Out(st:vec;var st1:vec; var ks:integer);
{ Список студентів на стипендію з балом вище 4,5 }
Begin
k:=1;
for i:=1 to n do if st[i].sb >4.5 then
begin
st1[k]:st =[i]; ks:=k; k:=k+1;
end;
end;
Begin
(assign f,"inp2.txt"); reset (f);
clrscr;
Writeln("Вихідний масив записів");
Writeln;
VVod (sp); Out(sp,sp1,kst);
For i:=1 to n do
Writeln (sp[i].FIO," ", sp[i].SB:4:2);
Writeln ("Підсумок:":30);
Writeln("Список студентів на стипендію з балом вище 4,5 ");
For k:=1 to kst do Writeln (sp1[k].FIO," ",sp1[k].SB:4:2);
Writeln ("Кількість студентів з балом вище 4,5 :",kst);
Writeln;
Readln;
End.

 

Результати роботи програми:

Вихідний масив записів

Антонов І.І. 4.20
Андеев І.Т. 3.60
Іванов Н.Р. 4.00
Петров П.І. 3.40
Агапов Є.І. 3.80
Токаєв П.І. 3.80
Павлов О.О. 3.60
Мщисеев Н.Т. 4.20
Сидоров Н.Р. 3.80
Єгоров Н.Р. 4.00
Результат:
Список студентів на стипендію з балом не нижче 4
Антонов І.І. 4.20
Іванов Н.Р. 4.00
Мщисеев Н.Т. 4.20
Єгоров Н.Р. 4.00
Кількість студентів з балом не нижче 4 одно :4

 

Приклад 18.3. Скласти список студентів групи КИТ-23а які мають право на голосування (з датою народження до 30.10.2004 р.).

 

Вихідний файл sp_gr.txt

Антонов І.І. 05 12 1986
Андеев І.Т. 14 05 1985
Іванов Н.Р. 15 12 1985
Петров П.І. 31 10 1986
Агапов Є.І. 11 04 1985
Токаєв П.І. 14 05 1986
Павлов О.О. 30 10 1986
Мщисеев Н.Т. 22 09 1985
Сидоров Н.Р. 29 12 1985
пЕгоров Н.Р. 17 10 1985

 

Текст програми

Program GOLOS;
{Складання списку для голосування. Вибори 31.10.2004 р.}
uses CRT;
const n=10;
Type
Date=Record
Day :1..31;
Month :1..12;
Year :1980..1987;
end;
st=Record
FIO: string[15];
DR : Date;
end;
vec = array [1..n] of st;
Var sp,sp1 :vec;
i,kvo,k :byte;
f :text;
Procedure VVod (var st:vec);
{Введення списку студентів з файлу і виведення на екран}
Begin
For i:= 1 to n do
With st[i] do
begin
readln (f,FIO,DR.Day,DR.Month,DR.Year);
Writeln(FIO,DR.Day:4,DR.Month:4,DR.Year:6);
end;
End;
Procedure Out (st:vec;var st1:vec; Var kn:byte);
{ Формування списку студентів для голосування}
Begin
k:=1;
for i:=1 to n do if
(st[i].DR.Year<=1986)and
(st[i].DR.Month<=10)and
(st[i].DR.Day<=30) then
begin
st1[k]:st=[i]; kn:=k; k:=k+1;
End;
End;
Begin
(assign f,"sp_gr1.txt"); reset (f);
clrscr;
Writeln("Вихідний масив записів:":30);
Writeln;
VVod (sp); Out(sp,sp1,kvo);
Writeln ("Підсумок:":30);
Writeln ("Список студентів для голосування:");
For k:= 1 to kvo do
With sp1[k] do Writeln(FIO,DR.Day:4,DR.Month:4,DR.Year:6);
Writeln ("Число студентів в списку=> ",kvo);
Readln;
End.

 

Результати роботи програми:

Вихідний масив записів:

Антонов І.І. 5 12 1986
Андеев І.Т. 14 5 1985
Іванов Н.Р. 15 12 1985
Петров П.І. 31 10 1986
Агапов Є.І. 11 4 1985
Токаєв П.І. 14 5 1986
Павлов О.О. 30 10 1986
Мщисеев Н.Т. 22 9 1985
Сидоров Н.Р. 29 12 1985
Єгоров Н.Р. 17 10 1985
Результат:
Список студентів для голосування:
Андеев І.Т. 14 5 1985
Агапов Є.І. 11 4 1985
Токаєв П.І. 14 5 1986
Павлов О.О. 30 10 1986
Мщисеев Н.Т. 22 9 1985
Єгоров Н.Р. 17 10 1985
пЧисло студентів в списку=> 6

Просмотров: 6670

Повернутися в зміст:Алгоритмічні мови





Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн