Обработка символьной информации. строки
Обработка символьной информации
До сих пор в основном рассматривались программы, предназначенные для обработки числовых данных. Обработка символьных (литерных) данных становится возможной благодаря привлечению значений и переменных типа char.
Значениями типа char служат все символы алфавита языка Паскаль: буквы, цифры, знаки операций, скобки, пробел и т.д. Исключение составляет штрих (апостроф) - ‘, имеющий специальное назначение и употребляющийся всякий раз, когда значение типа char явно указывается в программе. При выполнении процедуры вывода штрихи на печати не выводятся.
Например:
var u : char;
…
u := ‘b’; write(u); при этом на экране печатается b.
Символы, подготовленные для ввода, не отделяются друг от друга никакими знаками. Если три символа будут вводиться с помощью read(a, b,c), то можно будет набрать на клавиатуре чшщ (без пробела).
Все множество символов считается упорядоченным. Упорядоченность получается так: из всех символов составлен список, и из двух символов меньше тот, который встречается в списке раньше.
Например:
‘a’ < ‘b’ < … < ‘z’
‘A’ < ‘B’ < … < ‘Z’
‘0’ < ‘1’ < … ‘9’
При построении условий, например, располагающихся после if и while, можно использовать разнообразные отношения в множестве символов: =, <>, >, >=, <, <=. Например, ‘a’ < ‘c’; ‘3’ > ‘1’.
Упорядоченность открывает возможность использования в программах операторов цикла с параметром, имеющим тип char. Например:
var c : char;
…
for c := ‘a’ to ‘z’ do write(c);
for c := ‘z’ to ‘a’ do write(c);
при этом в первом случае на экране появится abcdefg…xyz, а во втором – zyx…gfedcba.
В следующих двух примерах будут приведены программы, которые предназначены для исследования и преобразования символов, предшествующих символу / в последовательности данных символов.
Пример 7.1 Программа замены всех восклицательных знаков точками.
program p71;
var c : char;
begin read(c);
while c <> ‘/’ do
begin if c = ‘!’ then write(‘.’) else write(c);
read(c);
end;
end.
Пример 7.2 Программа выбрасывания групп символов, расположенных между скобками (,). Сами скобки тоже выбрасываются. Предполагается, что внутри каждой пары скобок нет других скобок.
program p72;
var c : char; i : integer;
begin i := 0; read(c);
while c <> ‘/’ do
Begin
if c = ‘(‘ then i := 1 else
if c := ‘)’ then i := 0 else
if i = 0 then write(c); read(c)
End
End.
Пример 7.3 Программа вывода последовательности букв:
a
ab
abc
…
abc…xyz
program p73;
var c, d : char;
Begin
for c := ‘a’ to ‘z’ do
Begin
for d := ‘a’ to c do write(d);
writeln
End
End.
Высказывание «значение переменной а типа char есть буква» может быть записано так: (а >= ‘a’) and (a <= ‘z’) или a in [‘a’..’z’]. Для проверки, является ли значением а цифра можно составить выражение а in [‘0’..’9’].
Пример 7.4 Программа читает первое слово в тексте и печатает число букв в нем.
program p74;
var c : char; i : integer;
Begin
i := 0; repeat read(a) until c in [‘a’..’z’];
repeat i := i + 1; read(c) until not (c in [‘a’..’z’]);
writeln(‘Число букв в первом слове текста:’, i:2)
End.
Задание 7.1
1. Всегда ли справедливо следующее утверждение:
а) если с литера и ‘0’ £ ‘9’, то с – цифра;
б) если с – литера и ‘a’ c ‘z’, то с – строчная латинская буква;
в) ‘9’ < ‘a’;
г) ‘0’ = 0;
д) ord(‘0’) = 0;
е) ‘a’ = ‘A’;
ж) если с и d – литеры, то с < d тогда и только тогда, когда ord(c) < ord(d);
з) ord(chr(k)) = k для любого целого k;
и) chr(ord(c)) = c для любой литеры с.
2. Вычислите значения выражений:
а) pred(‘7’); | б) succ(‘0’) = pred(‘2’); |
в) ord(‘5’) – ord)(‘0’); | г) ‘d’ < ‘a’; |
д) ord(‘q’) < ord(‘z’); | е) chr(25)>= chr(16); |
ж)ord(pred(chr(24))); | з) chr(ord(‘5’) + 1). |
3. Имеется символьная переменная d. Присвойте логической переменной t значение true, если выполняется указанное условие, и значение false в противном случае:
а) значение d – это литера ‘*’;
б) значение d – литера ‘a’ или ‘q’;
в) значение d – цифра.
4. Определите значение переменной d после выполнения следующих операторов:
а) c := ‘+’; d := c; б) c := ‘+’; d := ‘c’.
5. Вычислите s – сумму порядковых номеров всех букв, входящих в слово SUM.
6. Напечатайте текст, образованный литерами с порядковыми номерами 65, 71 и 69.
7. Символьной переменной next присвойте цифру, следующую за цифрой, являющейся значением символьной переменной dig, считая при этом, что за ‘9’ следует ‘0’.
8. Логической переменной f присвойте значение true, если между буквами ‘a’ и ‘z’ нет иных символов, кроме строчных латинских букв, и значение false иначе.
9. Напечатайте заданный непустой текст:
а) удалив из него все цифры и удвоив знаки «+» и «-«;
б) удалив из него все знаки «+», непосредственно перед которыми идет цифра.
10. Выведите в одну строку ABBCCC…ZZ…Z.
11. Выведите в одну строку ZYY…AA…A.
12. Выведите треугольник
A B C … Z
B C … Z
… Z.
Строки
Строка (string) – это структурированный тип, во многом похожий на массив символов. Основное отличие – число символов в строке динамическое: от 0 (пустая строка) до указанной при описании максимальной длины, в то время как для массивы число элементов в нем фиксировано. Если максимальная длина не указана при объявлении строковой переменной, то предполагается максимально возможная длина – 255 символов. Например:
var s : string [20];
Каждая строковая переменная занимает на один байт больше – в нулевом байте хранится фактическая длина строки.
Строковые выражения состоят из строковых констант, переменных, функций и операций.
Знак + в операциях со строками означает сцепление. Длина результата при этом не больше 255 символов.
Над строковыми данными допустимы и операции отношения.