- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
Пример 2
Program Primer2_3_3_3;
{Сведения о багаже авиапассажира состоят из фамилии, имени, отчества, количества вещей, общего веса багажа и признака наличия фотоаппаратуры. Сведения хранятся в текстовом файле. Вывести в другой текстовый файл фамилии, имена, отчества пассажиров, имеющих фотоаппаратуру. Кроме того, вывести на экран число пассажиров, вес багажа которых превышает 20 кг, и число пассажиров, у которых средний вес одной вещи больше 15 кг.}
Type Bagpas=Record{тип Bagpas - это запись, содержащая сведения о багаже одного пассажира}
Fio:String; {ФИО пассажира}
Kv: integer; {количество вещей пассажира}
P:Real; {вес багажа}
Foto:integer; {Foto=1, если фотоапаратура есть;
Foto=0, в противном случае}
End;
Var Pas:Bagpas; {cведения о багаже одного пассажира}
NameF:array [1..20] of string;
{массив ФИО пассажиров, имеющих фото}
Nf:integer; {число пассажиров, имеющих фото}
N20:integer;{число пассажиров, вес багажа которых больше 20 кг}
N15:Integer;
{число пассажиров, у которых средний вес вещи больше 15 кг}
i:Integer; { счетчик пассажиров}
F,G:text;
Begin
Assign(F,'d:\student\bag');
Reset(F);
Assign(G,'d:\student\fotores');
Rewrite(G);
If eof (F) then
Writeln (' Пуст файл исходных данных')
Else
Begin
Nf:=0; N20:=0;N15:=0;
While not eof(F) do
With pas do
Begin
Readln(F,Fio);
Readln(F,Kv);
Readln(F, P);
Readln(F,Foto);
If Foto=1 then
Begin
Nf:=Nf+1;
Writeln(G,Fio);
End;
If P>20 Then N20:= N20+1;
If P/Kv>15 Then N15:=N15+1;
End;
If Nf=0 Then Writeln(' Пассажиров с фотоаппаратурой нет')
Else
Begin
Writeln(
' Фамилии пассажиров с фотоаппаратурой в файле foto');
End;
Writeln(' Багаж больше 20 кг у',N20:3,' пассажиров');
Writeln(' Cредний вес одной вещи больше 15 кг у', N15:3,' пассажиров');
End;
Close(F);
Close(G);
End.
Замечание.Текстовые файлы можно ввести в ЭВМ, прочитать, исправить с помощью текстового редактора.
3.3.4. Типизированные файлы
Описание типизированного файла:
VAR Имя Файла:FILE OF Базовый Тип; . . .
Базовый тип - любой, но не файл.
Процедуры чтения из файла и записи в файл:
READ (Имя Файла,Список Переменных)
WRITE(Имя Файла,Список Переменных)
Cписок переменных содержит переменные только базового типа.
Операторы READLN и WRITELN не имеют смысла, так как компоненты файла не являются строками.
Напомним, что типизированные файлы хранят данные во внутреннем представлении, поэтому их нельзя подготовить с помощью текстового редактора. Для записи значений в типизированный файл и чтения типизированного файла необходимо подготовить специальные программы, как показано в примере.
Пример 1. Рассматриваются данные об игрушках из примеров §§3.1.3, 3.2, 3.3.3. Приведенные три программы должны работать последовательно друг за другом.
program texttyp {пpеобpазование текст.файла в типизиpованный};
type sved=record
name:string;
minage,maxage:integer;rub:real;
end;
var xtext:text; x:file of sved; toy:sved;
Begin Assign(xtext,'G:\valia\xtext'); Assign(x,'G:\valia\x');
{xtextготовится в текстовом редакторе, х получается программно}
reset(xtext);rewrite(x);
if eof(xtext) then writeln(' Исходный текстовый файл пуст')
else
Begin
while not eof(xtext) do
Begin
with toy do
Begin
readln(xtext,name);
readln(xtext,minage,maxage,rub);
End;
write(x,toy);
End;
End;
Close(x); Close(xtext);
End.
program TypFile;
{из типизированного файла хв типизиpован. файлyзаписываются }
{ сведения о констpуктоpах для детей до семи лет}
Type sved=record
name:string;
minage,maxage:integer;rub:real;
end;
Var x,y:file of sved; toy:sved;
Begin
Assign (x,'g:\valia\x');
Assign(y,'g:\valia\y');
reset(x); rewrite(y);
if eof(x) then writeln('x - пустой файл')
else
Begin
while not eof(x) do
Begin read(x,toy);{считывается запись полностью}
with toy do
if ((pos('констpуктоp',name)>0) or
(pos('Констpуктоp',name)>0))
and (maxage<=7) then
write(y,toy);
End;
End;
Close(x); Close(y);
End.
program typtext; {перевод типизированного файла в текстовый}
type sved=record
name:string;
minage,maxage:integer;rub:real;
End;
Var y:file of sved; ytext:text; toy:sved;
Begin Assign(y,'G:\valia\y'); Assign(ytext,'G:\valia\ytext');
reset(y);rewrite(ytext);
if eof(y) then writeln(' типизированный файл пуст')
else
Begin
while not eof(y) do
Begin
read(y,toy);
With toy do
Begin
writeln(ytext,name);
writeln(ytext,minage,maxage,rub:7:0);
End;
End;
End;
Close(y); Close(ytext);
End.
Замечание. В типизированном файле все компоненты занимают одинаковое количество байтов памяти, поэтому можно определить адрес начального байта каждой компоненты по её номеру. Подпрограммы, использующие эту возможность, называются подпрограммами прямого доступа. Они приведены ниже.
Функция FILESIZE(ИмяФайла) возвращает число компонент файла.
Функция FILEPOS(ИмяФайла) возвращает номер компоненты, которая будет обрабатываться следующей процедурой ввода-вывода.
Процедура SEEK(ИмяФайла, №компоненты) смещает указатель к требуемой компоненте.
Компоненты файла нумеруются с нуля. Следовательно, оператор SEEK(ИмяФайла,FILESIZE(ИмяФайла)) переместит указатель к концу файла.
В типизированный файл, открытый для чтения, допустимо производить запись.
Пример 2. Приведенная ниже программа заменяет в типизированном файле целых чисел нулевые значения на значениеa, задаваемое вводом. Для подготовки типизированного файла и его просмотра требуется написать программы, аналогичныеTextTypиTypTextпримера 1.
program Project1;
Var F:file of integer; a,b:integer;
begin
AssignFile(f, 'ftyp');{файл ftyp поготовлен с помощью}
Reset(F); {специальной программы}
Ifeof(F)then
writeln (' File is empty')
else
Begin
writeln('Input a');
readln(a);
while not eof(F) do
begin
read(F,b);
if b=0 then
begin
seek(F,filepos(F)-1);{возврат к компоненте, равной 0}
write(F,a){замена нулевого значения на а}
end
end;
CloseFile(F); writeln('end');
End;Readln
end.
Совет: не стоит использовать процедуры прямого доступа при последовательной записи или последовательном считывании компонент, это увеличит время работы программы.