В Паскале нет разницы между последовательными и произвольными файлами, все файлы можно считать обновляемыми. Существуют две процедуры открытия файлов в Паскале:
а) открытие имеющегося на диске файла. Её формат:
Reset (<файловая переменная>);
Если такой файл не найден на диске, выдается сообщение об ошибке
б) Открытие файла, которого на диске нет.
Rewrite (<файловая переменная>);
Если файл с указанным именем есть на диске, то он уничтожается, при этом сообщение об удалении может выдаваться, а может и нет, в зависимости от настройки системы.
2) Ввод-вывод записей файла
B BASICе ввод записей файла выполняется следующим оператором:
INPUT # n, <список ввода>
Этот оператор используется для файла, тип которого при открытии был задан INPUT. Списком ввода здесь являются простые переменные, записанные через запятую. Количество переменных в списке и их типы соответствуют структуре вводимой записи.
Для файлов типа OUTPUT, то есть выходных, используется оператор вывода записей следующего формата:
PRINT #n, <список вывода>
Особенностью файлов типа INPUT и OUTPUT является то, что оба они – текстовые, причем значения полей (реквизитов) в записи должны разделяться запятыми. Поэтому в операторе PRINT список вывода должен содержать между выводимыми значениями текстовую константу ",", например:
PRINT # 1, A, ",", B
Для устранения этого недостатка в Бейсик введен еще один оператор вывода в файл вида
WRITE #n,<список вывода>,
в котором не требуется константы "," между выводимыми величинами, например
WRITE # 1, A, B.
В Pascal:
чтение записи – READ (<файл переменной>, <сп. ввода>);
вывод записи – WRITE (<файл переменной>,<сп.вывода>)
INPUT “… for INPUT…”
PRINT “… for OUTPUT…”
WRITE “… for OUTPUT…”
К записям последовательных файлов в Бейсике возможен только последовательный метод доступа, т.е. записи обрабатываются по порядку с 1-й до последней. Для определения момента считывания последней записи файла используется логическая функция EOF (end of files). Её вид:
EOF (файловая переменная)
Для последовательного метода доступа в программах Бейсика организуется стандартный цикл вида:
WHILE NOT EOF (#n)
<чтение и обработка записи>
WEND
В Паскале для организации последовательного метода доступа организуется аналогичный цикл
WHILE NOT EOF (<фп>) do <чтение и обработка записи>;
Рассмотрим возможности языков при обработке файла с прямой организацией
Сначала в Бейсике
В Бейсике, как сказано выше, файл с прямой организацией открывается при выборе типа файла RANDOM. Для ввода записей существующего прямого файла используется оператор
GET #n, <номер записи>, <запись>
т.е. адресом записи прямого файла в Бейсике является просто его номер. Номер первой записи файла в Бейсике равен 0. Для того, чтобы вывести запись прямого файла, надо использовать оператор
PUT #n, <номер записи>, <запись>
Примечания:
1)В операторах INPUT, PRINT и WRITE можно записывать в списке вывода только переменные простых типов. Для того, чтобы ввести и вывести запись последовательного файла, надо перчислить все поля (реквизиты) этой записи.
2) в файле RANDOM в качестве входного или выходного списка можно использовать переменные любого типа, в том числе и структуры. Например:
PUT #1,5, Stud1
3)Номер записи в GET, PUT может отсутствовать (стоят “), тогда PUT и GET работают с очередной записью файда.
Иногда в задачах требуется начать обработку файла с некоторой записи, о которой известен её номер. Для этого в Бейсике используется оператор поиска нужной записи, имеющий вид:
SEEK #n, <номер записи>
Прямой файл, как уже говорилось, можно обрабатывать произвольно, можно последовательно. Приведем пример цикла последовательной обработки части прямого файла с 5-й записи до конца:
SEEK #1,5
WHILE NOT EOF (#1)
GET #1,,<запись>
<обработка записи>
WEND
Все о прямом файле в Бейсике.
Теперь в Паскале
Каждому файлу в Паскале поставлен в соответствие так называемый указатель файла, который принимает значение номера записи, которая готова к обработке (вводу или выводу). Номера записей в Паскале начинаются с 1.
Как говорилось, в Паскале каждый файл является как последовательным, так и прямым. Поэтому операторы вводы и вывода и для последовательной обработки, и для произвольной одни и те же: READ и WRITE. В этих операциях нет номера записи файла, как в Бейсике, они работают с той записью, на которой указывает указатель.
Если требуется выбрать для обработки нужную запись по ее номеру, то можно использовать, процедура установки значения указателя, внешне напоминающую бейсиковскую:
SEEK (<файловая переменная>;<номер записи>);
Например, SEEK (f,1)
Поскольку в процедурах ввода-вывода указатель не присутствует, иногда возникает необходимость выяснить номер позиции, где находится этот указатель (номер записи). Для этого в Pascal есть специальная функция:
FilePoz (<файловая п.>) – возвращает положение указателя (номер записи, готовой к обработке)
Например, SEEK (f, FilePoz (f)-1) возвращает на одну запись назад.
3) Операция закрытия файла.
И в Бейсике, и в Паскале закрытие файла осуществляется практически одинаково: в Бейсике оператором
CLOSE #n
в Паскале процедурой
Сlose (<файловая переменная>);
После выполнения этих операций доступ к записям файла запрещен.
7. Принципы структурного программирования
Модуль = основной модуль = головной модуль = главный модуль.
Помимо этого модуля существуют другие типы модулей. Всякая реальная задача при её решении разбивается на множество подзадач, имеющих логически завершенную структуру (т.е. свои исходные данные, свой результат). Каждая из подзадач программируется отдельно, возможно, разными программистами, и затем на последнем этапе все эти модули объединяются в одну программную систему. Для двух модулей можно указать следующую связь: первому модулю во время работы может потребоваться результат работы второго модуля, без которого первый не может получить собственный результат. В этом случае в первом модуле организуется так называемое обращение ко второму модулю, при котором первый передает часть своих данных в качестве исходных второму модулю и затем должен принять результат работы второго модуля. Эта передача данных – один из самых сложных механизмов связи модулей.
Такое взаимодействие двух модулей приводит к тому, что объединенная программная система имеет иерархическую структуру по связям между модулями.
Подпрограммы бывают разных типов. Каждый тип имеет собственную организацию связей.
Два связанных между собой модуля:
Существует 2 типа подпрограмм:
1. Функции (и в В., и в Р)
2. Процедуры (в Р.)
Отличия функции от процедур:
Функция в качестве результатах выдает 1 значение и обращение к этому модулю организуется из какого-либо выражения.
Например, у=1+sinx
Результатом работы процедуры является несколько выходных данных (или их отсутствие).
Обращение к процедуре – отдельный самостоятельный оператор.
В Pascal:
Assign (f, ‘My file’)
К основным принципам структурного программирования относятся:
1) структура создаваемой системы должна соответствовать структуре реальной решаемой задачи.
2) структура обрабатываемых в программе системных данных должна соответствовать структурам реальных данных.
3) модули, образующие программную систему должны составляться по правилам модульного програмирования .
а) текстовый модуль есть последователность управляющих
программных структур (присваивание, условие – if, цикл и выбор
по ключу)
б) в модуле должны отсутствовать метки и оператор GOTO
в) в модуле должны активно использоваться комментарии на
русском языке.
(в Вasic – REM текст, в Рascal – {комментарии} )
Активно – это комментировать каждую управляющую структуру.
Наиболее оптимальное - использование у-10 операторов.
г) операторы записываемые внутри управляющей стрктуры
должны записываться с отступом в 2-3 позиции.
for-
if-
else-
while-
do-
case-
repeat-
8. Описание простейших модулей.
Basic | Pascal |
Первый признак - первый оператор всегда имеет метку. <метка> : <оператор> ……… Второй признак - исполнение модуля всегда заканчиваетс оператором RETURN Если не использовать безусловный переход, то всё равно RETURN Чтобы обратиться к программе GOSUB <метка> Этот модуль вместе с вызываемым модулем образует один файл. | Используется специальный описатель: Procedurе – описание процедуры: Procedurе <имя>; Var <описание локльных переменных> (оказывают действие только внутри данной процедуры) Переменные, описанные в программе Var основного модуля являются глобальными, то есть их можно использовать внутри описанной процедуры. Однако если имя глобальной переменной совпадает с именем локальной переменной, описанной в процедуре, то внутри процедуры используется локальная переменная. [label] [type] Begin <операторы>; end; Передача данных через глобальные переменные как и в Basic. |
Глобальные переменные | |
Все переменные, которые используются в этой программе, являются глобальными, то есть их значение можно использовать в любом модуле, их действие распространено на все модули системы. |
9. Пример составления программы в соответствии с принципами структурного программирования