Процедуры и функции обработки текстовых файлов
Функция/процедура | Описание |
Append(var fp); | Открывает существующий файл, связанный с файловой переменной fp, для добавления в него новых записей |
Eoln(var fp) | Возвращает True, если указатель файла достиг маркера конца строки. В противном случае False. |
SeekEoln(var fp) | Аналогична предыдущей, но указатель файла пропускает все знаки табуляции, предшествующие маркеру конца строки. |
Пример 5.Переписать из текстового файла f в файл g строки в перевернутом виде.
ProgramProg7_5;
Var
f,g:text;
i: integer;
st,st1:string;
Begin
assign(f; 'inp1.dat');
reset(f); {открываем для чтения файл 'inp1.dat'}
assign(g,'out1.dat');
rewrite(g);{открываем для записи файл 'out1.dat'}
while noteof(f)do begin(пока не конец файла)
readln(f,st); {читать строку из файла f}
st1:='';{формируем новую строку-перевертыш}
for i:= 1 to length(st) do st1:= st[i]+st1;
writeln(g,st1); {писать эту строку в файл g}
end;
close(f); {закрываем файл f}
close(g); {закрываем файл g}
End.
Пример 6. Дописать файл g в конец файла f.
ProgramProg7_6;
Var
f,g:text;
i: integer;
st:string;
Begin
assign(f; 'inp1.dat');
append(f); {открываем файл 'inp1.dat' для дозаписи}
assign(g,'out1.dat');
reset(g); {открываем для чтения файл 'out1.dat'}
while noteof(g)do begin(пока не конец файла)
readln(g,st); {читать элемент из файла g}
writeln(f,st); {писать этот элемент в файл f}
end;
close(f); {закрываем файл f}
close(g); {закрываем файл g}
End.
Контрольные вопросы:
1. Что такое файл? Какие существуют виды файлов? Для чего они предназначены?
2. Какая связь между файлом и файловой переменной? Как она устанавливается?
3. Какие стандартные процедуры обязательно включаются в программу, обрабатывающую файлы?
4. Какие типы допустимы для компонентов файла?
5. Как осуществляется обращение к компонентам файлов прямого и последовательного доступа?
6. Приведите различные способы записи в файл табличной информации?
7. Как вывести содержимое файла на монитор, на печать?
8. Каковы особенности работы с текстовыми файлами? Чем эти файлы отличаются от файлов из строк?
Лабораторная работа № 7
Задание 1. Запишите в файл исходных данных числовой двумерный массив.
Задание 2. Напишите программу, изменяющую в файле исходных данных из задания 1 элементы, соответствующие вашему варианту:
Варианты заданий:
1. вторая строка;
2. третий столбец;
3. элементы (2;3) и (4;1);
4. последняя строка;
5. элементы (1;2) и (3;3);
6. третья строка;
7. элементы (2;1),(2;3) и (4;1);
8. последний столбец;
9. второй столбец;
10. элементы (3;2),(1;4) и (5;4);
11. первый столбец;
12. элемент (r,k);
13. диагональные элементы;
14. элементы в нечетных строках;
15. крайние элементы матрицы (по периметру).
Задание 3. Прочитать из полученного файла элементы, соответствующие вашему варианту:
Варианты заданий:
1. первый столбец;
2. элементы (1;3) и (3;3);
3. вторая строка;
4. элементы (4;3) и (2;1);
5. последняя строка;
6. элементы (3;4) и (4;3);
7. последний столбец;
8. элементы (2,5) и (3:1);
9. элементы (2;2),(3;2) и (4;3);
10. четвёртый столбец;
11. элементы (1;3),(2;1),(3;4);
12. элементы (2;2),(2;3);
13. третья строка;
14. второй столбец;
15. угловые элементы матрицы.
Задание 4. Создать текстовый файл (3–4 строки). Дописать в конец файла 2 строки. Вывести на монитор исходный и полученный файлы.
8. ЗАПИСИ
Цель: формирование понятия о возможности представления разнородной информации об объекте с помощью комбинированного типа «запись» и навыков использования данного типа для описания информационных моделей.
Структура записи в Паскале
Записи являются структурированным типом данных. Они состоят из компонент, имеющих в общем случае разные типы. Компонент записи называется полем и обозначается идентификатором – именем поля. Описание записей возможно с применением типов или в разделе описания переменных:
Type
<имя типа> = record
<идентификатор поля 1>: тип 1;
<идентификатор поля 2>: тип 2;
....................................................................
<идентификатор поля k>: тип k;
end;
var<идентификатор>:<имя типа>;
<идентификатор>:record
<идентификатор поля 1>: тип 1;
<идентификатор поля 2>: тип 2;
....................................................................
<идентификатор поля k>: тип k;
end;
В секции могут перечисляться несколько имен полей одного типа. Тип поля может быть любым, кроме файлового.
К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделенные точкой: <идентификатор>.<имя поля>. При обращении к элементу массива записей, индекс указывается после имени массива:
<идентификатор массива>[индекс].<имя поля>
Введение в Паскале такого типа вызвано необходимостью описания реального объекта в целом.
Пример 1. Описание времени и даты.
Type
time = record
hour:1..12;
minute:0..59;
end;
var t1,t2:time;
date : record
day:1..31;
month:0..12;
year:word
end;
К компонентам записи можно обратиться, например: t1.hour, t2.minute, date.month.
Над компонентами записи определены операции, допустимые для соответствующего типа.
Пример 2. Описать объект – пациент:
– ФИО
– возраст
– болезнь
– семейное положение
Выяснить, поступил ли в отделение конкретный пациент. Вывести количество больных гриппом.
ProgramProg8_1;
constn=55;
Type
pacient = record
name, bolezn:string[40];
wozrast:byte;
sem_pol:char
end;
Var
nekto: pacient;
otdel: array[1..n]of pacient; {массив записей}
i, k: integer;
Begin
writeln('Введите список отделения');
for i:=1 to n do begin
readln(otdel[i].name, otdel[i].bolezn);
readln(otdel[i].wozrast, otdel[i].sem_pol);
end;
writeln('Введите фамилию пациента');
readln(nekto.name); i:=1;
while (i<= n) and (otdel[i].name <> nekto.name) doi:=i+1;
if i<= n thenwriteln(‘поступил’)
else writeln(‘не поступил’);
k:=0; {инициализация числа больных гриппом}
for i:=1 to n do
if otdel[i].bolezn = ‘грипп’ thenk:=k+1;
writeln(‘больны гриппом ’, k, ‘пациентов’);
End.
Оператор присоединения
Обращение к элементам записи их полным именем громоздко. Этот недостаток устраняют с помощью оператора присоединения with.
Формат оператора:
with R doS1;
где R – имя переменной записи, а S1 – тело оператора присоединения. Внутри него выборка поля переменной R может быть обозначена просто именем этого поля.
Пример 3. Программу примера 2 записать с использованием оператора with.
ProgramProg8_2;
constn=55;
Type
pacient = record
name, bolezn:string[40];
wozrast:byte;
sem_pol:char
end;
Var
nekto: pacient;
otdel: array[1..n]of pacient; {массив записей}
i, k: integer;
Begin
writeln('Введите список отделения');
for i:=1 to n do
withotdel[i]do begin
readln(name, bolezn);
readln(wozrast, sem_pol);
end;
writeln('Введите фамилию пациента');
readln(nekto.name); i:=1;
while (i<= n) and (otdel[i].name <> nekto.name) doi:=i+1;
if i<= n thenwriteln(‘поступил’)
else writeln(‘не поступил’);
k:=0; {инициализация числа больных гриппом}
for i:=1 to n do
withotdel[i]do
if bolezn = ‘грипп’ thenk:=k+1;
end;
writeln(‘больны гриппом ’, k, ‘пациентов’);
End.
Вложенные записи
Поле записиможет быть в свою очередь тоже записью. Так, если в примере 3 описание записи дополнить полем Date со сведениями о дате рождения, получим следующее:
Tурe
pacient = record
name, bolezn:string[40];
wozrast:byte;
date:record{вложенная запись}
day:1..31;
month:0..12;
year:word
end;
sem_pol: char
end;
При такой структуре записи обращение к ее компонентам day, month, year будет иметь следующий вид:
nekto.date.day:=13;
nekto.date.month:=9;
nekto.date.year:=1988;
Используя оператор with, запись можно упростить.
withnekto, datedo begin
name: = ’Мария ‘;
wozrast:= 20;
bolezn := 'грипп ';
day:=13;
month:=9;
year:=1988;
sem_pol:=’ж’;
end;
Допустимо также включение между словом do и begin других операторов:
withnekto, datedo
ifk=1then begin … end;
begin
…
End
Контрольные вопросы:
1. Как описывается переменная типа запись?
2. Как обратиться к полям записи?
3. Какие действия допустимы над компонентами записи?
4. Что такое вложенная запись? Как она описывается?
5. Как сократить имя для обращения к полям записи?
6. В чем отличие записей от массивов?
Лабораторная работа № 8
Задание. Опишите информационный объект с помощью записи. Введите набор исходных данных и сохраните в файле на диске. Составьте программу, в которой исходные данные читаются из файла, производится их соответствующая обработка, результат выдается на экран.
Варианты заданий:
1. Дана экзаменационная ведомость с фамилиями студентов, номером группы, номером зачетной книжки, оценкой за экзамен. Выдайте список задолжников для данной группы. Распечатайте всю информацию в виде таблицы.
2. Составить список своей подгруппы. Для каждого человека указать: фамилию, год рождения, пол, место жительства (город/район, улица/деревня, дом). Распечатать этот список в виде таблицы, а также фамилии самой молодой девушки и самого молодого юноши.
3. Описать группу учеников, включив следующие данные о них: имя, пол, рост, возраст. Распечатать эти данные в виде таблицы и выдать имя и рост самого высокого мальчика, самой маленькой девочки и средний рост группы.
4. В пресс-центре выставки программных средств хранятся данные о каждом экспонате: название, назначение, автор, количество заявок на него. Распечатать данную информацию для 10–12 экземпляров. Выявить трех кандидатов для награждения призами (по числу заявок) и распечатать данные о них.
5. В больнице имеется список больных, каждый из которых характеризуется данными: фамилия и инициалы, номер палаты, диагноз. Требуется вывести на печать перечень больных по каждой палате и отдельно по каждому диагнозу.
6. Дана ведомость абитуриентов, сдавших вступительные экзамены, которая содержит фамилии абитуриентов и полученные ими оценки. Необходимо определить средний балл группы и распечатать список абитуриентов, имеющих средний балл выше среднего в группе.
7. Информация о студентах вводится в форме: фамилия, имя, возраст, пол, курс. Распечатайте данные 10–15 записей, а также номер курса, на котором наибольший процент мужчин.
8. В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указаны его номер, тип самолета, пункт назначения, время вылета. Определить все номера рейсов, типы самолетов и времена их вылета для заданного пункта назначения.
9. Информация о жителях различных городов записана в массив, содержащий их фамилии и адреса (город, улица, дом, квартира). Составить программу «Ирония судьбы», которая печатает фамилии двух (любых) жителей, живущих в разных городах по одинаковому адресу.
10. Дана записная книжка с фамилиями, инициалами и телефонами. Составить программу, позволяющую по фамилии, введенной с клавиатуры, выдать номер телефона, и наоборот: по номеру – фамилию. Если запрос вводится об отсутствующей в книжке записи, то сообщить об этом.
11. В предвыборной кампании проводится регистрация кандидатов в депутаты. Каждый кандидат, подавая заявление на регистрацию, указывает номер округа, в котором он собирается баллотироваться, наименование партии, которую он, представляет, свой возраст и профессию. Пресс-служба центральной избирательной комиссии выдает информационный бюллетень, в котором приводит следующую информацию: число поданных заявлений на регистрацию кандидатов каждой политической партии и средний возраст кандидатов от каждой политической партии. Написать соответствующую программу.
12. Информация об итогах сессии подгруппы задана в виде: ФИО, предметы и полученные оценки. Выдать на печать эти данные в форме ведомости, а также название предмета, который был сдан лучше всего.
13. Имеется список учета нуждающихся в улучшении жилищных условий. Каждая запись этого списка содержит фамилию, имя, отчество и дату постановки на учет. Список упорядочен по дате постановки на учет. Известно число квартир, выделяемых по данному списку в течение года. Рассчитать, какое количество лет в среднем необходимо ожидать получения квартиры, и вывести на экран весь список с указанием ожидаемого года получения квартиры.
14. В библиотеке имеется список книг. Каждая запись этого списка содержит фамилии авторов, название книги, год издания. Определить, имеются ли в данном списке книги, в названии которых встречается некоторое ключевое слово (например, «программирование»). Если имеются, то выдать на печать фамилии авторов, название и год издания всех таких книг. Ключевое слово ввести с клавиатуры.
15. В бюро по занятости населения (трудовой бирже) ведется список вакантных рабочих мест на предприятиях города. Каждая запись такого списка содержит следующую информацию: наименование организации, местоположение организации (расстояние в км от центра города), наименование должности, требуемая квалификация (разряд или образование), требуемый стаж работы по специальности, заработная плата в месяц, наличие социального страхования (да или нет), продолжительность ежегодного оплачиваемого отпуска. Клиент бюро вводит информацию о своей квалификации и требования (например, максимальная удаленность от центра города). Написать программу, которая бы распечатывала для каждого клиента список рабочих мест в соответствии с его требованиями.
9. МОДУЛИ
Цель: формирование навыков модульного построения программ и умений их реализации в Паскале.
Для размещения в памяти большой программы может не хватить одного сегмента памяти (его размер – до 64 кбайт). Поэтому разработчики Турбо Паскаля для устранения этих недостатков включили в язык механизм так называемых модулей, которые размещаются в разных сегментах. Модули позволяют создавать библиотеки процедур и функций, которые можно подключать к разным программам.
Модуль– это автономно компилируемая программная единица, включающая в себя специальным образом оформленную библиотеку описаний (типы, константы, переменные, процедуры и функции).
Модуль может быть запущен только из программы или из другого модуля. Он компилируется независимо от использующей их программы. Результатом компиляции модуля является файл с тем же именем и расширением имени .TPU, который заносится на диск.
Общий объем модульной программы может быть много более 64 кбайта, но каждый .TPU-файл не может превышать этот предел.
Структура модуля
Модуль можно разделить на несколько разделов: заголовок; интерфейсная часть; исполняемая часть; инициализационная часть.
UNIT <имя> {заголовок модуля}
interface{интерфейсная часть}
uses<список> {используемые при объявлении модули}
label {блок объявлений библиотечных меток}
const {блок объявлений библиотечных констант}
type {блок объявлений библиотечных типов}
var {блок объявлений библиотечных переменных}
<заголовки доступных процедур и функций с указанием параметров>
implementation {секция реализации}
uses {используемые при реализации модули}
label {блок объявлений внутренних меток}
const {блок объявлений внутренних констант}
type {блок объявлений внутренних типов}
var {блок объявлений внутренних переменных}
<заголовки без параметров и тела процедур и функций>
Begin {секция инициализации}
<операторы>
End.
Все блоки, составляющие разделы интерфейса, реализации и инициализации необязательны и могут отсутствовать.
Заголовок модуля состоит из зарезервированного слова unit и следующего за ним имени модуля. Это имя должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Если, например, имеем заголовок unitStat;то дисковый файл должен называться Stat.pas.
В интерфейсной части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными любой программе и/или другим модулям. При объявлении библиотечных подпрограмм в интерфейсной части указывается только их заголовок.
В разделе реализации можно использовать все объекты, описанные в разделе interface. Он, как правило, содержит описания подпрограмм, объявленных в интерфейсной части. Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных переменных.
В разделе реализации могут объявляться локальные для модуля объекты – типы, константы, переменные и т.п. Они будут глобальными по отношению к подпрограммам этого раздела и инициирующей части. В программе, подключающей модуль, объявленные при реализации данные и типы недоступны.
Завершает модуль инициирующая часть. Она может отсутствовать вместе с начинающим ее словом Begin. Тогда сразу после раздела реализации следует признак конца модуля End.
(с точкой). В инициирующей части размещаются исполняемые операторы, которые выполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Обычно в ней выполняется присваивание начальных значений библиотечным переменным, открытие файлов и т.п. Инициализация происходит только при работе программы. При подключении модуля к модулю инициализации не происходит.
В приведенном ниже примере использования модуля раздел инициализации отсутствует, так как в нем нет необходимости.
Пример 1. Составьте модуль из процедур сложения и вычитания дробей. Напишите программу с примерами использования различных процедур модуля.
unit myunit; {дисковый файл “myunit.pas” }
interface {интерфейсная часть }
type drob=recorda,b:integer end; {тип дробь}
procedure print(x:drob); {вывод на экран}
procedure minus(x,y:drob;var s:drob); {вычитание}
procedureplus(x,y:drob;var s:drob); {сложение}
implementation {раздел реализации модуля}
procedure print;
Begin
with x do begin
if (a*b>=0) then begin a:=abs(a);b:=abs(b) end
else begin a:=-abs(a);b:=abs(b) end;
if b<>0 then
if a<>0 then
if b=1 then write(a)
else write(a,'/',b)
else write(0)
else write('unknown');
end;
end;
{процедура сложения}
procedure plus(x,y:drob;var s:drob);
var q,w:integer;
Begin
w:=x.b*y.b;q:=x.a*y.b+y.a*x.b;
s.a:=q;s.b:=w;
end;
procedure minus(x,y:drob;var s:drob);
var q:drob;
Begin
{разность определяется через сложение}
q:=y;q.a:=-q.a;
plus(x,q,s);
end;
End.
Program Prog9_1; {программа, использующая модуль}
uses crt, myunit; {подключение модулей}
var q,w,e,r:drob;
Begin
clrscr;
{инициализация переменных}
q.a:=1;q.b:=3; {q=1/3}
w:=q;w.a:=2; {w=2/3}
plus(q,w,e);minus(q,w,r); {e=q+w,r=q-w}
{вывод результата на экран}
print(q); write('+'); print(w); write('=');
print(e); writeln;
print(q); write('-'); print(w); write('=');
print(r);
readln;
End.
Контрольные вопросы:
1. Как программируются циклические алгоритмы с явно заданным числом повторений цикла?
2. В чем отличие модуля от программы и подпрограммы?
3. Какие основные разделы модуля?
4. Каково назначение описаний в интерфейсной части модуля и в разделе реализации?
5. Какой порядок создания модуля в TURBO PASCAL? Как использовать готовый модуль в паскаль-программе?
Лабораторная работа № 9
Задание. Составьте модуль из подпрограмм, указанных в варианте. Напишите программу с примерами использования модуля.
Варианты заданий:
1. Процедуры нахождения площадей произвольного треугольника разными способами: по формуле Герона, по основанию и высоте, по двум сторонам и углу между ними.
2. Функция, определяющая первое вхождение заданного символа в строку, и процедура замены в строке всех вхождений заданного символа, кроме первого, на другой заданный символ.
3. Процедуры нахождения длин векторов и угла между векторами на плоскости.
4. Функции нахождения числа четных и нечетных чисел одномерного массива, а также ввода и вывода массива.
5. Процедуры ввода, вывода целочисленной квадратной матрицы, нахождения номеров строк, все элементы которых делятся на 3 без остатка.
6. Процедуры ввода, вывода, поиска суммы отрицательных элементов одномерного массива.
7. Функции определения високосных лет, числа дней в месяце и проверки правильности обозначения даты. Тип даты опишите в модуле как запись, при этом месяц опишите как перечисляемый тип пользователя.
8. Процедуры удаления лишних пробелов из строки символов, разделения введенного текста на отдельные слова и занесение их в строковый массив, который распечатывается (каждое слово на новой строке).
9. Процедуры создания файла из записей, которые содержат сведения о студентах: фамилия, имя, оценки последней сессии, нахождения среднего балла для каждого студента, выдачи списка фамилий с указанием среднего балла.
10. Процедуры ввода, вывода матрицы произвольного размера и подсчёта количества строк с нулевыми элементами.
11. Процедуры выделения из текста слов и функции, определяющей сколько раз слово встречается в тексте.
12. Процедуры вычисления числа перестановок из n элементов по формуле , числа размещений из n элементов по m по формуле , числа сочетаний из n элементов по m по формуле .
13. Процедуры действий с комплексными числами (сложение, вычитание, произведение, деление). Комплексное число описать как запись. Описание типа включить в модуль.
14. Процедуры формирования массива строк, каждый элемент которого может быть интерпретирован как целое двоичное число без знака, процедуры преобразования представления значений элементов массива в десятичную систему счисления.
15. Функций, не реализованных в Паскале: tg, ctg и целой степени действительного числа.