Лекция

Тема: «Обработка записей в программах на 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;

SRBAL: Real

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, и также каждое поле выводится отдельно.

Оператор присоединения

Паскаль позволяет указать имя переменной типа «Запись» один раз, а затем обращаться к полям записи просто указывая их имена. Для этих целей предусмотрен оператор присоединения, который имеет вид:

With имя переменной типа «Запись» Do

операция по обработке поля записи;

Если требуется обработать не одно поле, а несколько, то все операторы по работе с полями записи заключаются в операторные скобки 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;

Begin

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;

SRBAL, STIP: Real

End;

{Описываем пользовательский тип «массив»}

Mas = Array [1..25] OF Stud;

{Описываем переменную типа «массив записей»}

Var A: Mas;

 

В данном примере описана переменная А, которая может содержать данные о 25 студентах.

Обработка массивов записей выполняется, как и обработка обыкновенных массивов в цикле поэлементно.

Пример. Составить программу, подсчитывающую количество хорошистов и отличников в группе и выводящую список этих студентов в виде таблица на экран.

Выводятся поля: фамилия, имя, отчество, размер стипендии

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем пользовательский тип «запись»}

Type STUD = Record

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

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.