Лекция
Тема:
«Обработка записей в программах на Turbo Pascal»
План
1. Понятие записи и ее применение при описании
объектов
2. Описание типа «Запись» в программе
3. Операции над записями
4. Работа с массивами записей
1. Понятие записи и ее применение при описании
объектов.
Зачастую
почти все реальные
объекты описываются набором характеристик, каждая из
которых имеет свой
тип представления данных, но все
они относятся к одному объекту.
Например, объект студент может
быть описан несколькими характеристиками: ФИО (String),
Группа (String), Год
рождения (Integer), Средний балл (Real), Адрес (String) и т. д.
Паскаль
имеет возможность описывать один объект с разными характеристиками с помощью
одной переменной, имеющей тип «Запись». Данный тип позволяет включать в себя
набор переменных разных типов, которые, по сути, и являются характеристиками
объекта.
2. Описание типа «Запись» в программе
Для описания переменных данного вида в Паскале нет стандартного типа, поэтому необходимо вначале описать пользовательский тип «Запис»ь в разделе описания типов, а затем использовать его при описании переменных.
Описывается тип с помощью
описателя вида:
Имя
типа = Record
имя переменноq1, ..., имя переменнойN : тип1;
имя переменной1, ..., имя переменнойN : тип2;
. . .
имя переменной1, ..., имя переменнойN : типM
End;
Имена переменных принято называть полями записи. При обработке записей к этим полям обращаются по отдельности.
Например, для описания данных о студенте можно описать переменную вида:
Type
Stud = Record
FAM, IMYA, OTCH, ADRES: String [20];
GODROGD: Integer;
End;
Var A:
Stud;
В данном случае описана переменная А, которая содержит характеристики студента.
3. Операции над записями
Над
записями выполнимы все известные операции в Паскале. Только обработка
переменной типа «Запись» ведется отдельно по каждому из полей, и операции над каждым полем определяются в
зависимости от типа этого поля.
Для
обращения к нужному полю записи используют следующая команда:
имя
переменной.имя поля
Например:
A.FAM:='Иванов';
A.SRBAL:=4.5;
A.SRBAL:=A.SRBAL+1;
Для ввода используют операторы Read, Readln. Каждое поле записи вводится отдельно
Type Stud = Record
FAM, IMYA, OTCH, ADRES: String
[20];
GODROGD: Integer;
SRBAL: Real
End;
Var A: Stud;
Begin
Writeln ('Введите данные о студенте:');
Write ('фамилия - '); Readln(A.FAM);
Write ('имя - '); Readln (A.IMYA);
Write ('отчество - '); Readln (A.OTCH);
WRITE ('год рождения - '); Readln (A.GODROGD);
Write ('средний бал - '); Readln (A.SRBAL);
Write ('адрес - '); Readln (A.ADRESS);
End.
Вывод данных записи производится операторами Write, Writeln, и также каждое поле выводится отдельно.
Оператор присоединения
Паскаль позволяет указать имя переменной типа «Запись» один раз, а затем обращаться к полям записи просто указывая их имена. Для этих целей предусмотрен оператор присоединения, который имеет вид:
операция по обработке поля записи;
Если требуется обработать не одно поле, а несколько, то все операторы по работе с полями записи заключаются в операторные скобки Begin...End.
Например, для нашего фрагмента ввода данных можно было записать программу в виде
Type STUD = Record
FAM, IMYA, OTCH, ADRES: String
[20];
GODROGD: Integer;
SRBAL: Real
End;
Var A: Stud;
Begin
Writeln ('Введите данные о студенте:');
With A Do
Begin
Write ('фамилия - '); Readln(FAM);
Write ('имя - '); Readln (IMYA);
Write ('отчество - '); Readln (OTCH);
Write ('год
рождения - '); Readln (GODROGD);
Write ('средний бал - '); Readln (SRBAL);
Write ('адрес - '); Readln (ADRESS);
End;
End.
Пример: написать программу, которая позволяет ввести данные о студенте и, если средний бал студента не меньше 4, то записать размер стипендии по формуле: средний бал * 3.4. Распечатайте данные о студенте.
{Подключаем
модуль по работе с экраном}
Uses Crt;
{Описываем
пользовательский тип «запись»}
Type STUD = Record
FAM, IMYA, OTCH, ADRES: String
[20];
GODROGD: Integer;
SRBAL, STIP: Real
End;
{Описываем переменные}
Var A: Stud;
Writeln ('Введите данные о студенте:');
With A Do
Begin
{Вводим данные о студенте}
Write ('фамилия - ');Readln(FAM);
Write ('имя - '); Readln (IMYA);
Write ('отчество - '); Readln (OTCH);
Write ('год
рождения - '); Readln (GODROGD);
Write ('средний бал - '); Readln (SRBAL);
Write ('адрес - '); Readln (ADRES);
{Если балл больше либо равен 4}
If SRBAL>=4
Then
{то стипендия увеличивается в 3,4 раза}
STIP:=SRBAL*3.4;
Writeln;
{Выводим данные о студенте}
Writeln('Вы ввели следующие данные о студенте:');
Writeln('фамилия - ',FAM);
Writeln('имя - ',IMYA);
Writeln('отчество - ',OTCH);
Writeln('год рождения - ',GODROGD);
Writeln('адрес - ',ADRES);
Writeln('средний бал - ',SRBAL:4:2);
Writeln('размер стипендии - ',STIP:5:2);
End;
{Делаем паузу для просмотра результата}
Readln;
End.
4. Работа с массивами записей
При написании реальных программ оказывается, что одной записи для манипулирования реальными объектами недостаточно. Поэтому целесообразно использование совокупности записей. Так как эта совокупность описывает однородные объекты, то ее описывают в программах как одномерный массив записей. Для описания таких массивов вначале описывают тип «Запись», а затем описывают тип «Массив записей».
Например, для описания группы студентов, состоящей из 25 человек, можно воспользоваться описателями вида:
{Описываем
пользовательский тип «запись»}
Type STUD = Record
FAM, IMYA, OTCH, ADRES: String
[20];
GODROGD: Integer;
End;
{Описываем
пользовательский тип «массив»}
Mas = Array [1..25] OF Stud;
{Описываем
переменную типа «массив записей»}
Var A: Mas;
В данном примере описана переменная А, которая может содержать данные о 25 студентах.
Обработка
массивов записей выполняется, как и обработка обыкновенных массивов в цикле
поэлементно.
Пример. Составить программу, подсчитывающую количество хорошистов и отличников в группе и выводящую список этих студентов в виде таблица на экран.
Выводятся
поля: фамилия, имя, отчество, размер стипендии
{Подключаем
модуль по работе с экраном}
Uses Crt;
{Описываем
пользовательский тип «запись»}
FAM, IMYA, OTCH, ADRES: String
[20];
GODROGD: Integer;
SRBAL, STIP: Real
End;
{Описываем
пользовательский тип «массив»}
Mas = Array [1..25] Of Stud;
{Описываем
переменные}
Var A: Mas;
I, N, K: Integer;
Begin
{Очищаем
экран}
ClrScr;
{Вводим количество студентов для обработки}
Write ('Введите количество студентов в группе: ');
Readln (N);
{В цикле вводим данные о группе студентов}
For I:=1 To N Do
Begin
Writeln ('Введите данные об ',i,'-м студенте:');
With A[I] Do
Begin
Write ('фамилия - ');Readln(FAM);
Write ('имя - '); Readln (IMYA);
Write ('отчество - '); Readln (OTCH);
Write ('год рождения - '); Readln (GODROGD);
Write ('средний бал - '); Readln (SRBAL);
Write ('адрес - '); Readln (ADRES);
End;
{Вначале количество равно 0}
k:=0;
Writeln;
{Выводим шапку таблиц}
Writeln('
':7,'Фамилия',' ':15,'Имя',' ':14,'Отчество',' ':14,'Стипендия');
For I:=1 To N Do
With A[I] Do
{Если средний балл студента не меньше 4}
If SRBAL>=4 Then
Begin
{Количество увеличивается на 1}
K:=K + 1;
{Выводим в строку данные о студенте}
Writeln (fam:20,imya:20,
otch:20,stip:5:2)
End;
Writeln;
{Выводим на экран найденное количество}
Writeln ('Количество отличников и хорошистов равно: ',k);
End.