ЗАДАЧА №2
СТРУКТУРИРОВАННЫЕ ТИПЫДАННЫХ. ФАЙЛЫ. РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ
ТЕКСТОВЫЙ ФАЙЛ
- структурированный тип, представляющий собой набор строк переменной длины. В отличие от других типов файлов для текстовых возможен только последовательный доступ к элементам (т.е. путем просмотра последовательно всех записанных элементов).
ЭТАПЫРАБОТЫС ТЕКСТОВЫМИ ФАЙЛАМИ
Ø Описание файловой переменной
Ø Связь переменной с физическим файлом
Ø Инициализация (открытие) файла
Ø Ввод/вывод в файл
Ø Закрытие файла
Описание файловой переменной
Описание:
VAR <ИМЯ2>: TEXT; |
ПРИМЕРЫ:
TYPE FT=TEXT; {файловый тип данных- синоним TEXT} VAR A1,A2:TEXT; {описано три переменные текстового типа} A0:FT; |
В любой программе уже существуют две файловые переменные типа TEXT, которые не описываются в разделе описаний. По умолчанию они связаны с консолью (стандартными устройствами ввода/вывода):
Ø INPUT
- связана с клавиатурой и предназначена для ввода данных;
Ø OUTPUT
– связана с экраном и реализует стандартный вывод данных.
Можно перенаправить стандартный ввод/вывод, используя ASSIGN для этих переменных.
Связь переменной с физическим файлом
Ø ASSIGN (<ПЕРЕМЕННАЯ>,<ФАЙЛ>)
- связывает файловую переменную <ПЕРЕМЕННАЯ> с файлом или логическим устройством, имя которого находится в строковой переменной или константе <ФАЙЛ>. Связь сохраняется до следующего оператора ASSIGN для данной переменной или до конца программной единицы, в которой определена указанная переменная.
Логические устройства
- аппаратные средства компьютера, потенциальные источники или приемники текстовой информации. Все логические устройства имеют собственные уникальные имена:
Ø ‘CON’ – КОНСОЛЬ: (ввод – клавиатура; вывод – экран)
Ø ‘PRN’ – ПРИНТЕР
Ø ‘LPT1’=‘PRN’,’LPT2’,’LPT3’ – ИМЕНА ПРИНТЕРОВ
Ø ‘AUX’=‘COM1’,’COM2’ – ИМЕНА КОММУНИКАЦИОННЫХ КАНАЛОВ
Ø ‘NUL’ – ПУСТОЕ ЛОГИЧЕСКОЕ УСТРОЙСТВО, (используется как «заглушка» при отладке)
Логические устройства могут быть связаны только с текстовыми файловыми переменными.
ПРИМЕРЫ
ASSIGN(A2,’F1.TXT’); ASSIGN(A1,’PRN’); |
В данном случае переменная A2 связана с текстовым файлом, а A1 – с принтером.
Открытие файла
REWRITE(<ФП>)
- открытие файла на запись, причем указатель помещается в начало файла. Если файл существует, то его содержимое уничтожается. Если файл не существует, то он создается.
RESET(<ФП>)
-открытие файла только на чтение, причем указатель помещается в начало файла. Если файл не существует, генерируется ошибка ввода/вывода.
APPEND(<ФП>);
- открытие файла на дозапись, причем указатель помещается в конец файла (на признак конца файла). Если файл не существует, генерируется ошибка.ввода/вывода. Эта процедура используется только для текстовых файлов.
КОРРЕКТНОЕ ОТКРЫТИЕ ФАЙЛА
{$I-} {отключить контроль ошибок ввода/вывода – директива компилятора} APPEND(A2); {открыть файл на дозапись} {$I+} {включить контроль ошибок ввода/вывода – директива компилятора} IF IORESULT<>0 THEN {проверить функцию ошибки} … {действия в случае ошибки – отсутствия файла на диске} ELSE … {действия в случае успешного открытия файла} |
Ввод/вывод в текстовый файл
После каждой операции ввода/вывода указатель файла всегда смещается на следующий компонент файла.
ЧТЕНИЕ
Ø READ (<ФП>,<СП.ВВОДА>)
Ø READ (<СП.ВВОДА>) (ввод из переменной input)
– ввод осуществляется до тех пор, пока не встретится признак конца строки или конца файла, поэтому таким образом нельзя считать последовательность строк;
Ø READLN (<ФП>,<СП.ВВОДА>)
Ø READLN(<СП.ВВОДА>) (ввод из переменной input)
– осуществляется ввод <П. Ввода>, а затем указатель файла устанавливается на следующую строчку
<СП. ВВОДА> - список переменных любых базовых типов, кроме BOOLEAN.
ЗАПИСЬ
Ø WRITE (<ФП>,<СП.ВЫВОДА>)
Ø WRITE (<СП.ВЫВОДА>) (вывод в переменную output)
– вывод содержимого <П.вывода>;
Ø WRITELN (<ФП>,<СП.ВЫВОДА>)
Ø WRITELN (<СП.ВЫВОДА>) (вывод в переменную output)
– вывод содержимого <П.вывода>, а затем символа перевода строки.
<СП. ВЫВОДА> - список переменных и/или констант любых базовых типов. В нем могут быть указаны форматы – через двоеточие – количество позиций для вывода (если требуется больше, то вывод не обрезается, а если меньше, то дополняется пробелами слева. А для вещественных может быть также указано количество полей для дробной части).
2. 1.5Закрытие файла
Ø CLOSE(<ФП>)
- закрытие файла.
После закрытие обращение к файлу для ввода/вывода невозможно – будет генерироваться ошибка, но связь файловой переменной с физическим файлом или логическим устройством сохраняется. Эту связь можно использовать для удаления, переименования и других операций над файлами (см. предыдущую лабораторную работу).
ПОЛЕЗНЫЕ ФУНКЦИИ ДЛЯ ОРГАНИЗАЦИИ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА К ТЕКСТОВОМУ ФАЙЛУ
Ø EOF(<ФП>)
– функция возвращает true, если указатель файла находится в его конце, иначе – false;
Ø EOLN (<ФП>)
– функция возвращает true, если указатель файла находится в конце строки или файла, иначе – false;
Ø SEEKEOF (<ФП>)
– функция типа boolean: пропускает все пробелы и символы табуляции до маркера конца файла или первого значащего символа и возвращает true, если маркер найден.
Ø SEEKEOLN (<ФП>)
– функция типа boolean: пропускает все пробелы и символы табуляции до маркера конца строки или файла или первого значащего символа и возвращает true, если маркер найден;
ПРОЦЕДУРА СОЗДАНИЯ ТЕКСТОВОГО ФАЙЛА
PROCEDURE CREATE(NAME:STRING); VAR F:TEXT; {файловая переменная} X:STRING; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} REWRITE(F); {открыть файл на запись (перезапись)} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WRITELN('VVEDITE CHISLA (OSTANOVKA ‘’’’):'); READLN(X); WHILE X<>’’ DO {вводим строчки в цикле до пустой строки и записываем их в файл} BEGIN WRITELN (F,X); READLN(X); END; CLOSE(F); {закрыть файл} END; END; |
ПРОЦЕДУРА РАСПЕЧАТКИ СОДЕРЖИМОГО ТЕКСТОВОГО ФАЙЛА
PROCEDURE PRINT(NAME:STRING); VAR F:TEXT; {файловая переменная} X:STRING; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} RESET(F); {открыть файл на чтение} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WHILE NOT (EOF(F)) DO {пока не достигнут конец файла } BEGIN {читаем строчку из файла и выводим ее на консоль} READLN(F,X); WRITELN(X); END; CLOSE(F); {закрыть файл} END; END; |
ПРОЦЕДУРА УДАЛЕНИЯ ИЗ ФАЙЛА ВСЕХ ЗВЕЗДОЧЕК (РЕЗУЛЬТАТ ЗАПИСЫВАЕТСЯ В НОВЫЙ ФАЙЛ)
PROCEDURE DEL(NAME,NAMENEW:STRING); VAR F,FNEW:TEXT; {файловые переменные} S:STRING;I:INTEGER; BEGIN ASSIGN (F,NAME); ASSIGN (FNEW,NAMENEW); {файловые переменные связаны с файлами на диске} {$I-} RESET(F); {открыть файл name на чтение} {$I+} IF IORESULT=0 THEN BEGIN {если файл открыт} {$I-} REWRITE(F); {открываем на запись файл namenew} {$I+} IF IORESULT=0 THEN BEGIN {если файл открыт} WHILE NOT (EOF(F)) DO BEGIN {пока не конец файла f} READLN(F,X); {читаем строку} I:= POS ('*',S); {ищем первое вхождение ‘*’} WHILE I<>0 DO BEGIN {пока есть ‘*’ в строке} DELETE (S,I,1); {удаляем ‘*’ и ищем следующее вхождение} I:= POS ('*',S); END; WRITELN(FNEW,S); {преобразованную строку пишем в новый файл} END; CLOSE(FNEW); {закрыть файл} END; CLOSE(F); {закрыть файл} END; END; |
ПРИМЕР ПРОГРАММЫ, ИСПОЛЬЗУЮЩЕЙ ПРИВЕДЕННЫЕ ВЫШЕ ПОДПРОГРАММЫ
BEGIN CREATE('FILE1.TXT'); {создать файл} PRINT('FILE1.TXT'); {распечатать файл} DEL('FILE1.TXT‘, 'FILE2.TXT'); {преобразовать содержимое 1-го файла во 2-ой} PRINT('FILE2.TXT'); {распечатать измененный файл} READLN; END. |
ЗАДАНИЯ
Программа должна быть разбита на несколько подпрограмм-процедур и подпрограмм-функций и обязательно содержать:
1. Процедуру формирования исходного файла;
2. Процедуру вывода результата работы программы;
3.Одну или более процедур (функций), реализующих вычислительную часть алгоритма.
Все подпрограммы-процедуры и подпрограммы-функции должны содержать список параметров, причем файл должен передаваться как параметр процедуры (функции).
Основная программа должна содержать только операторы вызова подпрограмм.
ВАРИАНТЫ
№ | Постановка задачи |
Даны два текстовых файла f и g. Определить, совпадают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой строки и позицию первого символа в этой строке, в которых файлы различаются между собой. В случае, когда один из файлов имеет n компонент (n>0) и повторяет начало другого (более длинного файла), ответом должно быть число n+1. | |
Дан текстовый файл f, состоящий из нескольких строк. Исключить пробелы, стоящие в концах его строк. Результат поместить в файл f1. | |
Дан текстовый файл f, строка s. Получить все строки файла f, содержащие в качестве фрагмента строку s. | |
Дан текстовый файл f. Переписать компоненты файла f в файл g, вставляя в начало каждой строки по одному пробелу. Порядок компонент должен быть сохранен. | |
Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g. Порядок строк в файле g должен быть сохранен. | |
Дан текстовый файл f. Переписать файл f в файл g в порядке убывания длин строк. | |
Дан текстовый файл f, состоящий из нескольких строк. Переписать в файл g все компоненты файла f с заменой в них символа ‘0’ на символ ‘1’ и наоборот. | |
Дан текстовый файл f. Переписать в файл g все его строки, содержащие более 60 символов в обратном порядке. | |
Дан текстовый файл f, содержащий программу на языке Паскаль. Проверить эту программу на несоответствие числа открывающих и закрывающих круглых скобок: а) Когда оператор программы занимает не более одной строки файла f б) Когда оператор программы может занимать произвольное число строк файла | |
Дан текстовый файл f, состоящий из нескольких строк, содержащих следующие знаки корректуры: $ - сделать красную строку, # - удалить следующее слово, @ удалить следующую фразу (т.е. все символы до конца строки). Произвести указанную корректировку и записать результат в новый файл g. | |
Дан текстовый файл f, состоящий из нескольких строк. В каждой строке найти наибольшее количество цифр, идущих подряд. Из этих значений сформировать файл h. | |
Дан текстовый файл f, состоящий из нескольких строк. Переписать его в файл g следующим образом: если в тексте нет символа ‘*’, то оставить этот текст без изменения, иначе каждую из малых латинских букв, предшествующую первому вхождению символа ‘*’ заменить на цифру 3 | |
Дан текстовый файл f, состоящий из нескольких строк. Переписать его в файл g следующим образом: если в тексте нет символа ‘+’, то оставить этот текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа ‘+’ заменить на символ ‘-‘ | |
Дан текстовый файл f, каждая строка которого состоит из слов, разделенных одним и более пробелами. Для каждого из слов указать, сколько раз оно встречается среди всех слов, образующих текст. Из этих значений сформировать новый файл g. | |
Дан текстовый файл f, каждая строка которого состоит из слов, разделенных одним и более пробелами. Найти все слова, содержащие наибольшее количество гласных латинских букв (a, e, i, o, u). Сформировать из этих слов новый файл g. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Выяснить, встречается ли в данном тексте группа букв one. Соответствующее сообщение дописать в конец файла. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков. В первом случае в новый файл g вывести все группы букв, во втором – все группы знаков. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Если в данном тексте имеется не менее двух групп букв, то каждый знак ‘+’, встречающийся между двумя первыми по порядку группами букв, заменить цифрой 1, знак ‘-‘ заменить цифрой 2, а знак ‘*’ заменить цифрой 3. В противном случае текст оставить без изменений. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Подсчитать число вхождений буквы f в первые три группы букв. Букву f и найденное количество дописать в конец файла. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Найти число таких групп, которые начинаются и заканчиваются одной и той же буквой. Все эти группы вывести в новый файл g | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков{+,-,*}. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосред- ственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа цифр и группа знаков. Найти все такие группы, в которые буква ‘a’ входит не менее двух раз, и вывести их в новый файл g. | |
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков ‘+’, ‘-‘, ‘*’. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует пробел. Аналогично определяется группа цифр и группа знаков. Найти самую длинную (первую по порядку) группу цифр и дописать ее в конец файла g. | |
Дан текстовый файл f, каждая строка которого состоит из слов, разделенных одним и более пробелами. Найти все слова, в которых доля букв a,b максимальна (при этом учитывать общее количество букв в слове). Записать их в новый файл g | |
Дан текстовый файл f, каждая строка которого состоит из слов, разделенных одним и более пробелами. В тех словах, которые оканчиваются сочетанием букв ing, заменить это окончание на ed. Записать их в новый файл g. |