Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 13 строки.doc
Скачиваний:
2
Добавлен:
08.05.2019
Размер:
94.72 Кб
Скачать

Практика по программированию - 2012 ПЗ- II курс

Занятие №13

Тема: Символьные переменные и строки. Обработка строк.

В Pascal 7.0 существует стандартный тип данных, который называется символьным, - char. Этот тип является порядковым, и значения символьных переменных могут сравниваться между собой.

К символьным переменным относятся все заглавные латинские буквы ’A’, ’B’, ’C’,…, ’Z’, строчные ’a’, ’b’, ’c’, …, ’z’, цифры ’0’, ’1’, ’2’, …, ’9’, знаки препинания, всевозможные скобки, русские буквы и т.д. В программах их значения всегда заключаются в апострофы. Внутри каждого такого ряда коды символов упорядочены:

’A’<’B’<’C’<…<’Z’

’a’<’b’<’c’< …<’z’

’0’<’1’<’2’< …<’9’

’A’<’Б’<’В’<…<’Я’

’a’<’б’<’в’< …<’я’.

Коды всех строчных букв меньше всех заглавных.

Для работы с таким типом данных, как и для других порядковых типов, часто используются функции, аргументы которых могут быть символьными переменными:

Pred() – предыдущее значение, например, Pred(’B’) = ’A’;

Succ() – последующее значение, например, Succ(’a’) = ’b’;

Ord() – численное значение кода, например, Ord(’7’)- Ord(’0’)=7.

Символьные переменные могут использоваться как переменные цикла, например:

For i:= ’Z’ downto ’A’ do или For i:=’A’ to ’Z’ do.

Последовательность символов, заключённая в апострофы, называется строкой и описывается типом string:

’ASEWQ’, ’zxczxczxc’, ’хи-хи’ и т.д.

Строки, состоящие всего из одного символа, называются символьными константами.

У типа-строки может быть указан размер (от 1 до 255).

Для строк выполняются операции сравнения (>, <, >=, <=), напрмер, ’viv’< ’viva’, и конкатенации (+): ’мото’+ ’цикл’=’мотоцикл’.

По сути, строка длины К представляет собой массив из К+1 символьных переменных, где нулевой элемент хранит значение длины строки:

String[k]=array[0..k] of char.

Для строк часто используется функция определения длины строки length (str).

Пример: Дана строка символов. Удалить из неё первый знак препинания.

Для решения данной задачи нам понадобится объявить множество знаков препинания М. Затем, последовательно проверяя каждый символ строки на принадлежность этому множеству, найдём первый знак препинания. Найдя знак, необходимо досрочно выйти из цикла проверки, например, с помощью оператора break.

Program Example1;

Var str: string;

L,i,j: integer;

M: set of char;

Begin

M:=[’.’, ’,’, ’!’, ’:’, ’;’, ’?’ , ’-’];

writeln(’Введите текст’);

Readln(str);

L:=length(str);

For i:=1 to L do

If not(str[i] in M) then write(str[i])

Else break;

For j:=i+1 to L do

write(str[j]);

Writeln;

End.

Пример: Дана строка символов. Удалить из неё все знаки препинания.

Program Example2;

Var str: string;

L,i: integer;

M: set of char;

Begin

M:=[’.’, ’,’, ’!’, ’:’, ’;’, ’?’ , ’-’];

writeln(’Введите текст’);

Readln(str);

L:=length(str);

writeln(’Преобразованный текст’);

For i:=1 to L do

If not(str[i] in M) then write(str[i])

Writeln;

End.

Пример: Дана строка символов. Заменить в ней все ’A’ на ’AAA’.

Program Example3;

Var str: string;

L,i: integer;

Begin

writeln(’Введите текст’);

Readln(str);

L:=length(str);

writeln(’Преобразованный текст’);

For i:=1 to L do

If (str[i]=’A’) then write(’AAA’) else write(str[j]);

Writeln;

End.

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

При решении данной задачи следует обратить внимание на три важные особенности.

Во-первых, основная сложность заключается в том, что слова могут быть разделены группой пробелов. Если бы слово от слова отделялось только одним пробелом, то мы могли бы посчитать количество пробелов и вычислить количество слов. В нашем случае необходимо ввести логический флаг F, по которому можно определять начало слова (F:=true) и конец слова (F:=false). При первом символе слова флаг поднимается, на первом пробеле за словом флаг опускается.

Во-вторых, по условию задачи текст вводится до точки, т.е. все слова за первой точкой игнорируются.

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

Program Example4;

Var str: string;

K,L,i: integer;

F:boolean;

Begin

writeln(’Введите текст до точки’);

Readln(str);

L:=length(str);

F:=false; i:=1; K:=0;

Repeat

If (str[i]<>’ ’) and (not F) then F:=true;

If (str[i]=’ ’) and (F) then

Begin

F:=false; K:=K+1

End;

i:=i+1

until (str[i]=’.’) or (i>L);

If str[i-1]<>’ ’) then K:=K+1;

writeln(’Количество слов K=’, K);

End.

Для решения задачи:

  • Формируем тело программы и описываем переменные;

  • Устанавливаем начальные значения переменных, флаг F опущен;

  • Цикл Repeat...until (str[i]=’.’) or (i>L) осуществляет просмотр строки до первой точки или конца строки;

  • Если найдено начало очередного слова (str[i]<>’ ’) and (not F), то поднимаем флаг;

  • Если обнаружен конец слова , то увеличиваем значение счётчика слов на единицу и сбрасываем флаг;

  • По выходе из цикла обрабатываем последнее слово в тексте. Если между концом этого и точкой не было пробелов, то значение счётчика K не учитывает это слово и K:=K+1;

  • Выводим значение счётчика K на экран.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]