[ЗВУК] [ЗВУК]
Рассмотрим решение следующей задачи.
Нам дан список группы, который состоит из записей следующего вида.
Запись называется Student (студент), и каждое поле этой записи,
в свою очередь, представляет собой запись.
Первая запись называется «фамилия, имя, отчество» (Fio) и имеет поля sn,
fn и pn — second name, first name и parent name.
Далее у нас дата рождения.
Дата рождения у нас состоит из года, месяца и дня.
И как год, так месяц, так и день представляют собой целые числа.
Затем мы должны сформировать текстовый файл,
содержащий эти данные, и найти в этом файле самого молодого студента.
Будем записывать каждое поле каждой записи на отдельной строке.
Рассмотрим программу, которая решает эту задачу.
Она называется youngest — «самый молодой».
Мы введём константу lmax = 40.
Это максимальное количество студентов в группе,
и для записи student мы создадим тип.
Назовём его student, это будет запись.
Внутри неё поля также будут являться записями,
fio будет записью, состоящей из полей sn, fn и pn.
Это будут строки длиною 30.
Далее мы завершаем набор полей вложенной записи, то есть пишем end,
и описываем вторую вложенную запись, она называется dat.
Эта запись состоит из года, месяца и дня.
Для хранения этих данных я ввожу три переменных типа integer,
затем end закрывает у меня последнюю запись, второй end закрывает у
меня запись student, и после этого я ещё объявлю тип для группы.
Это будет массив от 1 до lmax, то есть максимально в нём будет 40 элементов,
состоящий из записи типа student.
Далее у меня файловая переменная, файл текстовый,
и name: string — это строка с именем файла.
Кроме того, я объявляю группу,
эта переменная будет называться gr и иметь тип group, это группа студентов.
Кроме того, у меня есть i1 и n,
это номер найденного студента, самого молодого, и это количества записей.
Ну это в данном случае я организую в главной программе.
В виде отдельной процедуры нужно оформить ввод данных,
и мне нужно будет найти самого молодого студента.
Для этого я использую функцию,
которая будет возвращать номер этого студента в списки группы.
Я считаю, что файл у меня не пустой, и, следовательно,
такой студент всегда будет найден.
На входе в эту функцию у нас количество студентов.
Это параметр-значение, потому что он не меняется от наших подсчётов,
и переменная gr — это массив записей,
она является параметром-переменной в целях экономии памяти.
Теперь нужно придумать, как мы с вами будем решать нашу задачу.
Понятно, что для того, чтобы найти самого молодого студента,
нам нужно сравнивать две даты рождения.
Дата рождения у нас состоит из года, месяца и дня.
Для того чтобы сравнить две даты, можно сначала сравнить годы.
У более молодого студента при разных годах год будет больше.
Если нам попались два студента с одинаковым годом рождения,
то мы должны будем сравнить месяц.
Если месяцы разные, то более молодой студент имеет больший месяц рождения.
При одинаковых годе и месяце мы должны будем сравнивать дни.
Теперь представьте себе, какой длины будет соответствующее выражение.
Оно будет очень большим.
Поэтому я предлагаю придумать более простой способ сравнения этих дат.
Для этого мы вычислим выражение,
которое будет содержать одновременно год, месяц и день рождения.
Сначала будут располагаться цифры года, затем будут располагаться
две цифры месяца, и далее будет располагаться день.
Понятно, что если мы сумеем вычислить такое значение для каждого студента,
то у самого молодого студента это выражение будет самым большим.
Итак, посмотрим, как мы это делаем.
Переменная i — это текущий номер студента,
переменная i1 — номер найденного студента с максимальной датой рождения,
pr — это наше выражение, которое содержит год месяц и день одновременно,
и max — это максимальное значение такого выражения.
Вначале max инициализируется нулем, i1 также инициализируется нулем.
Далее мы проходим по всем номерам студентов в группе,
от первого до последнего.
Для того чтобы можно было обращаться к полям нашей записи более коротким образом,
мы используем оператор присоединения with.
Мы пишем with gr[i], dat.
То есть у нас вами здесь присоединяться будет и выражение gr[i], и выражение dat.
То есть мы работаем с датой рождения, с вложенной записью.
Мы проделаем следующее действие.
Мы вычисляем наше произведение.
Мы берём год и умножаем на 10000,
то есть сначала следуют цифры года, а затем четыре нуля.
Далее мы умножаем месяц на 100 и прибавляем к году, умноженному на 1000.
Получаем первые 4 цифры года, затем 2 цифры месяца и ещё 2 нуля.
Потом мы прибавляем day, и в результате в нашей переменной у нас сначала цифры года,
потом цифры месяца, потом цифра дня.
Далее мы сравниваем значение этого параметра с максимумом.
Если оно больше максимального, то оно становится максимальным,
и запоминается номер студента, у которого была эта дата рождения.
Наше условие закрывается, затем закрывается наш оператор with,
и далее наша функция должна вернуть результат.
young присваивается i1, то есть результатом будет найденный номер
студента, и после этого наша функция заканчивается.
Далее рассмотрим процедуру, которая будет создавать файл.
Здесь у нас результатами являются количество
студентов и список группы, то есть массив, который содержит данные о студентах.
Переменная i — это текущий номер студента.
Первым делом мы запрашиваем количество студентов.
Оно у нас в диапазоне от 1 до lmax.
Мы его читаем и проверяем, что оно правильное.
Если данные введены неверно, происходит повторный ввод.
Затем мы должны ввести данные о студентах, выводим на экран соответствующее сообщение
и начинаем цикл по номерам студентов в группе, то есть for i: от 1 до n.
Поскольку у нас с вами наша структура представляет собой запись,
и в неё ещё вложено две записи, удобно использовать оператор присоединения with.
with gr[i]do, то есть сначала у нас будет присоединяться выражение gr[i],
а затем вложен ещё один оператор with — with fio do,
то есть ещё будет присоединяться fio при обращении к каждому полю.
Дальше мы проделываем для каждого поля следующие действия.
Выводим сообщение о том, какое это поле.
Например, первое поле — это фамилия.
Затем мы читаем её как строку и записываем на отдельную строку в файл.
Точно также поступаем с именем.
И точно так же поступаем с отчеством.
Затем мы закрываем наш последний begin end-ом.
То есть у нас теперь не будет присоединяться к обращению к полям
выражение fio, но gr[i] ещё продолжает присоединяться,
потому что соответствующий begin не закрыт.
Теперь мы работаем с датой рождения.
Аналогично мы выводим сообщение о том, какое поле нам нужно.
Первое поле из даты рождения — это год.
Затем мы вычитаем и записываем файл на отдельную строку.
Точно так же мы поступаем с месяцем и с днём.
Далее мы с вами закрываем последний оператор with,
а потом закрываем первый оператор with.
Таким образом, у нас в вами цикл по номерам студентов закрыт.
Далее наша процедура заканчивается, и мы рассматриваем процедуру,
которая будет данные из файла читать в массив.
Итак, здесь у нас результатом будет количество студентов и сам список группы,
сам массив, содержащий все эти данные.
Теперь мы проделываем следующие действия.
Переменная n (количество студентов) вначале равна нулю.
Мы с вами будем подсчитывать при вводе данных, сколько у нас было студентов.
Затем, пока не конец файла, мы с вами проделываем следующее действие.
Увеличиваем номер студента и опять используем
оператор присоединения with — with gr[n] do,
то есть мы работаем с полями записи gr[n] с текущим номером в нашей группе.
Далее мы записываем второй оператор присоединения with — with fio do и
читаем поля, которые относятся к fio.
Мы читаем из файла все три поля: фамилию, имя и отчество.
Далее наш последний begin закрывается end-м, то есть мы перестаём работать с
полями вложенной записи fio, а далее начинаем работать с полями dat.
Аналогично читаем все три поля, которые относятся к этой записи.
Это у нас год, месяц и день.
Закрываем последний оператор with, закрываем первый оператор with.
И далее у нас с вами заканчивается цикл, который проходил до конца файла.
И после этого наша процедура заканчивается.
Теперь рассмотрим главную программу.
Здесь мы запрашиваем имя файла,
устанавливаем связь между именем файла на диске и файловой переменной,
открываем файл для записи и вызываем первую процедуру make file.
Она читает данные с клавиатуры и создает файл, который содержит эти данные.
Далее файл закрывается и снова открывается, но уже для чтения.
Вызывается вторая процедура get data,
которая перенесет данные из нашего файла в массив.
Затем файл снова закроется,
и вызывается функция young, которая вернет номер найденного студента.
Мы считаем файл не пустым,
поэтому мы сразу выводим данные о самом молодом студенте.
И для самого молодого студента выводится его фамилия, имя и отчество.
На этом программа заканчивается.
Рассмотрим работу программы,
которая находит самого молодого студента в заданной группе студентов.
Для этого у нас есть константа (максимальное количество студентов в
группе), у нас есть тип для студента (эта запись,
содержащая вложенные записи) и у нас есть массив,
состоящий максимально из 40 студентов.
А так же переменные: f (текстовый файл, в которой мы будем
хранить данные о студентах), name (это строка с именем файла),
далее собственно группа и несколько счетчиков.
Наша функция young находит номер самого молодого студента,
мы считаем, что наш файл не будет пустым,
потому что при вводе данных о студентах мы запрашиваем количество
студентов и запрещаем вводить количество, меньшее чем 1 студент.
Далее процедура make file,
у нас предназначена для ввода данных о студентах.
Последовательно читаются все поля записей и размещаются в
текстовом файле по одному значению на каждой строке.
Процедура get data будет читать данные из файла и помещать их в массив.
Основная программа сначала запрашивает имя файла,
затем связывает это имя с файловой переменной f и открывает файл для записи.
Далее работает процедура make file,
которая создает группу данные, которые будут храниться в файле.
Затем файл закрывается и открывается вновь,
для того чтобы можно было из него читать.
Файл открывается на чтение.
Далее работает процедура get data,
которая прочитает данные из файла в массив, и затем файл снова будет закрыт.
После этого функция young возвращает нам номер самого молодого студента в группе.
В качестве результата выводится фамилия самого молодого студента.
Запустим нашу программу и посмотрим,
как она будет работать для некоторого набора исходных данных.
Пусть имя файла
будет student.txt.
Тип файла текстовый, и дальше я задаю количество студентов.
Допустим, пусть у меня будет 4 студента.
Ввожу данные о первом студенте: фамилия Иванов,
имя Иван, отчество Петрович.
Год рождения, допустим, 1999,
месяц 1-й и день 12-й.
Далее ввожу данные о втором студенте.
Сидоров Петр
Петрович.
Год рождения пусть тоже будет 1999,
месяц будет 4-й и день будет 3-й.
Далее ввожу данные еще об одном студенте.
Допустим, фамилия Петров
Петр Петрович.
Год рождения у него пусть будет
1990-й, месяц 1-й и день 1-й.
Ну и еще одного студента осталось нам ввести.
Скажем, Иванова Анна
Ивановна.
Год рождения пусть будет 1999-й,
месяц пусть будет 12-й и день пусть будет 1-й.
Таким образом мы получили, что самый молодой студент — это Иванова.
Это последняя запись, и дата рождения у этой студентки самая большая из введенных.
Теперь давайте посмотрим на содержимое файла student.txt.
Для этого мы должны его открыть.
И мы видим, что все данные, которые у нас были введены с клавиатуры,
размещаются в нашем файле по одному значению на каждой строке.
То есть нам с вами удобно хранить данные в файле.
Задав данные единственный раз, мы потом сможем просматривать эти данные.
Кроме того, изменять их или дополнять наш файл
новыми записями.
[ЗВУК]
[ЗВУК]