- •Первый семестр
- •Дальнейшее обучение программированию (по семестрам)
- •Рекомендуемая литература
- •I семестр Лекция 1
- •1.1 Алгоритм. Понятие алгоритма
- •1.2 Алгоритмические языки
- •1.3 Запись алгоритма
- •1.4 Элементарные структуры
- •Лекция 2
- •2.1. Договоренности о синтаксисе
- •2.2. Текст программы на Turbo Pascal
- •2.3 Элементарные операции
- •2.4. Таблица перевода для структур
- •Алгоритм:
- •Текст программы
- •2.5 Практические рекомендации по решению задач
- •3.2. Частные случаи для структуры цикла
- •3.3 Массивы
- •Лекция 4
- •4.0 Требования к защите бальных задач
- •4.1 Начало систематического изложения Turbo Pascal (tp)
- •Лекция 5
- •5.1 Простые типы данных
- •5.1.1 Перечислимый тип
- •5.1.2 Интервальный тип
- •5.1.3 Целочисленные типы
- •5.1.4 Данные типа char
- •5.1.6 Вещественные типы данных
- •Лекция 6
- •6.1 Структура программы на Паскале
- •6.2 Процедуры для стандартного ввода/вывода
- •6.3 Массивы. Регулярный тип
- •6.4 Для работы с массивами – шаблоны
- •Лекция 7
- •7.1 Строки
- •7.2 Записи
- •Лекция 8
- •8.1 Множества
- •8.2 Файлы
- •8.3 Процедуры открытия и закрытия файлов:
- •8.4 Процедуры ввода/вывода:
- •Лекция 9
- •9.1 Текстовые файлы.
- •9.2 Проект программы:
- •9.3 Простейший сканер.
- •9.4 Копия любого файла
- •Лекция 10
- •10.1 Процедуры и функции
- •10.2 Передача параметров в процедуры и функции
- •10.3 Глобальные переменные. Перекрытие (экранирование)
- •10.4 Процедурные типы
- •10.6 Рекурсия. Косвенная рекурсия
- •Лекция 11
- •11.1 Статическая и динамическая память программы
- •11.2 Динамическая память (куча, heap) с точки зрения тр
- •11.3 Операции над указателями
- •11.4 Пояснения с помощью картинки
- •11.5 Динамическая цепочка
- •Лекция 12
- •12.1 Цикл жизни программы. Проект программы
- •12.2 Характеристики качества программ
- •12.3 Программное окружение
- •12.4 Модули
- •Пример Печать данного перечислимого типа. Вот простой пример модуля (пусть имя файла с представленным ниже текстом My_Unit.Pas):
- •12.5 Обзор модуля System
- •12.5.1 Процедуры и функции, обслуживающие файловую систему
- •Лекция 13
- •13.1 Модуль crt - средства работы с экраном, клавиатурой и др.
- •13.2 Обзор примеров программ
- •13.3 Процедуры и функции модуля Crt
- •Лекция 14
- •14.1 Модуль dos - работа с файловой системой.
- •14.1.1 Прерывания.
- •14.1.2 Процедуры и функции модуля Dos
- •Лекция 15
- •15.1 Модуль Graph.
- •15.1.1 Общие сведения:
7.2 Записи
Запись - структура данных, содержащая конечное число компонент различного типа. Компоненты называются полями. Как любой тип, определяемый программистом, тип "запись" должен быть объявлен в разделе TYPE. При описание типа запись указывает тип каждого поля и идентификатор, который именует поле. Тип данных RECORD предоставляет возможность объединить в одну связанную структуру различные по типу и смыслу поля, причем элементами записи могут быть и структурированные типы данных, например массивы и другие (подчиненные) записи. Для обработки доступна как вся запись целиком, так и отдельные поля.
Описатель записей:
RECORD <фиксированная часть> <вариантная часть> END
Здесь фиксированная часть записи состоит из списка имен полей с указанием типа данных, к которым эти поля относятся. В описании записи хотя бы одна из необязательных частей (фиксированная или вариантная) должна присутствовать.
Примеры записей, содержащих только фиксированную часть:
TYPE
REC = RECORD
A, B : INTEGER;
C : CHAR
END;
DATE = RECORD
DAY : 1..31;
MONTH : 1..12;
YEAR: 1900..2100
END;
Если VAR X:REC; Y, Z:DATE; то к полям записей X, Y и Z имеется доступ по имени поля. Например, X.A - поле A записи X, элемент типа INTEGER.
Инициализация записи - инициализация всех полей записи Y.DAY := 17; Y.MONTH := 3; Y.YEAR := 1992;
Если запись Y инициализирована, то можно ее использовать в правой части оператора присваивания Z := Y ; Z и Y совместимы по присваиванию, поскольку относятся к одному и тому же типу данных.
Посмотрите, как используется запись в программе Datas лекции 5.
Вариантная часть всегда следует за фиксированной, если она есть.
CASE <тег:> тип of <список описаний вариантов>
Описание варианта - это константное значение или диапазон константных значений, относящихся к типу «тип» описания вариантной части. Далее ставится двоеточие, и в скобках - описание полей варианта. Описание полей варианта осуществляется по тем же правилам, что и полей фиксированной части. Имена всех полей должны быть уникальными идентификаторами внутри записи.
Следующий пример показывают способ задания поля тега.
TYPE SHAPE = (TRIANGLE, RECTANGLE, SQUARE, CIRCLE);
COORDINATES = RECORD { фиксированная часть }
X, Y, AREA : REAL;
CASE S : SHAPE OF { вариантная часть }
TRIANGLE : (SIDE : REAL; BASE : REAL);
RECTANGLE: (SIDEA, SIDEB : REAL);
SQUARE : (EDGE : REAL);
CIRCLE : (RADIUS : REAL)
END;
В памяти поля разместятся как показано на рисунке
фиксированная часть |
вариантная часть |
||||
X |
Y |
AREA |
S |
SIDE |
BASE |
X |
Y |
AREA |
S |
SIDEA |
SIDEB |
X |
Y |
AREA |
S |
EDGE |
- |
X |
Y |
AREA |
S |
RADIUS |
- |
Если S = RECTANGLE, то доступны поля SIDEA и SIDEB. Например, при инициализации записи:
X : COORDINATES;
X.S := RECTANGLE;
X.SIDEA := 17.5;
X.SIDEB := 20.4;
В стандартном языке Pascal (и в TP) можно вообще не указывать поле тега:
COORDINATES RECORD
X, Y : REAL; { фиксированная часть }
AREA : REAL;
CASE SHAPE OF { вариантная часть }
END
В этом случае можно обращаться к любым полям вариантной части по имени, однако ответственность за правильность трактовки данных возложена на программиста.
Проанализируйте самостоятельно следующий пример:
program record_;
type
T_education=(begining,medium,higher);
T_profession=(teacher,driver,woker);
T_category=(A,B,C,D);
T_anketa=
record
name :string[20];
case profession:T_profession of
teacher:(education:T_education;
pedagogical_length_of_service:byte);
driver :(licence:record
case drivers_licence:boolean of
true :(category:T_category;
drivers_length_of_servie:byte);
false:(drivers_school:string[20])
end);
woker :(specialization:string[20];
class:string[20])
end;
var a1,a2,a3:T_anketa;
begin
writeln(sizeof(T_profession)); {1}
writeln(sizeof(T_anketa)); {64}
a1.name:='Ivan';
a1.profession:=teacher;
a1.education:=higher;
a1.pedagogical_length_of_service:=1;
a2.name:='Vlad';
a2.profession:=driver;
a2.licence.drivers_licence:=true;
a2.licence.category:=B;
a3.name:='Mike';
a3.profession:=woker;
a3.specialization:='shoe-maker';
a3.class:='master';
end.
Оператор присоединения WITH позволяет один раз указать имя записи и обращаться непосредственно к полям записи. Синтаксис оператора WITH:
WITH <список переменных> DO <оператор>,
где в списке «список переменных» указываются имена записей.
Например, если Y запись типа DATE (см. пример выше), то значения полям этой записи можно присвоить так:
WITH Y DO BEGIN
DAY :=17; MONTH := 3; YER := 1992
END;
Оператор WITH V1, V2,...,Vn DO S;
эквивалентен последовательности операторов присоединения
WITH V1 DO WITH V2 DO ... WITH Vn DO S;
Вот как массив строк может помочь распечатать (выдать на экран) данное перечислимого типа (день недели 1 января 1901 года):
program datas;
type
week_day=(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday);
dat=1..31;
month=(January,Fabruary,March,April,May,June,July,
August,September,October,November,December);
year=1900..2100;
attr_of_day=record
w_d:week_day;
d:dat;
m:month;
y:year
end;
var
today:attr_of_day;
kol:integer;
prn_week_day:array[week_day] of string[9]
function pred_week_day(w:week_day):week_day;
begin
if w=Monday then pred_week_day:=Sunday else pred_week_day:=pred(w)
end;
function pred_month(m:month):month;
begin
if m=January then pred_month:=December else pred_month:=pred(m)
end;
procedure pred_dat(var t:attr_of_day);
begin
if t.d=1 then
begin
t.m:=pred_month(t.m);
if t.m=December then t.y:=t.y-1;
case t.m of
January,March,May,July,August,October,December:t.d:=31;
Fabruary:if (t.y mod 4)=0 then t.d:=29 else t.d:=28;
April,June,September,November:t.d:=30
end
end else t.d:=t.d-1;
t.w_d:=pred_week_day(today.w_d);
end;
begin
prn_week_day[Monday]:=’Monday’
prn_week_day[Tuesday]:=‘Tuesday’
prn_week_day[Wednesday]:=‘Wednesday’
prn_week_day[Thursday]:=‘Thursday’
prn_week_day[Friday]:=‘Friday’
prn_week_day[Saturday]:=‘Saturday’
prn_week_day[Sunday]:=‘Sunday’
today.w_d:=Monday;
today.d:=2;
today.m:=October;
today.y:=2006;
repeat
pred_dat(today);
if (today.y<=2000) and (today.w_d=Monday) and (today.d=13)
then kol:=kol+1;
until (today.y=1901) and (today.m=January) and (today.d=1);
writeln('Kol= ',kol:4);
writeln(prn_week_day[today.w_d])
end.