Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование delphi.doc
Скачиваний:
806
Добавлен:
09.02.2015
Размер:
2.97 Mб
Скачать

Индивидуальное задание

Придумать изображение средней сложности (не меньше 20 команд рисования) и запрограммировать его.

Итоги

В пятой теме были изучены: графические примитивы; основы печати графического изображения; способ программирования мультипликации; диалог настройки принтера; диалог настройки печати.

При создании демонстрационной программы получены навыки в работе: с визуальным компонентом «таймер»; в построении сложного изображения.

6. Работа с текстовой информацией

Цель: изучение работы со строковыми переменными; работа с текстовыми файлами; стандартные диалоговые окна.

6.1. Теоретические сведения

Символы и строки. Для задания в программе символьных переменных можно использовать стандартный тип языка Паскаль – Char. Значением переменной типа Char может быть любой символ, отображаемый на экране: буква русского или латинского алфавита, цифра, знак препинания, специальные символы, например символ клавиши <Enter> («переход на новую строку»). Переменная должна быть объявлена в разделе описания переменных. Значение переменной заключается в прямые одинарные кавычки: ch := ‘Л’ – переменная ch получает значение – символ буквы Л. Переменные типа Char можно сравнивать друг с другом, используя соотношение: ‘0’<‘1’<…<‘A’<‘B’<…<‘a’<‘b’<…<‘А’<‘Б’<…<‘а’<…<‘я’. Часть символов не имеет буквенных обозначений на клавиатуре. Для их обозначения необходимо использовать оператор Chr(код), где код – номер символа, который нужно вывести. Все символы пронумерованы: системные символы имеют коды 1…31, цифры (‘0’…‘9’) – 48…57, латинские буквы (‘A’…‘z’) – 65…122, русские буквы (‘А’…‘п’) – 128…175, ( ‘р’…‘я’) – 224…239. Вместо функции Chr можно использовать оператор #. Для обратной операции – получения номера указанного символа – служит оператор Ord(символ).

Пример

Ch := Chr(13) – переменной символьного типа Ch присвоить значение символа «переход на новую строку»;

S := #10 – переменной символьного типа S присвоить значение символа «конец строки».

V := Ord(‘5’) – переменная целого типа получит значение кода символа ‘5’ – код символа ‘5’ равен 53.

На базе стандартного типа Char создан тип «строка» – String и все производные от него типы (см. 2.1). Далее будем рассматривать стандартный тип String. Строка представляет собой массив символов, т. е. является описанием array [0..255] of Char. Таким образом, к элементу строки можно обращаться по номеру – если переменная S имеет тип «строка», то S[2] даст второй символ строки, S[5] пятый символ строки, S[0] даст символ, отображающий длину строки. Например, если строка имеет длину 7 символов и обозначена переменной S, то S[0] даст символ ‘7’. По умолчанию максимально доступная длина строки равняется 255 символам. Если необходимо ограничить длину строки, то после описания типа переменной String указывают в квадратных скобках требуемую длину строки.

Примеры

S : String[15]; – переменная S является строкой с максимально доступной длиной, равной 15;

Если переменная имеет значение S := ‘абвгд’, то S[2] даст значение ‘б’ – второй символ в строке s.

Строки можно сравнивать друг с другом посимвольно – если символы строк одинаковы, то такие строки равны; если в одинаковых позициях расположены разные символы, то больше та строка, у которой код символа больше.

Пример

‘Аб’ > ‘АБ’ – во второй позиции код символа б больше кода Б;

‘Аб’ < ‘Аб’ – вторая строка имеет большую длину;

‘Аб’ = ‘Аб’ – строки равны по длине и по составу символов.

Со строками можно выполнять следующие операции:

Length(строка) – возвращает длину строки, описанной переменной строка. В отличие от команды переменная[0] команда Length возвращает числовое значение длины строки.

Delete(строка, позиция, количество) – удаляет из строки количество символов, начиная с позиции позиция.

Pos(подстрока, строка) – возвращает позицию вхождения подстроки подстрока в строку строка. Если в строке нет искомой подстроки, оператор Pos вернет значение 0.

Copy(строка, позиция, количество) – копирует из строки строка с позиции позиция количество символов, указанных в переменной количество.

Insert(строка, подстрока, позиция) – вставляет в строку строка с позиции позиция подстроку подстрока.

Примеры

Пусть переменная S строкового типа, имеющая значение ’Санкт-Петербург’, и V – переменная целого типа:

V := Length(S) – V получит значение 14;

Delete(S,1,6) – переменная S получит значение ‘Петербург’;

V := Pos(‘Петербург’,S) – переменная V получит значение 7;

S := Copy(S,7,8) – переменная S получит значение ‘Петербург’;

Insert(S, ‘-’,6) – строка S получит значение ‘Санкт--Петербург’.

Файлы и работа с текстом. Иногда необходимо выводить информацию не на экран, а в файл или считывать информацию из файла. Для этих целей существует переменная типа file. При её создании указывается тип файла, т. е. тип данных, которые будет хранить файл. Для указания типа файла указывают file of тип. Особым является файл для содержания текстовой информации, который описывается как TextFile.

Примеры

Res : file of char; – переменная Res указывает на файл символов;

T : file of integer; – переменная T указывает на файл целых чисел;

Str : File of String; – переменная Str указывает на файл строк;

Text : TextFile; – переменная Text указывает на текстовый файл.

Замечание. Файл строк и текстовый файл это не одно и то же. Текстовый файл самостоятельно обрабатывает признак конца строки и переход на новую строку.

Для связки переменной типа «файл» с конкретным файлом на диске необходимо использовать оператор AssignFile(переменная, путь_к_файлу).

