
- •А.В. Карташов, ю.А. Скоб, в.А. Халтурин, и.А. Трофимова, л.И. Черноштан, ю.К. Чернышев, о.В. Яровая информатика
- •Стандартные типы данных среды Турбо Паскаль и описание величин
- •Описание величин
- •Процедуры ввода данных
- •Процедура вывода данных
- •Порядок выполнения работы
- •Варианты заданий
- •Пример программы
- •Лабораторная работа № 2 выражения
- •Порядок выполнения работы
- •Задача 2
- •Задача 3
- •Лабораторная работа № 4 операторы цикла
- •Теоретические сведения
- •Вывод коэффициента рекуррентности q
- •Проверка правильности вычисления q
- •Варианты заданий
- •Лабораторная работа № 5 массивы
- •Теоретические сведения
- •Варианты заданий Задача 1
- •Задача 2
- •Лабораторная работа № 6 текстовые файлы
- •Теоретические сведения
- •Файл исходных данных Input8_1.Pas:
- •Лабораторная работа № 7
- •Теоретические сведения
- •Теоретические сведения
- •Лабораторная работа № 9
- •Теоретические сведения
- •Варианты заданий
- •Лабораторная работа № 10 модули
- •Теоретические сведения
- •Создание модуля
- •Файл исходных данных Input8_2.Pas:
- •Варианты заданий взять из лабораторной работы № 7 или № 9 по указанию преподавателя.
Теоретические сведения
Определение
Запись – структура, состоящая из конечного числа компонент, называемых полями.
Компоненты записи (поля) могут принадлежать разным типам. Компонента (поле) – переменная некоторого типа.
Описание.
а) type <имя типа> = record
поле1 : тип поля1;
поле2 : тип поля 2;
…………………………
поле n : тип поля n
end;
var a: <имя типа>;
б) var a: record
…..
end;
в) допускается переменные одного типа записывать через запятую:
Поле2, поле3 : тип полей 1 и 2;
Примеры:
Type TPoint = record
x : real;
y : real;
End;
Var Point: Tpoint;
Type TPoint = record
x,y : real;
End;
Var Point: record
x,y : real;
End;
Типизированные константы
При введении исходных данных в виде типизированных констант приходится использовать явное указание на идентификатор поля. Например, для ввода координат точки при использовании модуля GRAPH можно воспользоваться зарезервированным типом точки:
Type TPoint = record
x,y : real;
End;
Const Point : TPoint = (x : 2.0; y : -1.5);
Вызов в программе: <имя переменной>.<имя поля>, например, Point.х.
Имя поля неизменно во всей программе, если идентификатор рассматривается как идентификатор поля данной записи. Вне записи этот же идентификатор может означать совершенно другую величину.
Таким образом, имя поля как идентификатор может использоваться только совместно с записью:
<идентификатор записи >.< имя поля >.
Например, Var Point: record
x,y : real;
End;
x : string;
…
Point.x:=1.5;
x:=’some’;
Переменная х, описанная в программе, и Point.х – разные переменные.
Составные записи, поля-массивы, массивы записей
Поле записи может иметь тип «запись», «массив». Массив в свою очередь может состоять из записей. В качестве примера рассмотрим набор (массив) многоугольников.
Program Polygons;
Const MaxNumVert = 125;
MaxNumPol=125;
Type TPoint = record {точка}
x,y : real;
End;
TPolygon = record {многоугольник}
Num_vert : 1.. MaxNumVert; {количество вершин}
{вершины многоугольника}
Vertex : array [1.. MaxNumVert] of TPoint;
End;
{набор многоугольников}
Var Polygon : array [1.. MaxNumPol] of Tpolygon;
X : real;
…
Polygon[4].Vertex[2].x := x + Polygon[4].Vertex[2].x;
Polygon[4].Vertex[2].y:= 2+ Polygon[4].Vertex[2].y;
…
В приведенной программе x и Polygon[4].Vertex[2].x – различные числа, различные области памяти.
Оператор присоединения: with <имя записи> do <оператор>
Как видим, «добраться» до поля не так просто. Однако если в какой-то части программы осуществляют операции с конкретной записью, то можно упростить действия, применив оператор
WITH <Имя записи> DO.
Начиная с момента введения оператора WITH, имена полей указанной записи можно употреблять без указания имени текущей записи. Например, последний пример можно записать так:
with Polygon[4] do
begin
Vertex[2].x := x + Vertex[2].x;
Vertex[2].y:= 2+ Vertex[2].y;
End;
with Polygon[4] do
with Vertex[2] do
begin
x := Polygons.x + x; {имя программы}
y:= 2+ y;
еnd;
или так:
with Polygon[4].Vertex[2] do
begin
x := Polygons.x + x; {имя программы}
y:= 2+ y;
end;
При использовании оператора With могут происходить казусы, если некоторый Ваш идентификатор совпадает по имени с именем поля. Этого следует избегать путем изменения имени внешнего идентификатора (так как имя поля в описании жестко зафиксировано) или употребления имени программы в качестве расширения, как это сделано в последних примерах.
Пример:
Определить самого старшего рабочего бригады из нескольких (не более 10) человек, если сведения о рабочих включают:
фамилию;
год рождения.
Программа расчета:
program lab9; {ЧТЕНИЕ, ОБРАБОТКА И ВЫВОД ЗАПИСЕЙ}
uses crt;
type birthday=record {ТИП-ЗАПИСЬ}
name :string[15]; {ПОЛЕ-ИМЯ}
year :word {ПОЛЕ-ГОД РОЖДЕНИЯ}
end; {birthday}
arr=array[1..10] of birthday; {ТИП-БРИГАДА}
var a :arr; {ПЕРЕМЕННАЯ-БРИГАДА}
b :birthday; {САМЫЙ СТАРШИЙ}
n :byte; {КОЛИЧЕСТВО ВСЕХ РАБОЧИХ}
fi,fo :text; {ФАЙЛОВЫЕ ПЕРЕМЕННЫЕ}
{------- ПРОЦЕДУРА ЧТЕНИЯ ФАЙЛА: ----------------------------}
procedure Read_File ( var f:text; var a:arr; var n:byte );
{ВЫХОДНЫЕ ПАРАМЕТРЫ: ПЕРЕМЕННЫЕ a, n}
var i :byte;
begin
reset (f); {ОТКРЫВАЕТСЯ ФАЙЛ ДЛЯ ЧТЕНИЯ}
i:=0; {НАЧАЛЬНОЕ ЗНАЧЕНИЕ КОЛИЧЕСТВА ЗАПИСЕЙ}
while not SeekEOf(f) do {ЧТЕНИЕ ДАННЫХ ДО КОНЦА ФАЙЛА}
begin
i:=i+1; {ПОДСЧИТЫВАЕМ КОЛИЧЕСТВО ЗАПИСЕЙ}
with a[i] do readln (f,name,year);
end;
close (f);
end;
{------- ПРОЦЕДУРА ОБРАБОТКИ ИНФОРМАЦИИ: -------------------}
procedure Work ( a:arr; n:byte; var b:birthday );
{ВЫХОДНОЙ ПАРАМЕТР: ПЕРЕМЕННАЯ b --САМЫЙ СТАРШИЙ}
var i:byte;
begin {ПОИСК САМОГО СТАРШЕГО}
b:=a[1];
for i:=1 to n do
if a[i].year<b.year then b:=a[i];
end;
{------- ПРОЦЕДУРА ЗАПИСИ РЕЗУЛЬТАТОВ В ФАЙЛ: -------------}
procedure Write_File ( var f:text; a:arr; n:byte; b:birthday );
{ВСЕ ПАРАМЕТРЫ --- ВХОДНЫЕ}
var i:byte;
begin
rewrite (f);
writeln (f,' Ф.И.O. ГОД РОЖДЕНИЯ');
writeln (f,'------------------------------------------');
for i:=1 to n do
with a[i] do writeln (f, name:-15, year:9);
writeln(f); writeln (f,' САМЫЙ СТАРШИЙ:'); writeln(f);
writeln (f, b.name:-15, b.year:9);
close(f);
end;
{----------- ОСНОВНАЯ ПРОГРАММА --------------------------}
begin
clrscr;
assign (fi,'input9.pas'); {ИНИЦИАЛИЗАЦИЯ ФАЙЛА ИСХ. ДАННЫХ}
assign (fo,'output9.pas');{ИНИЦИАЛИЗАЦИЯ ФАЙЛА РЕЗУЛЬТАТА}
Read_File (fi,a,n); { ВЫЗОВ ПРОЦЕДУРЫ ЧТЕНИЯ ИЗ ФАЙЛА }
if n=0 then writeln ('ФАЙЛ ИСХОДНЫХ ДАННЫХ - ПУСТОЙ');
else begin
Work(a,n,b); { ВЫЗОВ ПРОЦЕДУРЫ ОБРАБОТКИ}
Write_File(fo,a,n,b);{ВЫЗОВ ПРОЦЕДУРЫ ЗАПИСИ В ФАЙЛ}
writeln('РЕЗУЛЬТАТЫ СМОТРИТЕ В ФАЙЛЕ OUTPUT9.PAS');
end;
repeat until keypressed;
end.
Файл исходных данных Input9.pas: |
Файл результата Output9.pas: |
Иванов И.И. 1975 Сидоров С.П. 1961 Петров М.И. 1974 Павлов Л.В. 1977 Потапов В.М. 1966
|
Ф.И.O. ГОД РОЖДЕНИЯ ------------------------------------------ Иванов И.И. 1975 Сидоров С.П. 1961 Петров М.И. 1974 Павлов Л.В. 1977 Потапов В.М. 1966
САМЫЙ СТАРШИЙ:
Сидоров С.П. 1961 |