Хелпикс

Главная

Контакты

Случайная статья





begin. while not(eof (f)) do



var

<имя переменной>: <имя типа>;

Объявление переменной комбинированного типа

После этого чтобы обратиться к одному из полей записи указывается сначала имя записи, то есть имя объявленной переменной или элемента массива описанного типа, после которого ставится точка и указывается имя необходимого поля записи. То есть, как и в реальной жизни, сначала следует выбор объекта, а потом одной из его характеристик.

<имя переменной>.<имя поля>

Обращение к полю записи

Для примера опишем комбинированный тип данных, в котором будут хранится данные мальчиков школы. Для начала рассмотрим какие характеристики нам нужно указать для описания одного ученика. Прежде всего это фамилия и инициалы, а также его рост и вес. Также стоит указать дату рождения ученика.

Теперь, когда мы определились с необходимой информацией об учащихся, опишем тип данных. Назовём его uchenik. Дальше, через пробел, запишем знак равенства, а после него, через пробел, служебное слово record и сразу на следующей строке служебное слово end и точку с запятой. Между словами record и end опишем поля типа. В начале опишем поле для хранения фамилии и инициалов ученика. Назовём его fio. Через двоеточие после имени укажем тип поля. Очевидно, что это будет строковый тип данных – string. Предположим, что фамилия и инициалы ученика не займут больше 20 символов, поэтому укажем соответствующую максимальную длину строки. Дальше опишем 2 поля, в которых будет храниться рост и вес ученика. Назовём их соответственно rost и ves. Будем указывать их в сантиметрах и килограммах, целыми положительными числами. Очевидно, что для этого нам будет достаточно типа byte. В следующем поле будет содержаться дата рождения ученика. Назовём его dr. Однако очевидно, что для описания даты нам нужно будет не одно, а 3 числа. Поэтому позже для него опишем ещё один комбинированный тип, который так и назовём – data.

uchenik = record

fio: string [20];

rost, ves: byte;

dr: data;

end;

Описание типа uchenik

Так как тип data используется нами при описании типа uchenik, опишем его выше уже описанного нами типа. Это также будет комбинированный тип данных. Опишем его поля. Это будут численные поля. Первое поле будет содержать день. Назовём его d, и укажем его принадлежащим к ограниченному типу данных, содержащему целые числа на промежутке от 1 до 31. Второе поле назовём m, оно будет содержать номер месяца, поэтому укажем его принадлежащим к ограниченному типу, содержащему целые числа от 1 до 12. Третье поле – gбудет содержать номер года, укажем его принадлежащим к целочисленному типу word. Таким образом, мы описали тип данных для хранения информации об ученике школы.

data = record

d: 1..31;

m: 1..12;

g: word;

end;

Описание типа data

Мы разобрались с тем, как описывается комбинированный тип данных, но у вас мог возникнуть вопрос: «Как удобнее организовать ввод данных комбинированного типа, ведь эти данные могут иметь значительный объём, а их ввод с клавиатуры – долгий процесс, при котором достаточно легко допустить ошибку, причём в этом случае всё придётся начинать сначала?». Поэтому для ввода данных лучше заранее создать текстовый файл, в котором данные, необходимые для решения задачи, будут записаны определённым образом. Рассмотрим структуру файла, в котором записаны данные об учениках школы. Обратим внимание, что данные для каждой новой записи находятся в отдельных строках, а данные отдельных полей разделяются пробелами. При этом фамилии и инициалы учеников записаны также в отдельных строках. Это нужно потому, что при считывании строковой переменной, из файла считываются все данные до признака конца строки.

Структура файла с данными комбинированного типа

Задача: Написать программу, которая обрабатывает информацию о мальчиках школы и отбирает среди тех, кто родился в 2002 году кандидатов в баскетбольную команду школы, а также определяет среди кандидатов самого высокого. Рост кандидата в баскетбольную команду должен быть не меньше 170 сантиметров, а соотношение его роста и веса должно быть в промежутке от 2 до 2.8. Данные об учениках хранятся в файле, имя которого пользователь вводит с клавиатуры.

Напишем программу для решения задачи. Назовём её basketbolisty. Комбинированные типы данных, которые будут использоваться в программе уже описаны, поэтому опишем необходимые нам переменные. Прежде всего нам необходима переменная, для хранения данных о текущем ученике, назовём её student. Также нам понадобится переменная для хранения данных о самом высоком кандидате в баскетбольную команду. Назовём её basketbolist. Обе они будут принадлежать к описанному нами типу uchenik. Также нам потребуется файловая переменная, назовём её f, и строка в которой будет храниться имя файла – fn, и логическая переменная, с помощью которой мы будем определять есть ли кандидаты в баскетбольную команду, назовём её p.