Примеры

AssignFile(text, ‘document.txt’); – установление связи между переменной text и файлом document.txt;

AssignFile(res, ‘a:\chars.dat’); – установление связи между переменной res и файлом chars.dat, находящимся в корневой папке диска а:.

Замечание. Для обеспечения возможности запуска программы с разных папок/компьютеров не следует без необходимости указывать жесткий путь к файлу, а считать, что файл хранится в текущей папке, или указывать путь от текущей папки. Данное соглашение позволит переносить программу на другой компьютер без требования идентичной настройки структуры папок на двух компьютерах.

Для вывода информации в файл используется оператор write(переменная_типа_файл, информация)

или writeln(переменная_типа_файл, информация),

где

переменная_типа_файл – переменная, указывающая на файл, в который осуществляется вывод информации;

информация – записываемая в файл информация.

Оператор writeln работает только в текстовых файлах, его отличие от write в том, что после вывода информации курсор в файле переводится на новую строку.

Команда writeln(переменная_типа_файл) – добавит пустую строку.

Пример

Пусть описана переменная F типа текст (F : TextFile) и выводимая информация хранится в переменных X1 и Y1. Вывод значений этих переменных в файл на разных строках может быть выполнен так: writeln(F,X1); writeln(F,Y1);

Для считывания информации используется оператор

read(переменная_типа_файл, информация)

или readln(переменная_типа_файл, информация).

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

Команда readln(переменная_типа_файл) переведет курсор в файле на новую строку.

Для работы с файлом необходимо указать операцию, которая будет выполняться с файлом: чтение или запись (здесь не рассматриваются случаи, когда необходима работа с файлом, позволяющая одновременно и записывать, и считывать информацию). Для текстовых файлов существует еще одна возможность – открыть файл на последней строке для дописи информации. Эти операции описываются операторами:

Reset(переменная_типа_файл) – открыть файл для чтения;

Rewrite(переменная_типа_файл) – открыть файл для записи;

Append(переменная_типа_файл) – открыть файл для дописи.

Необходимо отметить особенности работы этих операторов. Оператор Reset открывает файл для чтения; если в момент открытия файла не существует, то это приведет к ошибке. Это же ограничение накладывается и на команду Append. При открытии для записи (команда Rewrite) уже имеющегося файла, он будет предварительно очищен, т. е. вся информация из него будет удалена; если файл на момент открытия отсутствовал, то он будет создан.

При возникновении ошибок открытия файла программа выдаст стандартное окно сообщения об ошибке. Для того чтобы самостоятельно учитывать и обрабатывать возможные ошибки при работе с файлами, необходимо:

  1. Отключить автоматический контроль работы с файлами – директива {$I-}; такая команда сообщает компилятору, что автоматическая обработка исключительных ситуаций при работе с файлами отключена (все директивы компилятора начинаются с последовательности двух значков – «открывающаяся фигурная скобка» и «знак доллара» и заканчиваются «закрывающейся фигурной скобкой».).

  2. Выполнить критическую операцию (открытие, чтение и т. д.).

  3. Включить директиву автоматической проверки корректности операций с файлами – директива {$I-}.

  4. Проверить результат операции, возвращаемый оператором IOResult. Если этот оператор возвращает 0, то операция прошла успешно, иначе он возвращает код ошибки;

  5. Проанализировать сообщение оператора IOResult и при необходимости выполнить соответствующие действия. Например, если при открытии файла для чтения выяснилось, что файл не существует, то создать его командой Rewrite, а затем снова открыть для чтения.

После окончания работы с файлом необходимо закрыть переменную типа «файл» с помощью команды CloseFile(переменная_типа_файл).

Замечание. Сколько раз файл был открыт (для чтения или для записи), столько же раз он должен быть закрыт.

При считывании информации из файла необходимо знать сколько информации можно из него считать? Для этих целей введена переменная EOF(переменная_типа_файл, читаемая End Of File – конец файла), которая принимает значение true при достижении конца файла и false в противном случае. Поэтому процесс считывания информации из файла обычно осуществляется в цикле до тех пор, пока не достигнут конец файла (если нет другого условия окончания операции считывания). Для текстовых файлов существует также переменная, оценивающая, не достигнут ли конец строки – EOLn(переменная_типа_файл, читаемая End Of Line – конец строки), которая принимает значение true при достижении конца строки и false в противном случае.

Для демонстрации последовательности работы с файлом рассмотрим фрагмент программы посимвольного считывания информации из текстового файла document.txt и подсчета количества символов в файле. Будем считать, что раздел переменных содержит описание переменных: F:TextFile; – текстовый файл; C:Char; – считываемые символы; I:Integer; – переменная для подсчета количества символов.

Пример

var //Раздел описания переменных

F : TextFile;

C : Char;

I : Integer;

begin

AssignFile(F, ‘document.txt’); //Связка файла и файловой переменной

{$I-} //Отключить автоматическую проверку

reset(F); //Открыть файл для чтения

{$I+} //Включить автоматическую проверку

If IOResult = 0 then //Если операция прошла успешно, то

begin

I := 0; //Установить счетчик символов в 0

While Not EOF(F) do //Пока не конец файла

begin

while Not EOLn(F) do //Пока не конец строки

begin

read(F,C); //Считать очередной символ

Inc(I); //Увеличить счетчик символов

end;

readln(F); //Перейти к считыванию новой строки

end

end

else

begin

MessageDlg(‘Ошибка открытия файла’, mtError, [mbOk], 0);

//В случае ошибки выдать сообщение об ошибке

end;

end;

В примере для вывода сообщения об ошибке было использовано стандартное диалоговое окно.