- •Тема №1 Типы данных, преобразование типов
- •Тема №2 Массивы, как параметры функций и процедур
- •Тема №з Условный оператор. Логические выражения
- •Тема №4 Функции и их использование
- •Тема №5 Оператор альтернативного выбора
- •Тема №6 Оператор цикла со счетчиком
- •Тема№7-8
- •Тема №9 Логические операторы и логические выражения. Тип boolean
- •Тема№10 Одномерные и двумерные массивы
- •Тема №11 Условный оператор
- •Тема№12 Процедуры. Глобальные и локальные переменные
- •Тема№13 Строковые переменные. Процедуры и функции для работы со строками
- •Тема№14 Двумерные массивы и вложенные циклы
- •Тема№15 Структура программы в языке Pascal
- •Тема№16 Операторы присваивания, ввода, вывода. Соответствие типов
- •Тема№17 Записи. Синтаксис описания записей
- •Тема№18 Сравнение массивов и записей. Работа с полями записей
- •Тема№19 Символьные переменные Операции и функции для работы с ними.
- •Тема №20 Арифметические выражения. Стандартные математические функции
- •Тема№21 Типизированные файлы. Процедуры и функции для работы с ними
- •Тема№22 Типы файлов. Процедуры и функции для работы с ними
- •Тема№23 Текстовые файлы. Процедуры и функции для работы с ними
- •Тема№24 Арифметические и логические операции и их приоритет
- •Тема№25 Область видимости переменных
- •Тема№ 26 Механизмы передачи параметров процедурам
- •Тема№ 27 Запись и чтение файлов. Открытие и закрытие файлов
- •Тема№28 Понятие алгоритма. Линейный, разветвляющийся, циклический алгоритмы.
- •Тема№29 Структурированные типы: массивы, строки, записи, файлы.
Тема№17 Записи. Синтаксис описания записей
Записи в Паскале – фиксированное число элементов одного или нескольких типов, то есть в отличие от массивов, в которых содержатся элементы одного типа, в записях могут содержаться элементы как одного, так и разных типов. Тема, например, сведения о книгах имеет структуру: автор, название книги, издательство, год издания, её цена. Первые три элемента относится к строковому типу данных, четвертый к целому, а цена - к вещественному типу. Элементами записей могут быть базовые типы, переменные, массивы, указатели, записи и т.д. Элементы записи вместе с их описанием называются полями записи. Над элементами записи можно выполнять действия, допустимые для данных этого типа.
Все записи должны быть описаны в разделе TYPE . Описание записи начинается со служебного слова RECORD заканчивается END, между которыми указывается список имен и типов полей, выбранных пользователем. Все идентификаторы полей в записи должны быть различными. Например, запись Воок можно описать следующим типом card:
TYPE card = record
Author : string [15];
Title: string [20];
Firm: string[10];
year : integer ;
cena : real
End;
VAR Book : card;
Тип записи (например, card) вводит только шаблон записи и с его именем не связан никакой конкретный обьект. Обращение к полю выполняется с помощью составного имени (селектора записи), которое состоит из :
Имя_записи . имя_элемента
Например, присвоить значения элементам записи Author и Title можно так: Book.author:=’Довгаль С.И.’; Book.title:=’Турбо Паскаль V 7.0’;
Ввод цены книги с клавиатуры : readln (Book.cena);
Для упрощения и сокращения записи составных имен используется оператор присоединения WITH. Имя записи выносится в заголовок оператора присоединения, а в блоке используются только имена полей записи. Общий вид оператора присоединения:
WITH имя записи DO оператор;
Предыдущие операторы можно записать проще:
With Book do begin
author:=’Довгаль С.И.’; title:=’Турбо Паскаль V 7.0’; readln (cena);
end;
Пример: Из ведомости 3-х студентов с их оценками ( порядковый номер, Ф.И.О. и три оценки) определить количество отличников и средний бал каждого студента.
Program Spic;
Type wed = record {Тип wed включает 3 поля: n, fio, bal}
n : integer ;
fio : string[40] ;
bal : array [1..3] of integer {Поле bal – массив из 3 оценок }
end;
Var spisok : wed ; {Запись spicok типа wed}
i, j, kol, s : integer; sr : real;
Begin
kol:=0; {kol- количество отличников}
With spisok do {with присоединяет имя записи spisok ко всем }
For i:=1 to 3 do { полям внутри цикла For по i }
begin
n:=i;
Write (' Vvedite FIO # ', i ,' ');
Readln (fio);
s:=0;
For j:= 1 to 3 do
begin
write ( 'Vvedite ocenky: ' );
readln ( bal [j] );
s := s+ bal [j];
end;
if s=15 then kol:=kol+1; {подсчет количества отличников}
sr := s/3; writeln ( fio, ', Sredniy bal = ', sr:4:1); end;
writeln ( ' Kolichestvo otlichnikov = ', kol );
readln;
end.
Тема№18 Сравнение массивов и записей. Работа с полями записей
Сравнение записей с массивами
В то время как массив – объединение компонент одинакового типа, в записи можно объединять компоненты различного типа. Сравните массив и запись:
type
numb = array[1..4] of integer;
date = record
month: 1..12;
day: 1..31;
year: integer;
week: (mo, tu, we, th, fr, sa, su)
end;
Переменные, определенных выше типов, содержат либо целые массивы, либо целые записи:
var
m, n: numb;
one, two: date;
Присваивание значений элементам массивов и записей также имеет некоторое сходство:
m[1] := 498;
n[3] := 637;
one.day := 25;
one.week := fr;
two.year := 2011;
Следует отметить, что записи сами могут быть элементами массива. Пример массива записей:
var
daysopen: array[1..10] of date;
Оператор With
Этот оператор используется для удобства работы с переменными типа record (запись).
Общий вид:
with a do st;
здесь a – имя переменной типа record, st – оператор.
В операторе st при ссылках на компоненты записи имя a можно опускать.
Пример. Для занесения даты рождения достаточно выполнить операторы:
with birthday[mother] do begin
month := 5;
day := 1;
year := 1965
end;
Запись с вариантами
Общий вид:
type v = record
a: type1
b: type2
……
case n: typen of
c1:(t11: type11;
t12: type12; …);
c2:(t21: type21;
t22: type22; …);
……..
end;
var z: v;
Здесь z – переменная типа v; n – переменная, называемая переключателем; typen – тип переменной n.
Этому же типу должны принадлежать метки c1 и c2. Каждой метке соответствует набор полей t11, …. Эти поля являются компонентами варианта.
Если какой-либо метке c вообще не соответствуют поля, то пишут c…: ( );
Замечания:
Любая запись (record) может иметь только одну вариантную часть (case).
Вариантная часть должна помещаться после постоянной части.
Среди идентификаторов полей не должно быть одинаковых.
Обращение к компоненте z.tij записи z происходит так:
Присваивается соответствующее значение c… переключателю n. В зависимости от значения n переменная z, помимо полей a, b, …, содержит те поля, которые соответствуют той метке c…, с какой совпадает значение n.
Выполняется операция с компонентой z.tij.
Пример. Пусть необходимо собрать следующие сведения о сотрудниках института: фамилию, дату рождения и, если есть семья, то фамилию и дату рождения супруги (супруга).
Эта информация может быть описана, например, записью person.
Пусть переменная типа kind может иметь одно из значений («женат», «холост»).
kind = (married, single);
person = record
name: string;
datebirth: date;
case yesno: kind of
married: (name1: string; date1: date);
single: ()
end;
Здесь name – строка символов; datebirth – запись, содержащая дату рождения; yesno – переключатель типа kind, который может принимать одно из двух значений: married либо single; name1 – строка символов, содержащая фамилию супруга(и); date1 – запись, содержащая дату рождения; single – пустое поле.
Если персона в браке, то будет присутствовать поле married, если нет – поле single. Паскаль допускает вложение вариантов в типе record.
Замечание. Перед засылкой информации в запись программист должен присвоить переключателю соответствующее значение. В противном случае информация в поле заслана не будет, и система никакой диагностики не выдаст.
Пример.
type
kind = (married, single);
date = record
day: 1..31;
month: 1..12;
year: integer;
end;
person = record
name: string;
datebirth: date;
case yesno: kind of
married: (name1: string; date1: date);
single: ()
end;
var
p: person;
begin
with p do begin
yesno := married;
name := 'panin';
with datebirth do begin
day := 14;
month := 5;
year := 1962
end;
case yesno of
married: begin
name1 := 'panina';
with date1 do begin
day := 30;
month := 12;
year := 1968
end;
end;
end;
end;
with p do
write(' ', name);
with p.datebirth do
writeln(' ', day, '/', month, '/', year);
with p do
write(' ', name1);
with p.date1 do
write(' ', day, '/', month, '/', year);
readln
end.