Внастоящее время в компьютерном мире существует множество языков программирования

Вид материалаДокументы

Содержание


5.3. Индивидуальное задание
6. Работа с текстовой информацией
Char создан тип «строка» - String
Copy(S,7,8) - переменная S получит значение ’Петербург’; Insert
Замечание: файл строк
Reset(переменная_типа_файл) - открыть файл для чтения; Rewrite
Стандартные диалоговые окна.
Вид кнопок
Подобный материал:
1   ...   8   9   10   11   12   13   14   15   16

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


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

5.4. Итоги


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

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

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


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

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

Символы и строки. Для использования в программе символьных переменных можно использовать стандартный тип языка Паскаль – Char. Значением переменных типа Char может быть любой символ, отображаемый на экране: буква русского или латинского алфавитов, цифра, знак препинания, специальные символы, например символ клавиши («переход на новую строку»). Переменная должна быть объявлена в разделе описания переменных. Значение переменной заключается в прямые одинарные кавычки: 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. Отключить автоматический контроль работы с файлами – директива {$R-}, такая команда сообщает компилятору, что автоматическая обработка исключительных ситуаций при работе с файлами отключена. (Все директивы компилятора начинаются с последовательности двух значков – «открывающаяся фигурная скобка» и «знак доллара» и заканчиваются «закрывающейся фигурной скобкой»);
  2. Выполнить критическую операцию (открытие, чтение и т.д.);
  3. Включить директиву автоматической проверки корректности операций с файлами – директива {$R+}.
  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’); //Связка файла и файловой переменной

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

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

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

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;

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

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


MessageDlg(сообщение, Тип, Кнопки, КонтекстСправки)

где

Сообщение – выводимое сообщение;

Тип - тип сообщения, Сообщение может быть информационным, предупреждающим или сообщением об ошибке;

Кнопки - список, определяющий число и вид кнопок;

КонтекстСправки – определяет номер экранной справки, так как экранная справка не используется, то необходимо установить значение 0.

Константы, определяющие тип окна сообщения и вид кнопок перечислены в таблице 6.1.

Таблица 6.1

Тип сообщения

Константа

Сообщения

Значок

MtWarning

Внимание



MtError

Ошибка



MtInformation

Информация



mtConfirmation

Запрос подтверждения



MtCustom

Пользовательское окно

-

Вид кнопок

Константа

Обозначение

Код возврата

MbYes

Да

mrYes

MbNo

Нет

mrNo

MbOk

Ok

mrOk

MbCancel

Отмена

mrCancel

MbHelp

Помощь

mrHelp

MbAbort

Прекращение

mrAbort

MbRetry

Повтор

mrRetry

MbIgnore

Игнорировать

mrIgnory

MbAll

Все

mrAll

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

Пример:

Пусть необходимо выдать диалоговое окно запроса с тремя кнопками «Yes», «No» и «Cancel» и проанализировать какая кнопка была «нажата».

W := MessageDlg(‘Какую кнопку нажать?’, mtConfirmation,

[mbYes, mbNo, mbCancel]);

Case W of

mrYes : {действие, связанное с «нажатием» на кнопку Yes};

mrNo : {действие, связанное с «нажатием» на кнопку No};

mrcancel : {действие, связанное с «нажатием» на кнопку Cancel};

end;