begin
assign (f,name); // связывание файловой переменной с именем файла на диске
reset (f); // открытие существующего файла на чтение
repeat
readln(f,a,b); // чтение из файла информации из целой строки
writeln(a:5,b:5); // вывод в окно CRT
until Eof (f); // Функция eof возвращает true при достижении конца файла
close (f); // закрытие файла
end.
В этом пример надо обратить внимание на следующее: 1. reset (f) – открытие существующего файла на чтение, если файла нет, то произойдет ошибка выполнения программы;
2. readln (f,…) – оператор чтения из файла, при работе с файлами действие операторов read (f,…) и readln (f,…) различно, первый прочитает необходимую информацию посредине строки, так что следующий оператор чтения продолжит чтение со средины строки. Оператор readln после чтения информации пропустит все оставшиеся до конца строки символы, таким образом следующий оператор чтения начнет ввод с начала следующей строки;
3. Функция eof (f) возвращает всегда ложное значение, кроме одного единственного случая: достигнут конец строки. Для того, чтобы обойти всякие тонкие случаи, когда в конце файла есть несколько символов «конец строки» или лишние пробелы и символы табуляции, рекомендуются использовать функцию SeekEof (f) – ее действие аналогично eof, но она возвращает true, если до конца файла есть только «пустые» символы: конец строки, табуляция и пробелы[14].
Задание 14
1. Напишите программу, создающую таблицу умножения в файле mult .txt. Для ее создания используйте вложенные циклы for (стр. 20). Откройте получившийся файл в текстовом редакторе (3балла)
2. Напишите программу чтения файла, созданного в упражнении 14.1 (2 балла)
- 40 -
Тема №15 Работа со строками символов
В языке Pascal присутствуют два типа для работы с символьной информацией. Переменные типа char могут принимать значение одного из 256 символов стандартной таблицы кодировки. Константы типа char записываются в виде одного символа в апострофах. Символьные переменные можно вводить оператором readln, но при этом придется еще нажимать Enter для подтверждения ввода. В модуле CRT есть очень удобная функция ReadKey, которая вводит символьную переменную без подтверждения ввода.
Пример :
var c : char;
…
c:='a';
readln(c);
c:=ReadKey;
Для работы с символьными переменными в языке Pascal есть две специальные функции: ord и chr. Первая функция возвращает код (порядковый номер в таблице кодировки) символа, например ord('A') вернет значение 65. Вторая функция имеет обратный смысл, по коду, возвращает символ, т.е. chr(65) будет символ 'A'. Следующий пример выводит все символы кодовой таблицы, начиная с кода 32[15] и заканчивая кодом 255. Оператор if в цикле производит переход на новую строку после вывода линейки из 32 символов. Результат работы программы приведен ниже.
Program ANSI;
Uses CRT;
var c : char;
i : integer;
begin
for i:=32 to 255 do
begin
write(Chr (i));
if (i+1) mod 32 = 0 then writeln;
end;
end.
В языке Turbo Pascal появился специальный тип string, который имеет черты массива символов, а также некоторые дополнительные удобные возможности. Тип string реализован и в языке ABC Pascal.
Строки в Pascal ABC имеют тип string и состоят из не более чем 255 символов. При описании var s: string; под переменную s отводится 256 байт, при этом в нулевом байте хранится длина строки.
Для экономии памяти предусмотрено описание вида var s1: string [40]; В этом случае под строку отводится 41 байт (нулевой байт – под длину строки). В случае присваивания переменной s1 строки из более чем 40 символов лишние символы отсекаются, и длина строки s1 полагается равной 40.
При выполнении операции конкатенации («склеивания») вида s1+s1 результат считается строкой типа string, т.е. занимает 256 байт. Однако если при конкатенации результат будет занимать более 255 символов, то программа завершится с ошибкой. Строки можно сравнивать, подразумевается их упорядоченность по алфавиту.
К символам в строке можно обращаться, используя индекс: s[i] обозначает i-й символ в строке. Обращение к нулевому символу s[0] считается ошибочным.
- 41 -
Для того чтобы узнать длину строки следует воспользоваться встроенной функцией Length (s).
Чтобы изменить длину строки, следует воспользоваться процедурой SetLength (s,n).
Если индекс i выходит за пределы памяти, отводимой под строку, то выдается сообщение об ошибке. Однако если индекс i выходит лишь за пределы длины строки, то сообщение об ошибке не выдается.
Тип char и тип string могут быть параметрами процедур и функций, а также возвращаться функциями. Для иллюстрации работы со строками и символами напишем функцию, заменяющую в строки заданный символ на другой и возвращающую результат.
Program Strings; // замена символов a на b в строке s
function replace(s : string; a,b : char):string;
var i : integer;
begin
for i:=1 to Length (s) do // цикл для всех символов строки
if s[i]=a then s[i]:=b; // замена символов
replace:=s; // имени функции присваивается значение
end;
begin
writeln (replace('мама мыла раму','м','н')); // Проверка работы функции
end.
Тип char или string может использоваться для чтения информации из текстового файла, например:
Program ReadText;
Uses CRT;
var name : string; // Имя файла
s : string; // Буфер для чтения строки
f : text; // Файловая переменная
n : integer; // Счетчик строк
begin
write('Введите имя файла: '); readln (name); // Ввод имени файла
assign (f,name); reset (f); // Открытие файла
n:=0; // Обнуление счетчика
while not eof (f) do // Чтение «пока не конец файла»
begin
readln (f,s); // Чтение одной строки из файла f
writeln (n:4,': ',s); // Вывод номера и строки на экран
inc(n); // inc(n) – операция увеличения на единицу
if n mod 25 = 0 then readln; // Пауза после каждой 25-й строки
end;
close (f);
end.
Задание 15
1. С помощью функций ReadKey и Ord напишите программу, которая выводила бы сразу символ и его код по нажатию одной клавиши. (2 балла)
2. Напишите целочисленную функцию с двумя параметрами, подсчитывающую сколько раз символ, заданный вторым параметром, встречается в строке, заданной первым параметром, и проверьте её работу. (2 балла)
3. Напишите программу, запрашивающую имена файлов, и копирующую один файл в другой, заодно вычисляя число строк (или символов) в файле (3 балла)
- 42 -
Для работы с текстовыми строками в языке Pascal существует набор функций, который немного расширен в реализации ABC Pascal. Приведем справочник по этим функциям.
Стандартные процедуры и функции для работы со строками
Имя и параметры
Типы параметров
Тип возвращаемого значения
Действие
Length(s)
s - string
integer
возвращает длину строки s
Copy(s,index,count)
s - string, index и count - integer
string
возвращает подстроку строки s длины count, начиная с позиции index
Delete(s,index,count)
s - string,
удаляет в строке s count символов index и начиная с позиции index count - integer
Insert(subs,s,index)
s, subs - string, index - integer
вставляет подстроку subs в строку s с позиции index
Pos(subs,s)
s, subs- string
integer
возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена)
SetLength(s,n)
s - string, n - integer
устанавливает длину строки s равной n
Str(x,s)
Str(x:n,s)
Str(x:n:m,s)
s - string, x - integer, real и n, m - integer
преобразует x к строковому представлению (во втором и третьем случаях согласно формату вывода, устанавливаемому n и m) и записывает результат в строку s
Val(s,v,code)
s - string, v - integer, real, и code - integer
преобразует строку s к числовому представлению и записывает результат в переменную v. Если преобразование возможно, то в переменной code возвращается 0, если невозможно, то в code возвращается ненулевое значение
Concat(s1,...,sn)
s1,..., sn - string
string
возвращает строку, являющуюся string результатом слияния строк s1,..., sn.
Результат тот же, что у выражения s1+s2+...+sn