Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

Записи

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;

Переменные файлового типа нельзя использовать в выражениях.

Файл хранится во внешней памяти и вызывается в оперативную память для обработки. Доступ к компонентам файла осуществляет- ся через указатель файла (буферную переменную). При чтении или

записи этот указатель перемещается к следующему компоненту и делает его доступным для обработки. Существует два способа дос- тупа к компонентам файла: последовательный и произвольный (прямой). При последовательном способе доступа поиск начинается с начала файла и проверяется по очереди каждый элемент, пока не будет найден нужный. Произвольный способ доступа позволяет обращаться к компонентупо его порядковому номеру в файле.