Напишем логические скобки. Тело программы будет начинаться с того, что мы выведем на экран сообщение о том, что это программа, отбирающая кандидатов в баскетбольную команду школы и запрос на ввод имени файла, в котором хранятся данные о мальчиках школы. Дальше будет следовать оператор readln для считывания имени файла в строку fn и оператор assign, назначающий файловой переменной f файл, имя которого записано в строке fn. С помощью оператора rest откроем файл, назначенный переменной f, для чтения. Напишем оператор readln с параметром Эф, для того, чтобы пропустить первую строку файла, в которой написана шапка таблицы. Теперь обратимся к полю rost в записи basketbolist и присвоим ему значение 0, так как ни одного кандидата в баскетбольную команду мы ещё не отобрали. Присвоим переменной p значение false, предположив, что мы не найдём ни одного кандидата в баскетбольную команду.

Дальше напишем цикл, в котором мы будем считывать данные очередного мальчика и определять, является ли он кандидатом в баскетбольную команду. Это будет цикл с предусловием. Условием продолжения его работы будет то, что не достигнут конец файла, то есть not (eof (f)). В логических скобках запишем тело цикла. Оно будет начинаться со считывания данных очередного ученика. То есть запишем оператор readln для считывания из файла f для записи Студент значения поля fio. Теперь запишем оператор readln для считывания из файла для записи student полей: rost, ves, а также dr.d, dr.m и dr.g.

Теперь напишем условный оператор, который определяет, является ли ученик, данные которого мы только что считали, кандидатом в баскетбольную команду. В скобках запишем первую часть его условия – значение поля g в поле dr записи student равно 2002. Дальше запишем союз and и в скобках вторую часть условия – значение поля rost записи student больше 170. Дальше запишем союз and и в скобках напишем третью часть условия, которое также будет состоять из двух частей. В скобках запишем первую часть: значение поля rost записи student делённое на значение поля ves записи student больше или равно 2. После союза and запишем последнюю часть условия: соотношения роста и веса студента меньше либо равно 2.8.

Если это условие выполняется, то ученик является кандидатом в баскетбольную команду, поэтому после слова then в логических скобках запишем операторы, которые будут выполняться в этом случае. Запишем условный оператор, в котором в качестве условия с отрицанием будет записано значение переменной p. После слова then в этом условном операторе в логических скобках запишем два оператора: оператор writeln, который выводит на экран сообщение «Кандидаты в баскетбольную команду» с двоеточием, и оператор, присваивающий переменной p значение true. Этот условный оператор может сработать всего один раз, когда мы найдём первого кандидата в команду. Он выведет заголовок будущего вывода, и присвоит p значение «Истина», так как у нас есть кандидаты в команду. Напишем для вывода данных кандидата на экран, оператор writeln, который будет выводить на экран значение поля fio записи sudent. Точно также дополним оператор для вывода остальных полей записи: rost, ves, а также dr.d, dr.m и dr.g.

После этого мы проверим, является ли найденный кандидат в команду самым высоким, для этого сравним значение поля rost в записи student с соответствующим полем в записи basketbolist и если поле первой записи окажется больше, то присвоим переменной basketbolist значение переменной student. Такой оператор присваивания выполнится потому, что обе переменные принадлежат к типу uchenik. После цикла с помощью оператора close закроем файл и проверим, найден ли хотя бы один кандидат в баскетбольную команду. Для этого напишем условный оператор, условием которого будет значение переменной p. Если это условие выполняется, то мы нашли кандидатов в баскетбольную команду и после слова then запишем оператор write, который с соответствующим поясняющим сообщением будет выводить на экран фамилию, инициалы и рост самого высокого кандидата, которые содержатся в соответствующих полях записи Баскетболист. После слова else напишем оператор write, который будет выводить сообщение о том, что кандидатов в баскетбольную команду не найдено.

programbasketbolisty;

type

data = record

d: 1..31;

m: 1..12;

g: word;

end;

uchenik = record

fio: string [20];

rost, ves: byte;

dr: data;

end;

var

student, basketbolist: uchenik;

f: text;

fn: string;

p: boolean;

begin

writeln ('Программа, отбирающая кандидатов в баскетбольную команду школы. Введите имя файла, в котором хранятся данные о мальчиках школы.');

readln (fn);

assign (f, fn);

reset (f);

readln (f);

basketbolist.rost:=0;

p:=false;

while not(eof (f)) do



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.