--PAGE_BREAK--1. Тип string и стандартный тип char. Тип string и стандартный тип char совместимы. Строки и символы могут употребляться в одних и тех же выражениях.
Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операции сцепления и операции отношения.
Операция сцепления (конкатенации) (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные.
Пример: 'Мама ' + 'мыла ' + 'раму'. В результате получится строка: 'Мама мыла раму'. Длина результирующей строки не должна превышать 255.
Операции отношения: =, , =, . Позволяют произвести сравнение двух строк, в результате чего получается логическое значение (true или false). Операция отношения имеет приоритет более низкий, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки равны, если они полностью совпадают по длине и содержат одни и те же символы (приложение 1).
2. Функция Copy. Функция Copy(S, Pozition, N) выделяет из строки S подстроку длиной N символов, начиная с позиции Pozition. Здесь N и Pozition — целочисленные выражения (приложение 1).
3. Функция Concat. Функция Concat(S1, S2, …, SN) выполняет сцепление (конкатенацию) строк S1, S2, …, SN в одну строку (приложение 1).
4. Функция Length. Функция Length(S) – определяет текущую длину строки S. Результат – значение целого типа (приложение 1).
5. Процедура DeleteПроцедура Delete(S, Poz, N) – удаление N символов из строки S, начиная с позиции Poz.
В результате выполнения процедуры уменьшается текущая длина строки в переменной S.
Глава II. Текстовые файлы.
Обработка текстовых файлов в языке Pascal
Прежде чем перейти к обработке текстовых файлов на языке Pascal следует разобраться с понятием файл. На языке Pascal файл представляет собой упорядоченную последовательность элементов. И в отличие от общепринятого понятия файлом на языке Pascal может быть не только информация хранящиеся на дисках, но и внешние устройства (такие как: дисплей, клавиатура, принтер, любой порт ПК и т. д.).
Теперь рассмотрим причину использования файлового типа данных при разработке программ. Введение файлового типа в язык Pascal вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ПК, предназначенными для ввода, вывода и хранения данных. Общее свойство массива, множества и записи заключается в том, что количество их компонентов определено на этапе написания программы (то есть в исходном тексте программы), тогда как количество компонентов файла в исходном тексте программы не определяется и может быть произвольным. Это обстоятельство позволяет оперативно изменять, к примеру, входные данные независимо от программы.
Принцип работы с файлами заключается в вводе и выводе данных. Операция ввода означает перепись данных из входного файла в основную память ПК, а операция вывода это пересылка данных из основной памяти ПК на выходной файл.
Файлы расположенные на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Pascal имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид:
‘[имя диска]:\[каталог]\[подкаталог]\...\[подкаталог]\[имя файла с расширением]’
Операционная система MS-DOS ограничивает эту строку до 79 символов. Даже в одноименном модуле DOS языка Pascal имеется тип данных PathSTR = String[79], то есть строка, максимальная длина которой 79 символов. Если же файл находится в том же каталоге, что и программа то имя файла можно указать короче: ‘[имя файла с расширением]’. Также именами файлов могут быть и имена внешних устройств:
‘CON’, 'LPT1', ‘LPT2’, ‘LPT3’, 'PRN', 'COM1', 'AUX', 'NUL'.
Отмечу что, здесь CON – совокупность устройств ввода-вывода, где устройство ввода клавиатура, а устройство вывода дисплей; 'LPT1', ‘LPT2’, ‘LPT3’ – последовательность устройств для печати и ‘LPT1’ синонимичен с 'PRN' и является обыкновенным принтером; 'COM1' – это последовательный порт ПК и т. д.
С файловой системой в Turbo Pascal связано понятие буфера ввода — вывода. Ввод и вывод данных осуществляется через буфер. Буфер – это область в памяти, которая выделяется для каждого файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь объем буфера не будет заполнен. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем данных считывается не столько, сколько запрашивается, а сколько поместится в буфер. Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами.
Теперь перейдем к переменным файлового типа. Язык Pascal поддерживает 3 файловых типа:
· 1-ый – текстовые файлы.
· 2-ой – типизированные файлы.
· 3-ий – нетипизированные файлы.
Описание переменных к этим трем файловым типам данных выглядит следующим образом:
· для текстовых файлов: Var T:Text; {T-файловая переменная текстового типа}
· для типизированных файлов: Var F:File of тип_данных; {F-типизированная файловая переменная; тип_данных – любой тип данных языка Pascal кроме файлового типа}
· для нетипизированных файлов: Var F:File; {F-нетипизированная файловая переменная}
Файловые переменные, которые описаны в программе, называют логическими файлами. Все основные процедуры и функции, обеспечивающие ввод — вывод данных, работают только с логическими файлами. Физический файл должен быть связан с логическим для выполнения определённых действий над ним. В последствие будут изложены стандартные функции и процедуры для работы с файлами и в особенности для обработки текстовых файлов.
Особое место на языке Pascal занимают текстовые файлы, которые являются темой настоящей курсовой работы. Текстовый файл представляет собой линейную последовательность символов, организованных в строки переменной длины.
В конце строк стоит признак конца строки EOln (в операционной системе MS-DOS, а как следствие и в её оболочке MS-Windows End Of Line состоит из двух символов: LF- перевод строки, имеющий порядковый номер в ASCII таблице #10 и CR — возврат каретки c порядковым номером в ASCII таблице #13). В самом конце текстового файля стоит признак конца файла EOF (End Of File имеющий порядковый номер в ASCII таблице -#26). Признак конца строки вводится при помощи нажатия клавиши Enter, а признак конца файла при помощи нажатия клавиш Ctrl+Z. Обычно эти специальные символы или признаки не отображаются в текстовых редакторах.
В текстовом файле всегда имеется так называемый курсор или указатель который стоит на определенном символе. Если файл пустой то первым и единственным считанным символом будет EOF (#26).
Помимо текстовых переменных вводимых программистом но языке Pascal имеются также стандартные файловые переменные текстового типа: Input и Output. Стандартная текстовая переменная Input представляет собой доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы. Стандартная текстовая переменная Output – это доступный только для записи файл, связанный со стандартным файлом вывода. Обычно стандартным файлом ввода-вывода является внешнее устройство – Консоль (‘CON’) о котором уже говорилось выше.
В чем же суть обработки текстовых файлов? Учитывая специфику слова «обработка», под обработкой текстовых файлов можно понять считывание информации со входного файла, изменение информации и записи этой информации на выходной файл. Запись не читанных со входного файла текстовых данных на выходной файл является видоизменением текстового файла, но не подпадает под понятие обработка текстового файла.
Теперь самое время перейти к стандартным функциям и процедурам, которые Pascalпредоставляет нам для работы с текстовыми файлами и в некоторых случаях с файлами вообще.
1. Процедура Assign([файловая переменная],[имя файла]);
Для работы с файлами вторым важным действием после объявления файловой переменной является «связывание» этой переменной с физическим файлом. Это действие и выполняет процедура Assign.То есть выполняя действия над файловой переменной программа, ассоциирующая файловую переменную с конкретным физическим файлом, производит операции именно над этим физическим файлом. Как было отмечено процедура Assignявляется обязательной для работы с файлами. С одним и тем же физическим файлом можно связать несколько файловых переменных. Также с одной файловой переменной можно последовательно связать различные физические файлы. Причем при последовательном связывании с одной и той же переменной различных физических файлов операции произведенные над переменной до связывания становятся недействительными. Например следует дважды открыть одну и ту же переменную дважды связанную с различными файлами для чтения: Assign(T,’file1.txt); Reset(T); Assign(T,’file2.txt’); Reset(T);. О процедурах открытия файлов будет говориться ниже.
Что касается стандартных входных и выходных текстовых файлов Inputи Outputто они автоматически связываются со стандартным устройством ввода-вывода (обычно это совокупность устройств – дисплей и клавиатура). То есть два оператора Assign(Input,’CON’); Assign(Output,’CON’); выполняются по умолчанию и их не следует писать. Процедура Assignработает со всеми типами файлов.
В приложении 2 приводится пример программы использующей процедуру Assign.
2. Процедура Reset([файловая переменная]);
Открывает логический файл (то есть файловая переменная связанная с физическим файлом) для чтения. Естественно, что для чтения следует открывать входной файл. После выполнения процедуры Resetкурсор ставится на первый элемент файла (в случае текстового файла на первый символ) и с файла уже можно считывать информацию. Если текстовый файл пустой, то первым символом будет EOF— #26.
В приложении 2 приводится пример программы использующей процедуру Reset.
Что касается стандартного входного текстового файла Input, то он открывается для чтения автоматически. То есть не следует писать Reset(Input); в программе.
3. Процедура Rewrite([файловая переменная]);
Создает и открывает внешний физический файл связанный с файловой переменной для последующей записи в него. Новый созданный файл бывает пустой и курсор становится в самое начало файла. Если описанный в процедуре Assignвнешний файл уже существует, то он стирается и создаётся заново. Разумеется после выполнения процедуры Rewriteсозданный для записи файл является выходным файлом. Процедура Rewriteиспользуется со всеми файловыми типами данных.
В приложении 3 приводится пример программы использующей процедуру Rewrite.
Что касается стандартного выходного текстового файла Outputто он открывается для записи автоматически. То есть не следует писать Rewrite(Output); в программе.
4. Процедура Append([файловая переменная]);
Открывает внешний физический текстовый файл связанный с файловой переменной для последующей записи в него. Однако в отличии от процедуры Rewriteэтот файл существует запись производится в самый конец файла. Разумеется процедура Appendиспользуется для открытия выходных текстовых файлов. После открытия файла курсор становится в самый конец файла. Процедура Appendиспользуется только для текстовых файлов.
В приложении 3 приводится пример программы использующей процедуру Append.
5. Процедура Close([файловая переменная]);
Сохраняет и закрывает открытый физический файл связанный с файловой переменной. Как было отмечено в определении файл перед закрытием должен быть открыт (процедурами Resetили Rewriteдля всех типов файлов или процедурой Appendдля текстовых файлов). Если в выходных файлах были произведены изменения, то для сохранения информации они должны быть обязательно закрыты процедурой Close. Процедура Closeможет быть использована для любых типов файлов. Если последовательно открывать файл различными процедурами, то в промежутках между этими процедурами оператор Closeавтоматически. То есть если в начале открыть файл для записи процедурой Rewriteа затем сразу открыть его для чтения процедурой Reset, то до процедуры Resetавтоматически произойдет сохранение и закрытие файла оператором Close.
В приложении 4 приводится пример программы использующей процедуру Close.
6. Процедура Erase([файловая переменная]);
Процедура Eraseудаляет физический файл связанный с файловой переменной. Физический файл связанный с файловой переменной должен существовать, иначе при попытке удалить несуществующий файл процедурой Eraseпроизойдет ошибка времени.
В приложении 4 приводится пример программы использующей процедуру Erase.
7. Процедура Read([файловая переменная],[список ввода]);
Присваивает одно или несколько значений из файла связанного с файловой переменной в одну или несколько переменных, описанных в списке ввода. В списке ввода могут быть одна переменная или перечислены несколько переменных через запятую. Переменные для ввода из текстового файла могут быть следующих типов:
ü Символьный тип данных (Char).
ü Строковой тип данных (String).
ü Целочисленный тип данных (Integer, LongInt, Word, Byte).
ü Переменныевещественноготипа(Real, Single, Double, Complex, Extended).
Считывание информации из входного файла процедурой Readвсегда происходит только последовательно. Так как при считывании текущая позиция перемещается к следующему символу.
Теперь рассмотрим как процедура Readприсваивает значения различным типам данных.
Ø Символьный тип. При вводе переменных типа Charвыполняется
чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель достиг конца очередной строки, то результатом чтения будет символ CR(ASCIIкод #13), а если достигнут конец файла, то — символ EOF( код #26).
Ø При вводе переменных типа Stringколичество считанных процедурой и
присвоенных строке символов равно максимальной длине строки, если только раньше не встретились символы CRи EOF. В этом случае сами символы CRи EOFв строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до маркера конца строки или файла отбрасываются, а новое обращение к Readвозвращает пустую строку. Таким образом, процедура Readне в состоянии прочесть последовательность строк из текстового файла: строки прочитанные до маркеров конца строки или файла будут нормальными а после маркеров будут пустыми.
Ø При вводе числовых переменных процедура Readвначале выделяет
подстроку во входном потоке по следующем правилу: все ведущие пробелы, символы табуляции и маркеры конца строк EOLnпропускаются, после выделения первого значащего символа, наоборот, любой из перечисленных символов или EOFслужат признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется в численное представление, а полученное значение присваивается числовой переменной. Если в подстроке был нарушен требуемый формат представления численной константы, возникает ошибка ввода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получает значение 0. В Турбо Паскале не предусмотрен ввод шестнадцатеричных констант.
Отмечу что, ввод переменных типа Booleanпроцедурами ввода не предусмотрен.
Что касается стандартных текстовых переменных, то при использовании процедуры Readприменительно к стандартному входному файлу Input, т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, который передается процедуре только после нажатия на клавишу Enter. Кроме того, при работе с файлом Inputв записи оператора Readне надо писать имя файла, иначе это приведет к ошибке. Это позволяет редактировать данные при их вводе. Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Ввод с клавиатуры по процедуре Readсопровождается эхо-повтором вводимых символов на экране ПК.
Процедура Readпрекрасно приспособлена вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т. е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовое представление чисел.
В приложении 5 приводится пример программы использующей процедуру Read.
8. Процедура ReadLn([файловая переменная],[список ввода]);
Это процедура идентична процедуре Read (она также присваивает переменным, перечисленным в списке ввода значения, считанные из текстового файла), за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера Eolnпропускается. Поэтому следующее обращение к ReadLnили Readначинается с первого символа новой строки. Кроме этого, эту процедуру можно вызывать без параметра [список ввода], что приведет к пропуску всех символов текущей строки вплоть до продолжение
--PAGE_BREAK--