Институт №8 МАИ

12 День. Файлы, блоки


Словарик программиста (надо знать!):


© Снег выпал...
- Уже погуляли, надо возвращаться!

3.2.10 Понятие о записях

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

Здесь мы должны работать каждым компонентом записи вручную.

© Нельзя решить проблему за раз, спустив курок.

Нельзя сказать, что запись — долгий процесс, просто он не автоматический. Это компенсируется большой семантической нагрузкой: программист не забудет, что он написал.

Дата рождения — субструктура, поля которой более очерчены.

image

image

image

image

Вариантные записи позволяют обойти типовую безопасность. На примере девятки рассмотрим разные типы данных:

У каждого из этих типов своя алгебра, свои отношения и значения.

Булевский: все нули (False), хотя бы одна единица (True). А по целому? Определяем, дополнительный ли этот код (по первому числу)

Как видим, 4 типа совершенно разной интерпретации.


3.2.11 Понятие о файлах

- У нас негласный запрет
- на обработку файлов через массивы

© Самый маленький файл всегда больше самого большого массива.

Файл — обобщённая последовательность (из математики). Структура файла — обобщение понятия последовательности.

Обращение к диску содержит 2 действия за линейное время и одно движение за постоянное время.

Считаем, что файл — мгновенная лента.

В методичке сказано, что “файл — массив на диске”.

Допущение таких ошибок показывает безграмотность.

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

Файлы принято подразделять на: внешние и внутренние, текстовые и нетекстовые, входные и выходные.


Внешние файлы

Внешние файлы перечисляются в заголовке программы. Они существуют до начала работы и сохраняются после окончания работы программы. Т.е. время жизни именованных файлов шире времени жизни программы.

Именование файла должно сопоставляться и с Unix, и с языком СИ! Это важно!


Внутренние файлы

Внутренние файлы описываются, как и внешние, как файловые переменные в программе. Они используются в качестве рабочих файлов — временной памяти почти неограниченного размера.


Текстовые файлы

Текстовые файлы — файлы из литер, универсальный тип для ввода-вывода данных или для их хранения в предназначенном для этого виде.

Файлы сами по себе полезны: у них есть строки, причём строки переменной длины.

В файлах имеются символы EOL, которые разбивают структуру на строки.


Нетекстовые файлы

Нетекстовые файлы хранят данные во внутреннем представлении и не предназначены для ввода-вывода. Это компактно и экономит внешнюю память и время передачи данных в основную память.

Причем экономия достигается также и потому, что не требуется перевода значений в текстовые изображения и обратно, как это делается при вводе real и integer из/в файлы Input/Output.

Пример — данные, снятые с датчиков.

При вводе-вывод сканируем код по схеме Горнера за линейное время, и при этом экономим время, но усложняется сам процесс компиляции.


3.3 Блочная структура программ

Использование минимального набора инструкций позволяет решить проблему эффективной организации программ по управлению.

Также важна проблема организации программ по данным.

Для этого в ранних языках — АЛГОЛ-60 — введена структура БЛОК.

Блок — фрагмент программы со своим локальным контекстом. Он определяется как составная конструкция ЯП, ограниченная скобками составного оператора / фигурными скобками на СИ.

Типичный пример локального контекста — параметр цикла For. Эта временная переменная сразу после завершения цикла становится ненужной.

Программы, процедуры и функции представляют собой блоки, т.к. имеют описания локальных объектов.

Блоки позволяют не заботиться об уникальности имён при написании больших программ и защищают их от случайной порчи.

Локальные переменные облегчают работу в крупных программах. Локализация позволяет сэкономить и разгрузить память.

Пока мы не вошли в блок, переменные не существуют, не объявлены. Лишь при запуске программы компилятор их объявит.

У глобальных переменных всё объявлено.

Если программа примитивна (в ней мало букв), то одноимённые (омонимичные) переменные экранируются!

Приоритет отдаётся локальным переменным над глобальными при конфликте имён.

image

image

image

© Pascal не позволяет демонстрировать программирование на первом семестре нормального курса! (нет блоков)

Пример с присваиванием:

x1y := y1x — пример на дейкстровском питоне

Дейкстра-питон хорош тем, что в нём нет загромождения программы лишними переменными.

Пример на ЯП с обычным присваиванием:

t:=x
x:=y
y:=t

t нужен здесь только в конце! Это переменная для swapping’а значений.

© Pascal очень удобно ругать..
- Мальчик для битья..

3.4. Процедуры и функции

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

Фактически каждый набор функций — интерпретативное расширение ЯП.

Процедуры более сложны, чем блоки, т.к. постоянно, динамически параметризируются (т.е. в процессе выполнения, а не компиляции).

Это более развитые программные единицы относительно блоков.


3.4.1. Описание и использование

Подпрограмма принадлежит инструкции вызова благодаря имени и набору значений фактических параметров для вычислений

Подпрограмму надо описать перед использованием. Она состоит из 2 частей: заголовка и тела. В заголовке помимо имени пишется вид подпрограммы, параметры.

Параметры перечислены списком, по порядку следования — позиционно.

Тело представляет собой блок и содержит описания локальных и глобальных объектов вместе с совокупностью инструкций алгоритма.

image

image


3.4.2 Вызов функций и процедур.

Функции нужен результат, чтобы дальше участвовать в программе.

Результат подпрограммы остаётся на регистре (в регистровом файле). В языке СИ структурированные подпрограммы.


3.4.3 Передача параметров (кратко описываем каждый)

С её помощью связывают подпрограмму и внешнюю среду, из которой к подпрограмме обращаются.


3.4.3.1 Передача по значению

© Мы не машина Тьюринга, чтобы всё копировать.

Значение каждого фактического параметра вычисляется в точке вызова подпрограммы и отсылается в память, после чего связь прекращается.

В Паскале передаём по значению неуказанием var у переменной.

image


3.4.3.2 Передача по результату

При завершении подпрограммы по адресу возвращается вычисленное значение результата — указание result или out.

image

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

Передача массивов по значению или результату помимо удвоенного расхода памяти на формальные параметры требует копирования содержимого массива


3.4.3.3 Передача по ссылке

Плюсы: выигрыш по времени (значения не копируются) и по памяти (работа с оригинальным значением).

При этой передачи не стоит задавать константы — они могут быть испорчены.


3.4.3.4 Передача по имени

Обработка фактических параметров откладывается до их использования.

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

image


Выводы о передаче параметров

Критерии выбора способа передачи: