Особого внимания заслуживают задачи, в которых переменную необходимо изменять несколько раз в зависимости от условия.
Эти алгоритмы предполагают использование цикла и операторов логической передачи управления, хотя принцип действия остается неизменным — формирование новой переменной путем сложения частей
Пример 21. В тексте A$ после каждого пробела вставить B$.
a$= "Белеет парус одинокий"
PRINT a$
B$ = "11"
x = LEN(a$)
FOR i = 1 TO x
IF ASC(MID$(a$, i, 1)) = 32 THEN
a$ = MID$(a$, 1, i) + B$ + MID$(a$, i + 1, x)
END IF
NEXT i
PRINT a$
Результат. Белеет 11парус 11одинокий
Работа программы. В цикле анализируется АSСП-код очередного выделенного символа на равенство 32 (код пробела). Если равенство выполняется в ходе 1-й итерации цикла, то переменной А$ присваивается сумма трех компонентов — левая часть исходной А$ (знаки с номерами от 1 до 1) + В$ + правая часть AS (знаки от 1 до х).
Удаление символов
Удалениесимволов проходит путем записи в новую текстовую переменную знаков исходной строки, расположенных до удаляемой части и после нее.
Пример 22. Удалить пятый символ из A$.
a$ = "123456789"
n = 5
x = LEN(a$)
a$ = MID$(a$, 1, n - 1) + MID$(a$, n + 1, x)
PRINT a$
Результат: 12346789
Работа программы. Первое значение A$ образуется путем сложения знаков 1-4 (1, N - 1) и 6-9 (N+1, x) исходной строки. Если удаляется не один знак, а целый блок знаков BS, то во втором MID$ номер первого элемента правой части запишется N + LEN(B$) и команда в целом будет иметь вид
MID$(A$, N+LEN(B$)
Рассмотрим алгоритм многократного удаления знака по условию.
Такие задачи решаются с помощью цикла.
Пример 23. Удалить все запятые в строке А$.
a$ = ",,,1,2,3,4,5,,,,"
PRINT a$ x = LEN(a$)
FOR i = 1 TO x
IF MID$(a$, i, 1) = "," THEN
a$ = MID$(a$, 1, i - 1) + MID$(a$, i + 1, x)
i = i – 1 'Уменьшаем счетчик i
END IF
NEXT i
PRINT a$
Результат: ,,,1,2,3,4,5,,,, 12345 Работа программы. В значение A$ специально введено несколько блоков идущих друг за другом запятых. Это сделано для того, чтобы продемонстрировать частный случай задач на удаление. Если удаляются знаки, стоящие последовательно по одному, то необходимо уменьшать счетчик цикла па количество удаляемых знаков.
Выделение отдельного слова из текста
Текст состоит из отдельных слов. Слово – это последовательность букв, заключенных между двумя символами, не являющимися буквами.
Алгоритмы выделения слов, как правило, основаны на поиске знаков – разделителей. Ими могут быть пробелы, знаки пунктуации, специальные символы.
Пример 25. Определить количество слов в тексте.
a$ = " Отговорила роща золотая Березовым, веселым языком "
' выделяем i-й знак и проверяем буква ли это
FOR i = 1 TO LEN(a$)
tmp$ = MID$(a$, i, 1): isletter = 0
IF 128 <= ASC(tmp$) AND ASC(tmp$) <= 175 THEN isletter = 1
IF 224 <= ASC(tmp$) AND ASC(tmp$) <= 239 THEN isletter = 1
IF 65 <= ASC(tmp$) AND ASC(tmp$) <= 90 THEN isletter = 1
IF 97 <= ASC(tmp$) AND ASC(tmp$) <= 122 THEN isletter = 1
' Если это буква, то формируем слово
' Иначе переходим к формированию след слова
IF isletter = 1 AND i < LEN(a$) THEN
T$ = T$ + tmp$
ELSE
IF LEN(T$) > 0 OR isletter = 1 THEN
IF i = LEN(a$) AND isletter = 1 THEN
T$ = T$ + tmp$ ' Теперь можно проводить анализ очередного слова Т$ PRINT T$ L = L + 1
T$ = "" ' Обнулять Т$ обязательно
END IF
END IF
NEXT i
PRINT " Всего слов "; L
Результат: Отговорила роща золотая Березовым веселым языком Всего слов 6
Работа программы. Приведенный алгоритм выполняет следующие операции: выделяет очередной символ; если это буква, то начинает накапливать очередное слово; если это не буква — переходит к анализу полученного слова и формированию следующего.
Четыре оператора IF в начале цикла предназначены для определения принадлежности выделенного знака к буквам русского или английского алфавита. Действие операторов основано на анализе ASCII-кода каждого знака. Если знак является буквой, то переменной isletter присваивается значение 1, в
противном случае — 0.
Пример 26. Сформировать массив слов Word$, входящих в текст A$. Определить слова с максимальным и минимальным количеством букв.
CLS 'Очистка экрана
DIM word$(LEN(a$))
a$ = "Еще светло перед окном, В разрывы облак солнце блещет"
min = LEN(a$)
FOR i = 1 TO LEN(a$)
' выделяем i-й знак и проверяем буква ли это
…
' Если это буква, то формируем слово
…
'Теперь можно проводить анализ очередного слова Т$
K = K + 1: word$(K) = T$ 'формируем массив слов
' находим слово с max кол-вом букв
IF LEN(T$) > max THEN max = LEN(T$): wmax$ = T$
' находим слово с min кол-вом букв
IF LEN(T$) < min THEN min = LEN(T$): wmin$ = T$
T$ = "" ' Обнуляем Т$
END IF
END IF
NEXT i
PRINT "Слово с кол букв max "; wmax$
PRINT " Слово с кол букв min "; wmin$
PRINT "Массив слов"
FOR i = 1 TO K
PRINT word$(i)
NEXT i
END
Результат
Слово с кол букв max разрывы
Слово с кол букв min В
Массив слов
Еще
светло
перед
окном,
В
разрывы
облак
солнце
блещет
Работа программы. Алгоритм выделения слова из предыдущего примера приведен сокращенно. В первой сроке программы происходит объявление массива Word$. Рассчитывать, сколько нем будет слов не рационально. Для этого пришлось бы анализировать исходную строку и, получив количество слов, и объявить массив, а для его заполнения выполнить алгоритм заново. Поэтому предполагаем, что в массиве Word$ Len(a$) элементов.