§ 26. Символьные переменные и операции над ними в языке Бейсик
В этом параграфе мы расскажем о тех возможностях языка Бейсик, которые позволяют использовать ЭВМ для работы со словами. Начнем, естественно, с алфавита, из символов которого составляются слова. Этот алфавит изображен на клавиатуре ЭВМ. Для каждой ЭВМ он, вообще говоря, свой, но в нем всегда есть русские и латинские буквы, цифры, знаки препинания, пробел, а также символы операций ( + , -, *, /, ^).
Для работы со словами часто необходимо знать их длину. Для обозначения длины в языке Бейсик используется слово LEN (length - длина). Например, число
LEN (″СВЕТИТЬ - И НИКАКИХ ГВОЗДЕЙ!″)
равно 28 (проверьте!). Обратите внимание: слово, длина которого вычисляется, заключено в кавычки. Кавычки, естественно, не учитываются при вычислении длины. Для чего же тогда они нужны? Судите сами: должна же ЭВМ отличать, скажем, слово 123 от числа 123, букву I от переменной I, слово А (2, 3) от элемента А (2, 3) таблицы А. Обнаружив кавычки, ЭВМ сразу же понимает, что она имеет дело со словом. А что произойдет, если между кавычками не записать ни одного символа, т. е. чаще равно LEN (″″)? Как вы помните, слово без символов называется пустым, а его длина равна нулю. Значит, LEN (″″) = 0. Каждому ясно, что в вычислительных алгоритмах трудно обойтись без переменных, принимающих различные числовые значения. Мы советовали вам (в лабораторной работе 2) представлять переменную как ящик, в котором можно хранить число. Когда в этот ящик кладут новое число, старое бесследно исчезает. На каждом ящике - табличка, на которой написано имя переменной. Имена переменных можно использовать в записи различных алгебраических выражений. При вычислении значений этих выражений имена заменяются числами, взятыми из соответствующих ящиков.
Для работы со словами, конечно, тоже нужны переменные. Их называют символьными переменными. Это такие же ящики, только хранятся в них не числа, а слова - значения символьных переменных. В языке Бейсик символьную переменную можно обозначить, как и числовую, латинской буквой или буквой и цифрой. Только чтобы не путать имена числовых и символьных переменных, в конце имени символьной переменной ставится символ &. Вот примеры имен символьных переменных:
А¤, В¤, Z1¤.
Изменить значение символьной переменной проще всего, присвоив ей новое значение. Например, чтобы переменная А" получила значение ЗНАНИЕ - СИЛА, надо применить команду присваивания
А¤ = ″ЗНАНИЕ - СИЛА″.
Обратите внимание, что в команде присваивания слово заключается в кавычки.
С помощью команды присваивания можно также сделать копию значения символьной переменной, присвоив его другой символьной переменной:
С¤ = А¤.
После выполнения этой команды одно и то же слово будет "храниться" в двух символьных переменных - А¤ и С¤.
Конечно, возможности команды присваивания гораздо шире: с ее помощью можно не только менять значение переменной, но и производить действия со словами. Вы, разумеется, догадываетесь, о каких действиях идет речь: о соединении слов и выделении части слова.
Соединение слов в языке Бейсик обозначается знаком + (предвидя это, мы начали использовать + для соединения слов уже в предыдущем параграфе). Например, по команде
D¤ = ″СТЕРЕО″ + ″ПРИЕМНИК″
значением переменной D¤ станет слово СТЕРЕОПРИЕМНИК. Часть слова, начинающаяся с а-го символа и имеющая длину b, обозначается в языке Бейсик так:
МID¤ (..., а, b).
Здесь вместо многоточия записывается исходное слово (разумеется, в кавычках). Например, по команде
E¤ = MID¤ (″ГИППОПОТАМ″, 4,3)
переменной Е ¤ будет присвоено значение ПОП.
Комбинируя операции + и MID¤ , можно проделывать со словами очень сложные преобразования. Так, получение слова ДОЗОР из слова ЖЕЛЕЗНОДОРОЖНИК (см. задачу 5 к § 25) можно записать следующим образом:
Вы прекрасно знаете, что числовые операции используются ля работы не только с конкретными числами, но и с переменными, из которых конструируют алгебраические выражения. Операции MID ¤ и + также можно использовать для "сборки" слов из значений символьных переменных. Для этого в операциях указывают имена переменных, значения которых используются при сборке". Например, выполнение предыдущей команды присваивания можно заменить последовательным выполнением двух команд:
Итак, вы узнали, как ЭВМ перерабатывает символьные переменные. Для общения с ЭВМ этого явно недостаточно. Надо еще знать, как ЭВМ запрашивает исходные данные и сообщает результаты своей работы. Для этого предназначены знакомые вам оманды INPUT и PRINT. По команде
INPUT A¤, B¤, C¤
ЭВМ запросит три слова и обозначит их соответственно А¤, В¤ и С¤ . Вводя слова в ЭВМ, надо заключать их в кавычки и разделять запятыми. При этом ЭВМ ведет себя так же, как и при воде чисел: печатает знак вопроса и ждет до тех пор, пока в ее не будут введены три слова.
По команде
PRINT A¤
ЭВМ напечатает на экране значение переменной А¤. Кроме того, как вы помните, с помощью команды PRINT можно напечатать слово (сообщение), заключив его в кавычки (см. § 20). Теперь, когда вы знаете основные команды обработки слов, можно приступить к решению задач. Есть два типа задач, наиболее часто возникающих при работе с текстами:
а) подсчитать, сколько раз данное слово встречается в тексте;
б) заменить в тексте одно слово другим.
Такие задачи возникают, скажем, при шифровке и дешифровке сообщений (этим мы с вами займемся в следующем параграфе).
Разберем по одной задаче каждого типа.
Задача 1. Определить, сколько раз в данном слове встречается буква А.
Дорога
Обозначим исходное слово через W¤, а результат (количество букв А в W¤) через S. Как найти S - понять несложно.
Сначала ЭВМ должна запросить слово W¤ и присвоить S начальное значение 0. Затем, просматривая слово W¤ слева направо, нужно добавлять к S единицу всякий раз, когда встретится буква А. По окончании просмотра ЭВМ должна сообщить найденное значение S.
На следующей странице приведена блок-схема алгоритма решения этой задачи (рис. 42).
Рис. 42. Блок-схема алгоритма решения
Как видите, нам потребовались циклы и развилки. В них проверяются некие условия. В качестве условий в языке Бейсик допускаются соотношения не только между числами, но и между словами. А в числовых выражениях можно использовать функцию LEN. Приведем программу решения нашей задачи:
10 INPUT W¤
20 S = 0
30 FOR I = 1 TO LEN(W¤)
40 IF МID¤ (W¤, I, 1) = "А" THEN S = S + 1
50 NEXT I
60 PRINT "В СЛОВЕ " W¤
70 PRINT S "БУКВ А"
Задача 2. В данном слове заменить всюду букву А на букву Я.
Замена на букву Я
Хотя задача 2 на первый взгляд отличается от задачи 1, алгоритмы их решения очень похожи.
Такая ситуация - не редкость. Информатика, как и любая наука, позволяет обнаруживать общее в решении, казалось бы, совершенно различных задач. Вы неоднократно встречались с этим в предыдущих главах (сравните, к примеру, алгоритмы нахождения самого влажного месяца и определения оптимального плана для участка завода в § 18 и 19).
Как и в предыдущей задаче, обозначим исходное слово через W¤. ЭВМ, конечно, сначала должна запросить его. Затем, просматривая W¤ слева направо, она должна каждый раз, встретив букву А, заменить ее буквой Я.
Единственная трудность - с помощью операций + и МID¤ осуществить замену в слове W¤ одной буквы на другую. Пусть буква А в слове W¤ стоит на i-м месте и ее надо заменить на букву Я. Слово W¤ разобьем на три куска: первый кусок - часть слова W¤ от начала до буквы А (его длина i - 1), второй кусок - сама буква А, третий кусок - все остальное (его длина равна LEN (W¤) - i). Замена коснется только второго куска, а первый и третий куски останутся нетронутыми. Поэтому результат такой замены можно записать так:
MID¤ (W¤, 1, I - 1) + "Я" + МID¤ (W¤, I + l, LEN (W¤) - I).
Приведем программу решения задачи 2.
10 INPUT W¤
20 FOR I=1 TO LEN(W¤)
30 IF MID¤ (W¤, I, 1) = "A" THEN W¤ = MID¤ (W¤,I-1) + "Я" + MID¤ (W¤, I+1, LEN (W¤) - I)
40 NEXT I
50 PRINT "ВОТ НОВОЕ СЛОВО: " W¤
Вопросы
1. Как обозначается в языке Бейсик:
а) длина слова;
б) символьная переменная;
в) часть слова;
г) соединение слов?
2. Что такое символьная переменная?
3. Какие преобразования слов позволяет осуществлять команда присваивания?
4. С помощью каких команд языка Бейсик ЭВМ запрашивает и сообщает значения символьных переменных?
5. Проверку каких соотношений между словами позволяет осуществлять язык Бейсик?
Задания для самостоятельного выполнения
1. По какой команде языка Бейсик к значению переменной А¤ будет дописано справа значение переменной В¤?
2. Чему будут равны переменные А¤ И B¤ после выполнения следующих программ?
б) имеется ли в данном слове часть, равная заданному слову;
в) сколько раз встречается в данном слове часть, равная заданному слову.
4. Составьте программу для замены в данном слове всюду:
а) одной буквы на другую букву (ЭВМ должна запросить обе буквы);
б) части ДОМ на часть РОД;
в) части ДЕТЕКТИВ на часть РОМАН. Например, текст
ДЕТЕКТИВ БЕЗ ПОГОНИ - ЭТО НЕ ДЕТЕКТИВ
должен стать таким:
РОМАН БЕЗ ПОГОНИ - ЭТО НЕ РОМАН,
а из текста
НЕ МОГУ ЗАСНУТЬ БЕЗ ДЕТЕКТИВА
должен получиться текст
НЕ МОГУ ЗАСНУТЬ БЕЗ РОМАНА;
г*) части РОМАН на часть ДЕТЕКТИВ;
д*) части, равной одному слову, на часть, равную другому слову (ЭВМ должна запросить оба слова).
Почему в задачах 3, г и 3, д нельзя воспользоваться циклом "Для каждого" от 1 до LEN(A¤)?
5. Составьте программу, вычеркивающую все пробелы из данного слова.
6*. Даны два слова. Составьте программу, позволяющую определить, можно ли из букв, входящих в первое слово, составить второе слово. Буквы можно переставлять, но нельзя использовать букву большее число раз, чем она встречается в первом слове. Например, из слова ИНФОРМАТИКА можно составить слово РАКИТА и нельзя составить слово МОТОР.
7. В задаче 7 к предыдущему параграфу вы познакомились с алфавитом племени Мумбо-Юмбо.
а) Составьте программу, которая позволит определить, какое из двух слов мумбо-юмбовского языка больше.
б) Составьте программу упорядочения трех слов мумбо-юмбовского языка. (Указание: воспользуйтесь программой, составленной при решении задачи а, как подпрограммой.)
8. Составьте программу для определения стоимости телеграммы по ее тексту (напомним, что стоимость одного слова в телеграмме - 5 копеек и, кроме того, за каждую телеграмму взимается комиссионный сбор - 10 копеек).
9. Составьте программу для определения:
а) является данная буква гласной, согласной или одной из букв й, ъ, ь;
б) обозначает ли данная согласная буква звонкий звук или глухой. (Указание: используйте символьные переменные А¤ - "аяоеэиыую", Z¤ - "бвгджзлмнр", G¤ - "кпстфхцчшщ", W¤ - "йъь".)
10. Составьте программу для проверки правописания приставок из- и ис- в словах русского языка. (Указание: используйте решение предыдущей задачи.)
11*. Составьте математическую модель и программу решения следующей задачи.
Задача. Школьник и злоумышленник написали сочинения на одну и ту же тему. Определить, списывал ли злоумышленник у школьника. (Указание: используйте методы, описанные в §24.)