лабораторные на Pasca (Кудрявцев)l
.pdfЗаписи |
133 |
|
|
With <список переменных–записей, полей> do <оператор>;
Имена переменных-записей и полей, указанные в заголовке опе- ратора присоединения, можно опускать при обращении к компо- нентам записей в области действия оператора with. Внутри операто-
ра к компонентам записи можно обращаться только с помощью имени компоненты.
Пример 10.
With x do begin
Re := 1.5;
Im := 1.7;
Y .Re := -Re;
Y .Im := -Im; end;
With Ivanov do Married := False;
Приведенный выше фрагмент эквивалентен фрагменту из примера 7, а фрагмент:
Пример 11.
With St.Birthday do begin
Day:= 25; Month:= Feb; Year:= 1977
end;
эквивалентен фрагменту из примера 9.
Записи могут входить в качестве компонентов в другие перемен- ные. Например, переменная Group - это вектор, состоящий из 30 за- писей. Оператор присваивания нового значения полю Month в пятой записи массива имеет вид:
Group[5].Birthday.Month := Feb;
Легко видеть, что к каждой записи (элементу массива) доступ осу- ществляется при помощи индекса. Приведенный ниже фрагмент программы подсчитывает число студентов мужского пола, родив- шихся в 1974 году:
134 |
Лабораторная работа № 12 |
|
|
Пример 12.
k := 0;
for i := 1 to 30 do
With Group[i].Birthday do
if (Year = 1974) and (Sex = Male) then k := k + 1; writeln('число мужчин = ', k:2);
Следует обратить внимание на то, что оператор присоединения стоит внутри цикла по i. Это объясняется тем, что в области дейст- вия оператора присоединения нельзя изменять элементы списка пе- ременных–записей и полей, указанные в заголовке. В данном при- мере в заголовке оператора With стоит Group[i] - элемент массива, зависящий от параметра i.
Тип запись может иметь вариантную часть. Вариантная часть запи- си может быть только одна и должна располагаться в конце записи.
Пример 13.
a) Type Sex = (Male,Female); Man = Record;
FirstName: String[25]; Born: 1800..2000; Mn: Sex;
Case sex of
Male: (Military: Boolean; Job: String[20]); Female: (Married: Boolean; Children: byte)
End;
Var
M1, M2: Man;
b) Type Figure = (Square, Triangle, Circle); Param = Record
x, y: real; Fig: Figure
Case Figure of Square: (side: real);
Triangle: (side1, side2, Angle: real); Circle: (Radius:real)
End;
Var
Kwadrat, Krug: Param;
Вариантная часть записи начинается оператором Case и следует за общей частью; после ее окончания в записи не могут появляться
Записи |
135 |
|
|
никакие другие поля, поэтому оператор Case не закрывается слу- жебным словом End.
Обычно некоторое из полей общей части указывает вариант. В примере (13.а) это поле Мn, называемое полем признака или дис- криминантом. Все варианты описываются внутри оператора Case.
Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонентов.
Перед списком стоит одна или несколько меток. Тип этих меток указывается в заголовке вариантной части (в отличие от оператора варианта, где селектором варианта является выражение, а не тип). Отметим, что тип должен быть скалярным, при этом он задается именем.
В явном виде указывать тип в заголовке не разрешается. Часто для сокращения записи поле признака (дискриминант) включается в за- головок вариантной части:
Case Mn: Sex of или Case Fig: Figure of.
Для переменной М1 типа Man можно написать следующие операто- ры присваивания:
M1.Firstname := 'Иванов'; M1.Born := 1911;M1.Mn := Male; M1.Military := True; M1.Job := 'Pilot';
Задав значение поля признака Mn (некоторую константу типа Sex), можно присваивать новые значения только полям вариантной час- ти, помеченным такой же константной. Хотя никакого контроля
поля селектора при обращении к компоненту из вариантной части не производится, для надежности работы программы следует при- держиваться этого правила.
Примечание. В стандартном Паскале в качестве ключа выбора не- обходимо указывать некоторую переменную порядкового типа, причем в исполняемой части программы можно присваивать значе- ния этой переменной и таким образом влиять на работу полей. В Тurbo Pascal также можно в поле ключа выбора описывать пере- менную порядкового типа и даже присваивать ей какое-либо значе- ние, однако это не повлияет на выбор поля: значения констант вы- бора могут быть в Тurbo Рascal произвольными и даже повторяю- щимися.
136 |
Лабораторная работа № 12 |
|
|
ВОПРОСЫ И УПРАЖНЕНИЯ
1.Какой тип характеризует объекты, называемые записями?
2.Могут ли компоненты записи быть различных типов?
3.К какому типу относится следующее описание? Назвать компоненты запи- си и их типы.
Book = Record Nazv: string[15];
Godizdan: 1000..1992;
Cena: real End;
4. Имеется описание
Type Family = Record
Glava: string[20]; Age: 18..100;
Children: array[1..2] of Record
Name: String[25];
Born: 1900..2000 End
End;
Занести исходную информацию в переменную А без использования операто- ра присоединения и продублироватьее в переменной В.
5. Известно, что
Type Time = Record
hour: 0..23; minute: 0..59; second: 0..59
End;
Var
T1, T2: Time;
Написать программу, которая вводит значения полей записей T1 и Т2 и печа- тает True, если Т1 предшествует Т2, и печатает False в противном случае.
6.Как осуществляется доступ к полям записей?
7.Что является селектором в операторе Case при задании вариантной части записи?
8.Могут ли записи входить компонентами в другие переменные?
9.Даны названия 15 ЭВМ. Для каждой ЭВМ известны объем памяти, стои- мость и быстродействие. Составить программу, которая вводит данные о всех ЭВМ, определяет, какая ЭВМ имеет минимальное отношение стои- мость/быстродействие, и печатает название этой машины и ее характеристи- ки.
Записи |
137 |
|
|
Перед выполнением контрольных заданий проанализируйте работу програм- мы, приведенной ниже. Программа Zap вводит информацию о пяти студен- тах: фамилию, год рождения, год поступления в вуз и оценки последней сес- сии. Результатом работы программы является список отличников. В про- грамме показаны возможности организации работы с записями с использова- нием оператора присоединения:
Program Zap; Uses Crt;
Const n = 3;
Type Student = Record
Surname: String[20]; Born: 1965..1978;
Year: 1988..1991; Mark: Record
Inf, Phys, Hist: 1..5 End
End;
Var
Group: array[1..5] of Student;
S1: Student; i, j: integer;
Begin
ClrScr;
Writeln('Вводите данные :'#61#61#62); With S1, Mark do
begin
for i:=1 to n do begin
write('фамилия - '); readln(Surname); write('Год.рожд., Год.пост., Отметки...'); readln(Born, Year, Inf, Phys, Hist);
Group[i]:= S1
end end;
writeln ('Список отличников:'); j:=0;
For i:=1 to n do
With Group[i], Mark do
if (Inf = 5) and (Phys = 5) and (Hist = 5) then begin
writeln(Surname,' Год рождения- ',Born:4,
' Год поступления- ',Year:4);
j:=j+1;
end;
if j=0 then writeln(‘Отличников нет’) End.
138 |
Лабораторная работа № 12 |
|
|
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1.Опишите структуры, показанные на рисунках, пользуясь словесными выражениями, например: “a подразделяется на b и c” и т.д. Затем то же сделайте на Turbo Pascal: объявите каждую запись, задавшись подходя- щими типами всех компонентов.
1) |
|
|
|
|
|
а |
|
|
|
|
|
|
2) |
x [1..10 ] |
|
|
|
|
|
|
||
|
b |
|
|
|
|
|
|
|
c |
|
y |
p |
|
|
z |
|
|
|
||||
d |
e |
|
|
h |
f [1..5 ] |
g |
t |
g |
|
|
q |
|
|
|
|
v |
||||||
|
|
|
|
|
||||||||||||||||||
3) |
|
|
|
|
s |
|
|
|
|
|
|
|
4) |
a |
|
|
|
|
|
|
|
|
|
t |
|
|
|
u [4..7 ] |
|
b |
c |
|
|
d |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
a |
c d |
|
b |
|
|
|
|
|
|
|
f e [1.. 3 ] |
g |
h |
|
k |
e |
||||||
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
f |
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
p q |
|
|
|
|
|
|
||||
5) |
|
|
|
|
|
x |
|
|
|
|
|
|
6) |
|
a |
|
|
|
|
|
|
|
|
|
|
y |
|
|
|
|
|
|
|
z |
|
b c |
e |
|
|
d |
|
f |
|
|
|
w |
v [1..10 ] |
|
|
r |
k |
g |
t j [ 1..5 ] |
|
m |
|
|
n |
||||||||||
|
|
|||||||||||||||||||||
|
|
|
|
|
|
g |
|
|
j |
|
t [1..5 ] |
|
|
o |
u |
|
p r |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
7) |
|
|
|
|
|
a [1..5 ] |
|
8) |
|
r |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
b |
|
c |
|
|
d |
|
s |
|
|
|
|
t |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
e |
f |
g |
|
|
|
|
|
|
p [1..5 ] |
q t e |
u |
|
v |
|
|
|
2.Описать комбинированный тип для представления следующего понятия:
1)сведения о 10 персонах (дата рождения: число, день недели, месяц, год; место жительства: город, улица, номер дома, номер квартиры);
Записи |
139 |
|
|
2)семинар (предмет, преподаватель, номер группы, день недели, часы за- нятий, аудитория);
3)бланк требования на книгу (сведения о книге: шифр, автор, название, год издания; сведения о читателе: номер читательского билета, фамилия; дата за- каза);
4)экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия студента, номер его зачетной книжки, оценка за экзамен);
5)сведения о 10 студентах группы (фамилия, имя, отчество; дата рождения: число, месяц, год; пол; семейное положение; отношение к воинской службе);
6)сведения о заводе-изготовителе компьютеров (название завода; название заводов-поставщиков комплектующих изделий; номера магазинов потреби- телей; название производимых ЭВМ (5..10 наименований): цена каждого то- вара за штуку в рублях и в долларах; количество каждого вида изделий в штуках);
7) сведения об ЭВМ (название; объем памяти; быстродействие, стоимость в рублях и в долларах; фирма поставщик; тип монитора и дисководов);
8)сведения о 5 персонах (фамилия, имя, отчество, пол, национальность, семейное положение, образование (высшее, среднее специальное, среднее, неполное среднее); адрес: улица, номер дома, номер квартиры, почтовый ин- декс, номер телефона).
9)сведения о заводе-изготовителе автомобилей (название завода, название заводов-поставщиков комплектующих изделий, номера фирменных магази- нов, марка производимых автомобилей, цена автомобиля в рублях - долла- рах, количество каждой выпускаемой марки автомобилей.
Каждому компоненту записи присвоить значение: a) с помощью оператора присваивания; b) используя оператор присоединения With.
Организуйте вывод значений компонент записи. 3.
1)распечатать анкетные данные студентов-отличников;
2)распечатать анкетные данные студентов, успевающих на 4 и 5;
3)распечатать анкетные данные студентов, получивших одну оценку 3 за все время обучения;
4)распечатать анкетные данные студентов, получивших в последнюю сес- сию оценки 2;
5)распечатать анкетные данные студентов, получивших в первую сессию все оценки 5;
140 |
Лабораторная работа № 12 |
|
|
6)распечатать анкетные данные студентов, получивших за все время обу- чения одну оценку 4, а все остальные оценки - 5;
7)распечатать список и даты рождения студентов, фамилии которых начи- наются с буквы 'А';
8)распечатать список студентов, фамилии которых начинаются с буквы 'Б'
иих оценки за все время обучения;
9)распечатать оценки в последнюю сессию студентов, фамилии которых начинаются с букв 'В' и 'Г';
10)распечатать фамилии и даты рождения студентов, не получивших ни одной оценки 3 за все время обучения;
11)упорядочить список студентов по среднему баллу последней сессии и распечатать его;
12)упорядочить список студентовпо среднему баллу и распечатать его;
13)вычислить средний балл группы и распечатать список студентов, имеющих средний балл выше среднего балла группы;
14)вычислить средний балл группы и распечатать список студентов, имеющих средний балл ниже среднего балла группы;
15)вычислить средний балл группы в последнюю сессию и распечатать список студентов, имеющих средний балл, равный среднему баллу группы.
16)упорядочить список студентовпо году рождения и распечатать его;
17)распечатать список студентов, упорядоченный по алфавиту;
18)распечатать список студентов, упорядоченный по месяцу рождения;
19)распечатать список отличников, упорядоченный по году рождения;
20)распечатать список студентов, упорядоченных по дате рождения.
141
Лабораторная работа № 13
ФАЙЛЫ
Файл – это поименованная часть памяти на внешнем носителе, предназначенная для хранения информации. Файл может быть свя- зан с любым источником или потребителем информации: клавиату- рой, принтером, магнитным диском и др. Будем рассматривать лишь стандартные файлы языка Turbo Pascal и дисковые файлы, созданные пользователем.
Стандартные файлы определены разработчиками системы и их можно только использовать.
Файлы пользователя размещаются на внешних носителях. В файлах могут храниться программы, данные, тексты документов, закоди- рованные изображения и т.п. Файл может быть входным или вы- ходным. Из входного файла программа получает данные, в выход- ной файл выводит их. Каждый файл имеет имя, зарегистрированное в директории (оглавлении диска).
Определение файлового типа. Файл с точки зрения языка Turbo Pascal – это структурированный тип данных, состоящий из после- довательности компонентов одного типа и одной длины. Определе- ние типа файла начинается словосочетанием file of, после которого задается тип компонентов файла, который описывает, что содержит данный файл. Далее следует идентификатор предварительно опре- деленного типа файла. Число компонентов, называемое длиной файла, не фиксируется.
Формат:
Type
<имя типа> = File of <тип компонент>; Var
<идентификатор>:<имя типа>;
Пример:
Type
Karta = File of Record
Dlina: byte;
Ves: real
End;
{здесь элементами} {файла объявлены} {данные типа ЗАПИСЬ}
142 |
Лабораторная работа № 13 |
|
|
Var
Kartfile: Karta;
Для описания файлов, состоящих из записей, можно использовать и другую форму, которая не вызывает ошибок даже у новичков.
Формат:
Type
<тип компонент> = Record <поле>:<тип>;
...
<поле>:<тип> End;
Var
FV: File of <тип компонент>;
{переменная для доступа к файлу}
RV: <тип компонент>;
{переменная для доступа к записи}
Пример:
Type
Zapis = Record
Nomer: integer; FIO: string[20]; Oklad: real
End;
Var
FV: File of Zapis; RV: Zapis;
Переменные файлового типа нельзя использовать в выражениях.
Файл хранится во внешней памяти и вызывается в оперативную память для обработки. Доступ к компонентам файла осуществляет- ся через указатель файла (буферную переменную). При чтении или
записи этот указатель перемещается к следующему компоненту и делает его доступным для обработки. Существует два способа дос- тупа к компонентам файла: последовательный и произвольный (прямой). При последовательном способе доступа поиск начинается с начала файла и проверяется по очереди каждый элемент, пока не будет найден нужный. Произвольный способ доступа позволяет обращаться к компонентупо его порядковому номеру в файле.