Процедуры и функции обработки текстовых файлов

Функция/процедура Описание
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 элементов по формуле Процедуры и функции обработки текстовых файлов - student2.ru , числа размещений из n элементов по m по формуле Процедуры и функции обработки текстовых файлов - student2.ru , числа сочетаний из n элементов по m по формуле Процедуры и функции обработки текстовых файлов - student2.ru .

13. Процедуры действий с комплексными числами (сложение, вычитание, произведение, деление). Комплексное число описать как запись. Описание типа включить в модуль.

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

15. Функций, не реализованных в Паскале: tg, ctg и целой степени действительного числа.

Наши рекомендации