Урок 13.
Сравнение символьных величин.
Решение задач на поиск, подсчет и удаление символов.
Задание.
Даны три слова: “вычислитель”, “исполнитель”,
“алгоритм”. Упорядочите эти слова.
Решая данную задачу, вы столкнулись с необходимостью
сравнить эти три слова, какое-то из них сделать “большим”, какое-то “меньшим”.
А можно ли вообще сравнивать символьные величины, имеющие далеко не близкие
значения, например “лошадь” и “Бейсик”? Да, можно. Сравнение символьных
величин основано на том, что каждый символ имеет свой ASCII-код
и при сравнении символьных величин сравниваются коды составляющих их символов.
Имеются следующие операторы сравнения: <,
<=, =, <>, >=, >.
Кодировка у каждого типа машин своя. Поэтому
"a"<"z". Буквы русского алфавита закодированы
таким образом, что сначала следуют в алфавитном порядке строчные,
а затем в алфавитном же порядке прописные.
Символьные величины сравниваются посимвольно,
начиная с первого символа. Если первые символы обеих величин совпадают,
то сравниваются вторые и т. д. Сравнение ведется до первой пары
символов, не удовлетворяющих условию.
"банан" > "ананас"
"банан" < "Ананас"
"булка" > "бублик".
Большинство версий Бейсика учитывают пробелы,
имеющиеся справа и слева от букв:
"мгпи" <>" мгпи"
"мгпи" <> "мгпи "
Если длины сравниваемых величин не совпадают,
то меньшее дополняется пробелом (пробел является самым младшим символом).
Задание.
Используя таблицу ASCII-кодов, сравните следующие
величины:
А$ =".;d", B$ = ".*Zh" C$ = ")Wiqt".
Решение.
Запишем коды данных величин:
А$ соответствует последовательности кодов—46,
59, 100, 32, 32 (добавили два пробела, чтобы сравниваемые величины имели
одинаковую длину);
В$ — 46, 42, 90, 104, 32 (добавили один пробел);
С$—41,87, 105, 113, 116.
Получаем, что С$<В$<А$.
Примечание.
Более подробно работа с кодами символов будет
продолжена на следующем уроке.
Используя операции сравнения и известные функции
обработки строк, можно решать задачи различного типа, например задачи
на подсчет и поиск, задачи на удаление (вставку).
В условиях задач типа “подсчет, поиск” присутствуют
слова “найти...”, “подсчитать...”, при этом указывается условие, которому
должны удовлетворять подсчитываемые символы (или группы символов).
Во многих задачах этого типа речь идет о выделении
слова. Слово — это последовательность букв, заключенная между символами,
левый из которых пробел, а правый — любой знак
препинания или пробел. Одно слово от другого отделяется определенным
символом (пробел, запятая и т. д.).
Алгоритм решения задач типа “подсчет и поиск”:
- ввести текст, определить его длину;
- “вырезать” из текста группу символов и проверить, удовлетворяет ли
она условию задачи;
- если требуется только найти группу символов, удовлетворяющих заданному
условию, то выдать сообщение, что символы найдены, или что групп символов,
удовлетворяющих такому условию, нет;
- если требуется подсчитать количество групп символов, удовлетворяющих
заданному условию, то изменить значение счетчика;
- если конец текста достигнут, то завершить работу программы.
Задача 1.
Введите текст и определите номер позиции первой
точки, заканчивающей предложение (предполагается, что хотя бы одно из
предложений заканчивается точкой).
Решение.
Используемые величины:
А$ — вводимый текст;
В$ — символ, вырезаемый из текста (текущий и стоящий справа);
Е$ — символ, вырезаемый из текста (текущий и стоящий слева);
N — длина текста;
I — номер пары символов в тексте;
В — номер первой точки.
Текст просматривается начиная со второго символа.
Поскольку возможны два случая употребления точки
— точкой оканчивается предложение и точка употребляется в многоточии,
то проверяются, во-первых, текущий и стоящий справа символы, если они
равны ". ", то это точка в конце предложения; во-вторых,
текущий и находящийся слева от точки, их комбинация не должна быть "..".
Если оба условия выполняются, то, значит, первая точка найдена (В=1) и
просмотр текста заканчивается.
INPUT A$
N = LEN(A$)
FOR I = 2 ТО N - 1
В$ = MID$ (A$ , I , 2)
Е$ = MID$ (A$ , I-1 , 2)
IF B$ = ". " AND E$ < > ".."
THEN В = I: I = N
NEXT I
PRINT В
END
Вопрос.
Как преобразовать строку I = N, чтобы закончить
выполнение программы?
В задачах на удаление и вставку происходит “сжатие”
или “расширение” группы символов. В условиях задач этого типа присутствуют
слова “вставить”, “заменить”, “удалить”, а также указывается, какие символы
вставить или удалить, в соответствии с каким условием заменить одни символы
на другие.
Алгоритм решения задач на удаление и вставку:
- ввести текст, определить его длину;
- найти нужный символ или номер его позиции;
- выполнить указанное в задаче действие;
- если конец текста не достигнут, то перейти к нахождению следующей
нужной позиции, иначе — вывести результат и завершить работу.
Чтобы “сжать” исходный текст Т$, удалив из него цепочку символов от (
I+1 )-го до ( I+N )-гo, нужно “переслать” посимвольно текст Т$ в новую
символьную переменную G$ от начала до I-го символа и от ( I+N+1)-гo символа
до конца, используя операцию конкатенации
G$ = MID$ (T$ , 1 , I ) + MID$ (T$, I + N + 1, M),
где М —длина исходного текста.
Чтобы “раздвинуть” текст Т$, вставив последовательность символов V$ между
1-м и ( I+1 )-м символами исходного текста, нужно текст Т$ переслать посимвольно
от начала до I-го символа и от ( I+1 )-го символа до конца в новую символьную
переменную G$, вставив между ними требуемую цепочку символов V$, используя
операцию конкатенации
G$ = MID$(T$ , 1 , I ) + V$ + MID$( T$ , I+1, M)
Задача 2.
Из заданного текста удалите его часть, заключенную в скобки (вместе со
скобками). Учтите, что таких частей в тексте может быть несколько. Предполагается,
что в удаляемом тексте внутренних скобок нет.
Решение.
Используемые величины:
А$ — вводимый текст;
В$ — вырезаемый символ;
С$ — выводимый текст;
N — длина текста;
S — количество символов в скобках, включая скобки;
I — номер вырезаемого символа в тексте;
J — номер символа в скобках;
D$ — вырезаемый из скобок символ.
Для решения задачи необходимо найти позицию символа “(”. Часть исходного
текста до “(” переслать в переменную С$. Далее исходный текст просмотреть
с позиции, следующей за позицией первого символа “)”. Если в оставшейся
части будет обнаружен символ “(”, переслать в С$ часть исходного текста
между символами “)” и “(” и т. д.
NPUT A$
N = LEN(A$)
С$ = ""
FOR I = 1 ТО N
В$ = MID$(A$, I, 1)
IF B$ = "("
THEN GOTO 7 ELSE GOTO 14
7 S = 0
FOR J = I + 1 ТО N
S
= S + 1
D$
= MID$(A$, J, 1)
IF D$ = ")" THEN I = I + S ELSE GOTO 13
GOTO 15
13 NEXT J
14 С$ =С$ + В$
15 NEXT I
PRINT C$
END
Вопрос.
Как поступить в случае, если скобка открывается,
но не закрывается?
Задания для самостоятельного выполнения
Задача 1.
Подсчитайте количество слов в тексте, заканчивающихся
на букву “я”.
Подсказка.
Задача сводится к подсчету количества комбинаций символов “я ”, “я, ”,
“я:”, “я.”, “я?”, “я!”.
Задача 2.
Каждые пять символов во введенном тексте отделите знаком “*”.
|