- •Содержание
- •1Алгоритмы линейных структур
- •2 Циклы
- •Введение
- •1 Алгоритмы линейных структур
- •1.1 Этапы разработки программы
- •1.2 Основные понятия
- •1.3 Основная структура программы
- •1.4 Алфавит языка
- •1.5 Идентификаторы
- •1.6 Константы
- •1.7 Понятие переменной Типы
- •1.8 Оператор присваивания Арифметические выражения
- •1.9 Операторы ввода и вывода информации
- •1.10 Практические задачи
- •1.11 Примеры решения задач
- •2 Циклы
- •2.1 Цикл с предусловием
- •Цикл с постусловием
- •Цикл со счетчиком
- •2.2 Задачи
- •2.3 Примеры
- •3 Немного об алгоритмах Алгоритм Кнута - Морриса - Пратта
- •Алгоритм Бойера – Мура
- •Алгоритм Рабина
- •Алгоритмы сортировки
- •Метод пузырька.
- •Сортировка выбором
- •Метод Шелла
- •Метод Хoopа
- •3.1 Разветвляющиеся алгоритмы
- •3.2 Задачи Свойства и виды треугольников (задачи 1-4)
- •Свойства и виды четырехугольников (задачи 5, 6)
- •Каким будет значение переменной а после выполнения фрагмента программы с составным оператором?
- •4 Массивы
- •4.1 Объявление массива
- •4.2 Действия над массивами
- •4.3 Вывод массива
- •4.4 Ввод массива
- •4.5 Сортировка массива
- •4.6 Поиск в массиве
- •4.7 Поиск минимального (максимального) элемента массива
- •4.8 Многомерные массивы
- •4.9 Ошибки при использовании массивов
- •4.10 Практические задачи
- •5 Множества
- •5.1 Описание типа множество
- •5.2 Операции над множествами
- •5.3 Группы операций
- •5.4 Упражнения
- •5.5 Задачи Тема: Множества
- •6 Записи
- •6.1 Понятие записи
- •6.2 Оператор присоединения With ... Do
- •6.3 Вариантные записи
- •6.4 Работа с файлами записей
- •6.5 Задачи
- •7 Файлы
- •7.1 Работа с файлами
- •7.2 Текстовые файлы
- •7.3 Типизированные файлы
- •7.4 Нетипизированные файлы
- •7.5 Задачи
- •8 Графика
- •8.1 Графика в Турбо Паскале
- •8.2 Базовые процедуры и функции
- •Процедуры модуля Graph
- •Функции модуля Graph
- •8.3 Экран и окно в графическом режиме
- •8.4 Вывод простейших фигур
- •8.5 Графические процедуры
- •8.6 Построение прямоугольников
- •8.7 Построение многоугольников
- •8.8 Построение дуг и окружностей
- •8.9 Работа с текстом
- •8.10 Построение графиков функций
- •8.11 Циклы в графике. Построение случайных процессов
- •8.12 Создание иллюзии движения
- •Задания
- •Контрольные тесты
- •1. Программирование алгоритмов линейных структур
- •2. Программирование алгоритмов разветвляющейся структуры
- •3. Программирование алгоритмов циклических структур
- •4. Массивы
- •5. Множества
- •6. Записи
- •7. Файлы
- •8. Графика
7.3 Типизированные файлы
Описание типизированного файла имеет вид
van ftable: file of type_ID;
где type_ID может быть любым типом за исключением файлового. Элементами типизированного файла являются значения указанного типа. При работе с типизированными файлами можно использовать уже знакомые нам процедуры Assign, Reset и Rewrite. Следует заметить, что текстовый файл, открытый процедурой Reset, доступен только для чтения, а типизированный — еще и для записи. Процедуры Read и Write здесь используются по-другому. Отличие заключается в там, что каждый из параметров в рассматриваемом случае должен быть переменной типа type ID, а выражения и константы недопустимы. Процедуры ReadLn и WriteLn применяются только к текстовым файлам. Типизированные файлы используются для хранения однородной (по типу) информации. Если речь идет о хранении числовых данных, следует использовать типизированные файлы. Почему? Рассмотрим программу, которая производит запись числовых данных в текстовый и типизированный файлы.
Программа, демонстрирующая работу с текстовым и типизированным файлами
program file_of_extended;
var
extfile: file of extended: textfile: text; x, y: extended: i: word;
begin
assign(textfile, 'table.txt');
rewrite(textfile);
x := 0.0;
for i := 1 to 1000 do
begin
у := sin(x); WriteLn ( textfile, y);
x := x + 0.001; end;
close(textfile);
assign(extfile. 'table.ext');
rewrite(extfile);
x := 0.0;
for i := 1 to 1000 do
begin
у := sin(x);
write(extfile, y);
x := x + 0.001: end;
close(extfile);
Write('Работа программы закончена, нажмите <Enter>:');
ReadLn;
end.
После выполнения этой программы на диске (в рабочем каталоге программы) появятся два файла, table.txt и table.ext. Первый из них является текстовым файлом, второй — типизированным. Несмотря на то, что эти файлы содержат одинаковую информацию, между ними имеется существенное различие. Если просмотреть содержимое обоих файлов, то в первом случае (текстовый файл) мы увидим столбик цифр. Во втором случае (типизированный файл) на экране отобразится хаотический набор символов. Если мы сравним, кроме того, размер обоих файлов, то обнаружим, что файл table.ext имеет длину 10 000 байт, а файл table.txt — 25 000 байт. Почему? Переменная типа Extended занимает 10 байт, поэтому типизированный файл, содержащий 1000 чисел типа Extended, имеет размер 10 000 байт. Но если переменная типа Extended хранится в виде текстовой строки, то эта строка состоит из 23 символов, так как она включает показатель степени «E+nnnn» или «Е—nnnns». Добавьте сюда еще управляющие символы CR и LF, которыми оканчивается каждая строка при вызове процедуры WriteLn, и вы получите 25 символов на каждое значение типа Extended, записанное в текстовый файл. В итоге это даст 25 000 байт. По этой причине для хранения числовых данных экономнее использовать тип file of Extended.
7.4 Нетипизированные файлы
Для более эффективного выполнения операций ввода/вывода из внешних файлов в Паскале имеются нетипизированные файлы. При работе с ними можно использовать быстрые дисковые операции низкого уровня. Нетипизированные файлы дают возможность прямого доступа к любому файлу на диске независимо от его типа и структуры. Описание нетипизированной файловой переменной имеет вид
var untypfile: file:
Такая файловая переменная связывается с внешним файлом обычным образом. В числе параметров процедур Reset и Rewrite для нетипизированных файлов кроме файловой переменной имеется необязательный второй параметр типа Word:
Reset(untypfile. n); Rewhte(untypfile, n);
Дополнительный параметр n описывает размер индивидуальной записи в файле (в байтах). Если параметр n отсутствует, его значение по умолчанию принимается равным 128, однако рекомендуется явно указывать значение 1. Это связано с тем, что при любом другом значении величины записи в файле могут присутствовать неполные записи, а это не всегда удобно.
Теоретического багажа и практических навыков программирования на Паскале у нас уже достаточно для того, чтобы приступить к программе, имеющей достаточно большое практическое значение. Проблема состоит в том, чтобы прочитать текстовый файл, созданный в операционной системе UNIX, и записать его в формате текстового файла операционной системы MS-DOS. Можно представить себе ситуацию, когда некий файл был создан на сервере, работающем под управлением UNIX, а затем скопирован на компьютер пользователя, работающий под управлением MS-DOS. He исключено также, что вы получали такой файл в UU-кодированном виде по электронной почте. Разница между форматами хранения текстовых файлов в упомянутых операционных системах состоит в том, что в UNIX каждая строка текстового файла оканчивается одним управляющим символом LF, а в DOS каждая строка оканчивается двумя последовательными управляющими символами CR и LF. Таким образом, входной файл имеет формат, отличный от текстового формата Паскаля.
Программа преобразования текстовых файлов из формата UNIX в формат DOS
program Unix2Dos:
const
LF =#10; CR = #13;
var
word:
unix_file, dos_file: file;
buffer: array[1..4] of char: input_bytes, output_bytes, i: word;
begin
assign(unix_file, paramstr(1);
reset (unix_file. 1); assign(dos_file. paramstr(2));
rewrite(dos_file. 1);
WriteLn(Выполняется преобразование файла Unix', paramstr(1), в файл DOS ', paramstr(2));
repeat
blockread(unix_file. buffer, SizeOf(buffer)-2, input_bytes);
for i := input_bytes downto 1 do
begin
if buffer[i] = LF then begin
inc(input_bytes);
move(buffer[i]. buffier[i + 1]. input_bytes - i);
buffer[i] := CR;
end;
end;
blockwrite(dos_file, Buffe, input_bytes, output_bytes);
until (input_bytes =0) or (output_bytes <> input_bytes);
close(dos_file); close(unix_file):
end.
Итак, задача заключается в том, чтобы считать файл UNIX и заменить в нем каждый символ LF на пару символов CR и LF, не изменяя все остальные символы. Программа вызывается в командной строке с двумя параметрами, которыми являются имена входного и выходного файлов:
unix2dos fileunix filedos
Вначале открываются два файла — входной и тот, в который будет производиться запись. Затем производится считывание «порции» данных из входного файла. Процедурами для чтения нетипизированных файлов и для записи в них являются BlockRead и BlockWrite. Программа выделяет в качестве буфера область памяти, куда будет производиться запись и откуда будет производиться чтение. Роль буфера играет символьный массив buffer, размер которого 4 байта. В силу того что мы будем добавлять символы CR, размер буфера должен быть больше, чем число считанных байт. В переменной input_bytes содержится количество фактически считанных байт. Это значение будет равно 2 до тех пор, пока процедура BlockRead не будет вызвана последний раз. Замечу, что BlockRead имеет четыре параметра — файловую переменную, переменную буфера, количество байт, которые следует считать, и количество байт, считанных в действительности. Обращение к BlockWrite имеет аналогичный вид. Функция paramstr(i) возвращает значение i-гo параметра командной строки.