[ЗВУК]
Рассмотрим решение следующей задачи.
Нам нужно создать типизированный файл для хранения вещественных чисел,
а затем прочитать этот файл и вычислить максимальное отрицательное число.
Мы с вами сделаем создание файла отдельной процедурой,
а чтение данных из файла оформим также в виде отдельной процедуры.
Поскольку две эти процедуры не вызывают друг друга,
мы можем с вами записывать эти процедуры в произвольном порядке.
Здесь у меня используется глобальная переменная f,
это файловая переменная, file of real представляет собой
типизированный файл для хранения вещественных чисел.
Начну с процедуры вывода значений из файла на экран.
Для этого я должна их прочитать и по одному вывести на экран.
На входе у этой процедуры находится файловая переменная для
типизированного файла.
Я беру локальную переменную c вещественного типа,
это значение, которое будет считываться из файла.
Далее файл открывается для чтения,
и если конец файла уже достигнут,
то есть если eof стоит сразу вначале файла, я сообщаю об этом.
Если eof (f) сразу после открытия, то тогда файл пуст.
В противном случае можно его обрабатывать.
Я вывожу сообщение о том, что файл содержит числа,
и дальше я их буду читать по одному и выводить на экран.
Пока конец файла не будет достигнут, выполняется следующее действие.
Читаются данные из файла.
Очередное значение читается в переменную c,
затем значение c выводится на экран по формату 8:3, и на этом
заканчивается составной оператор, то есть заканчивается цикл пока не конец файла.
Для красоты перейдем на следующую строчку, потому что числа из файла выводились в
одну строку, а дальнейший вывод будет тогда начинаться со следующей строки.
Затем закрывается условие того,
что файл существовал и закрывается, собственно, файл.
После этого текст процедуры заканчивается.
Вторая процедура будет создавать файл, то есть мы будем читать данные с
клавиатуры и записывать эти данные в типизированный файл.
На входе у нас файловая переменная f, это file of real,
и локальные переменные — это строка с именем файла,
это текущее число, и это переменная code,
которая потребует нам для того чтобы проверить правильно ли произошел ввод.
Итак, мы в данном случае будем считать,
что признак окончания ввода данных будет не число, а буква.
Мы будем вводить числа в столбец по одному и до тех пор,
пока у нас на входе вместо числа не будет буква или некоторое значение,
которое нельзя преобразовать в число, мы будем данные записывать в файл.
Сначала нам нужно связать наш файл в программе с файлом на диске.
Это производится при помощи стандартной процедуры assign.
Затем мы открываем цикл с постусловием и читаем данные следующим образом:
сначала мы прочитываем очередную строку в переменную s,
далее мы пытаемся преобразовать значение этой переменной к числу.
Если преобразование прошло успешно, то значение переменной code равно 0.
В этом случае мы записываем наше число в файл.
И эти действия будут повторяться до тех пор,
пока мы не получим код, отличный от 0.
То есть до тех пор, пока вместо числа не будет введена буква или некая
последовательность символов, которую нельзя преобразовать в число.
Затем файл закрывается, для пользователя выводится сообщение о том,
что файл сформирован, и наша процедура завершается end-м.
И третья процедура, называется count — это,
собственно говоря, подсчет результата.
На входе у нас файловая переменная и здесь у
нас используются переменные c и максимум.
c — это текущее число, а максимум — это максимальное отрицательное число.
Начальным значением максимума выберем 0.
Понятно, что конечный результат не может быть равен 0, и вот эта переменная
максимум будет у нас использоваться так же в роли некоего флага.
Затем мы открываем файл для чтения и производим следующие
действия: сначала мы читаем данные из файла,
а потом проверяем следующее условие — если элемент отрицательный,
то есть мы будем сравнивать это число с максимальным,
и дальше должно быть выполнено одно из двух условий.
Максимум равен 0, то есть до этого еще не было отрицательных чисел,
или c больше максимума, то есть текущее значение превышает максимальное.
Если выполнены эти условия, то максимум приобретает значение, равное c.
Иными словами говоря, на первом же шаге, на котором число будет отрицательное,
у нас текущее значение максимума заменится на это число,
и дальше мы будем сравнивать уже с элементом, который был прочитан из файла.
Если ни одного отрицательного числа нам не попадется, то значение максимума останется
равным 0 и, следовательно, мы сможем понять, что мы не нашли результата.
Действия у нас продолжаются до тех пор, пока мы не встретим конец файла,
затем мы его закрываем и проверяем существование результата.
Если максимум остался равным 0, то тогда мы выводим сообщение о том,
что отрицательных чисел нет.
В противном случае выводится сообщение о том, что максимум из отрицательных чисел,
расположенных в файле, имеет значение нашей переменной максимум.
И далее эта процедура завершается end-м.
Теперь рассмотрим основную программу.
Основная программа вызывает три процедуры — создание файла, вывод данных,
которые расположены в файле на экран и процедуру count,
которая подсчитывает результат.
Она завершается end с точкой.
Рассмотрим работу программы, которая ищет максимальное из отрицательных чисел,
расположенных в типизированном файле.
Переменная f у нас file of real, то есть типизированный файл.
Процедура prn — это вывод содержимого файл на экран.
Процедура make file — это формирование файла.
Здесь у нас данные вводятся с клавиатуры,
причем данные будут вводиться по одному числу на строке,
и признаком того, что ввод данных завершен будет не число, ну, например, буква.
После того, как файл у нас сформирован, он будет закрыт.
Имя файла в данном случае задано как константа, он называется f.txt.
Не смотря на то, что файл типизированный, ему дано расширение txt,
что бы мы могли его открыть, например, при помощи блокнота.
Затем процедура count, которая подсчитывает результат и
выводит результат на экран.
Начальным значением максимума у нас является 0 и если это
значение сохраняется после вычислений,
тогда выводится сообщение о том, что отрицательных чисел нет.
В противном случае мы выводим полученное значение максимуму.
Запустим нашу программу и посмотрим, как она работает в различных случаях.
Итак, начнем с файла в котором есть отрицательные числа.
Ввожу числа: 12, каждое на отдельной строке,
–34, 16, 0,
–3, –70,
и для завершения ввода я нажимаю букву.
Файл у нас сформирован, далее на экран выведены числа,
которые в нем содержатся, и максимумом из отрицательных чисел
является –3, то есть число ближайшее к 0.
Файл, напомню, назывался у нас f.txt.
Давайте мы попробуем открыть этот файл и посмотреть, что в нем содержится.
Этот файл у нас находится в той же самой рабочей директории.
Вот он файл f… И мы с вами видим, что никаких чисел в файле рассмотреть нельзя.
Здесь находятся некоторые последовательности символов,
которые совершенно не похожи на числа.
И для типизированного файла это правильно.
Здесь данные хранятся в двоичном виде, поэтому мы с вами можем рассматривать
этот файл, но редактировать, то есть заменить числа на другие, мы не сможем.
Теперь давайте вернемся к нашей программе.
Запустим ее еще раз и попробуем задать другие данные.
Итак, например, я ввожу только положительные числа и нули: 1,
56, 0 и 187.
Затем завершаю ввод данных.
Мы видим, что файл сформирован, все числа, которые мы поместили в файл,
выведены на экран, но при этом получено сообщение «Отрицательных чисел нет».
То есть в данном случае у нас такой набор тестовых данных,
для которых нельзя получить результат.
Напоминаю, что во всех случаях, когда получить результат нельзя,
нам нужно обязательно предусмотреть сообщение о том, что результат не получен.
Чтобы пользователю было понятно, чем завершилась
работа программы.
[ЗВУК]
[ЗВУК]