- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Перемещения по файлу
Это группа дополнительных процедур и функций, позволяющая изменять последовательный порядок операций чтения и записи. Единственным исключением является базовая логическая функция EOF, указывающая на конец файла:
EOF (< имя_файловой_переменной >)
При чтении, если все данные прочитаны, возникает ситуация «конец файла», и эта функция принимает значение True, иначе она равна False. Так как при записи данные всегда добавляются в конец файла, то функция имеет постоянное значение True.
Процедура
SEEK (< имя_файловой_переменной >,<выражение>);
позволяет явно изменять значение указателя файла, устанавливая его на компонент файла с номером, заданным выражением. Здесь выражение должно быть целого типа Longint.
Эту процедуру можно применять не только для произвольного чтения элементов файла, но и для его усечения. Если затем использовать процедуру
TRUNCATE (< имя_файловой_переменной >);
то компоненты файла, следующие за текущем указателем включительно, будут удалены.
При использовании процедуры Seek может возникнуть ситуация, когда компонентов в файле меньше, чем указанное значение, и может возникнуть аварийная ситуация. Чтобы этого избежать, используют функции
FileSize (< имя_файловой_переменной >)
FilePos (< имя_файловой_переменной >)
Они позволяют получить дополнительную информацию о файле и возвращают: первая – общее число элементов в файле, вторая – номер элемента, на который установлен указатель файла.
Пример работы с файлом
В качестве примера приведем статистическую обработку информации, находящейся в файле из текущего раздела, имя которого вводится с клавиатуры, а расширение .DAT назначено по умолчанию. В программе вычисляются математическое ожидание и дисперсия вещественных чисел соответственно по формулам:
и
.
Program Statistic;
Var
Fil:File of real; { входной файл }
x, { очередное вводимое число }
M,D: real; { матожидание и дисперсия }
N: integer; { количество введенных значений }
Name: string; { вводимое имя файла (без расширения) }
Begin
N:=0; M:=0; D:=0;
Read(Name); { вводим имя файла }
{ ставим в соответствие внутреннее и внешнее имена }
Assign(Fil,Name+'.dat');
Reset(Fil); { открываем файл для чтения}
While not Eof(Fil) do Begin
N:=N+1;
Read(Fil,x); { в цикле вводим все значения }
M:=M+x; { и суммируем их }
D:=D+x*x;
end;
M:=M/N;
D:=sqrt(D/N-M*M);
Writeln(' Матожидание= ',M:10:5,' Дисперсия= ', D:10:5);
end.
При попытке открыть несуществующий файл может возникнуть аварийная ситуация, поэтому необходимо проверять корректность операций.
Обработка ошибок ввода-вывода
При выполнении программы, написанной на языке Турбо Паскаль, установлены следующие правила обработки ошибочных ситуаций, связанных с вводом и выводом. По умолчанию при выполнении любой такой операции автоматически производится проверка на возникновение ошибки. При обнаружении ошибки выполнение программы прекращается, на экран выводится диагностическое сообщение с условным номером ошибки.
Можно предусмотреть в самой программе реакцию на ошибочные ситуации. Для этого используется директива компилятора {$I-}. В этом случае возникновение ошибки не будет приводить к немедленному завершению программы, а код этой ошибки будет запомнен в качестве значения стандартной функции IOResult без параметров. При отсутствии ошибок значение этой функции равно нулю. Например:
...
Writeln (' Введите имя файла');
Read (NameFil);
Assign (Fil,NameFil);
{$I-} { автоматический контроль отключен }
Reset (Fil);
Code:=IOResult;
If Code <> 0 Then Begin
Write ('Ошибка при открытии файла ',
NameFil,': ');
Case Code of
2: Writeln ('файл не найден');
3: Writeln ('путь к файлу не найден');
4: Writeln ('слишком много открытых файлов');
5: Writeln ('доступ закрыт');
6: Writeln ('нарушена информация в полях файла или системных областях');
8: Writeln ('недостаточно памяти');
10: Writeln ('несовместимые параметры окружения');
11: Writeln ('нераспознанный формат диска');
else
Writeln ('нераспознана');
end;
Exit;
end;
{$I+} { автоматический контроль включен }
...
При использовании функции IOResult, если отключен режим автоматического контроля, то после возникновения ошибки все последующие операции с любым файлом будут игнорироваться, пока не произойдет обращение к функции IOResult. Поэтому рекомендуется вызывать эту функцию сразу после выполнения операции, связанной с файлом. Кроме этого, обращение к функции обнуляет код ошибки, поэтому повторное обращение будет давать нулевой результат.
