Перестановка элементов текста осуществляется путем формирования новой переменной на основе исходной. Можно переставлять не только отдельные слова, но и логические группы, блоки.
Алгоритмы перестановки текста состоят из двух основных этапов:
выделение элементов
формирование новой строки в соответствии с условиями. Например, для того чтобы поменять местами самое длинное и самое короткое слова, нужно сначала их найти, а затем в ходе формирования новою текста вместо первого записать второе, а вместо второго первое. Последовательность всех остальных знаков при этом не изменится.
Пример 27. Поменять местами самое длинное и самое короткое слова в A$.
CLS
a$ = "Белеет парус одинокий" PRINT a$ min = LEN(a$) 10: FOR i = 1 TO LEN(a$) ' выделяем i-й знак и проверяем буква ли это 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$: tmp$ = "" 'Теперь можно проводить анализ очередного слова Т$ ' max
IF LEN(T$) > max THEN max = LEN(T$): wmax$ = T$ 'min IF LEN(T$) < min THEN min = LEN(T$): wmin$ = T$
' Блок замены и прибавление слова rez$
IF switsch = 1 THEN
IF T$ = long$ AND c <> i THEN T$ = short$: c = i
IF T$ = short$ AND c <> i THEN T$ = long$: c = i
rez$ = rez$ + T$
END IF ' закрываем switsch
T$ = "" ' обнуляем T$
END IF ' закрываем Len(T$)>0 or....
IF switsch = 1 THEN
rez$ = rez$ + tmp$ ' прибавляем не букву
END IF ' закрываем switsch
END IF ' закрываем islitter
NEXT i
' возвращаемся в начало программы после 1-го прохода
IF short$ = "" THEN
switsch = 1: short$ = wmin$
long$ = wmax$: GOTO 10
ELSE
PRINT rez$ ' вывод результата
END IF
END
Белеет парус одинокий
Белеет одинокий парус
Работа программы. Алгоритм работает в два прохода, В первом проходе определяет самое длинное (wmax$) и самое короткое (wmin$) слово. Затем управление оператором GOTO передается в начало программы и осуществляется второй проход да является формирование новой переменной rez$, в которой накапливается результат, — строка с переставленными максимальным и минимальным словами.
На основе подобных алгоритмов решаются задачи перестановки или вставки блоков, а также некоторых видов сортировки элементов строки.
Сортировка массива слов Сортировка — один из самых сложных видов обработки текстовых переменных, а необходимость перестановки элементов в рамках одной строки усложняет задачу еще и тем, что требует сохранения последовательности знаков, не участвующих в перемещении. К таким элементам относятся числа, знаки пунктуации, пробелы.
Пример 28. Переставить слова в А$ согласно алфавиту. Количество и порядок следования других знаков остается неизменным.
CLS
A$ = "август - астры,,,,, - звезды - грозди винограда -- рябины??????"
PRINT A$
DIM word$(LEN(A$))
FOR i = 1 TO LEN(A$)
' выделяем i-й знак и проверяем буква ли это
…
' Если это буква, то формируем слово
…
' Теперь можно проводить анализ очередного слова Т$
k = k + 1
word$(k) = T$ ' формируем массив слов
T$ = "" ' обнуляем T$
END IF END IF NEXT i
' сортировка массива word$ по росту ASCII-кодов
FOR i = 1 TO k
FOR j = 1 TO k
f = 1
10: IF ASC(MID$(word$(i), f, 1)) < ASC(MID$(word$(j), f, 1)) THEN
SWAP word$(i), word$(j) ELSE
IF ASC(MID$(word$(i), f, 1)) = ASC(MID$(word$(j), f, 1)) THEN
f = f + 1
IF MID$(word$(i), f, 1) <> "" AND MID$(word$(j), f, 1) <> "" THEN GOTO 10 END IF
END IF
END IF
NEXT j
NEXT i PRINT
PRINT "Сортировка массива слов"
FOR i = 1 TO k
PRINT " "; word$(i);
NEXT i
END
Результат: август - астры,,,,, - звезды - грозди винограда -- рябины?????? Сортировка массива слов август астры винограда грозди звезды рябины
Работа программы. Программа анализирует исходную строку А$. Формирует массив word$ только слов. Переставляет слова в массиве в порядке возрастания ASCII-кодов букв.
Контрольные вопросы
1. Какие переменные называют символьными?
2. Где используются переменные текстового типа?
3. Что могут содержать текстовые переменные?
4. В чем состоит формат ASCII?
5. Какие типы строковых переменных Вы знаете?
6. Какими способами может быть осуществлении присвоение значения текстовой переменной?
7. Какой знак используется для сложения текстовых переменных?
8. С помощью, каких знаков производится сравнение текстовых переменных?
9. В каком случае текстовые переменные считаются равными?
10. Какой принцип используется при сортировке переменных?
11. Перечислите функции работы с символьными переменными?
12. Что выполняет оператор MID$?
13. Что выполняет функция LEN?
14. Что выполняют функции LEFT$ и RIGHT$?
15. Что выполняет функция INSTR$?
16. Для чего предназначается функция MID$?
17. Что называют логической группой?
18. В чем заключается анализ символа?
19. На чем основаны алгоритмы выделения слов?
20. Как осуществляется перестановка элементов текста?
Варианты заданий для самостоятельного решения
1. Введите строку А$ и определить, сколько в ней 1) букв русского алфавита; 2) заглавных латинских букв; 3) цифр.
2. Введите строки А$ и В$. Определите, сколько раз В$ входит в A$.
3. Введите строки А$ и В$. Удалите из А$ все вхождения В$.
4. Упорядочить по алфавиту вектор A$(10), состоящий из десяти любых.
1). латинских букв; 2). русских букв; 3). цифр.
5. Упорядочьте в обратном алфавитном порядке вектор A$(10). Каждый элемент анализировать по всем знакам.
6. Введите переменную А$. Замените вес сочетания С$ на B$.
7. Введите текст А$. Считая словом непрерывную последовательность букв, выделите все слова A$ в отдельный массив.
8. Введите текст А$. Удалите все слова, которые встречаются больше двух раз, оставив только первое вхождение каждого такого слова.
9. Введите название переменной как текстовую строку. Проверьте, соответствует ли ее название требованиям QBasic.
10. Дана строка, содержащая английский текст. Найти количество слов, начинающихся с буквы В.
11..Дана строка. Подсчитать, сколько в ней букв g, k, t.
12. Дана строка, содержащая текст. Найти длину самого короткою слова и самого длинного слова.
13. Дана строка, содержащая текст, закапчивающийся точкой. Вывести на экран слова, содержащие три буквы.
14. Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а.
15. Дана строка. Указать тс слова, которые содержат хотя бы одну букву к.
16. В строке между словами вставить вместо пробела запятую и пробел.
17. Определить, сколько раз в строке встречается заданное слово.
18. Дана строка. Преобразовать ее, заменив точками все двоеточия (:),
19. Строка содержит произвольный русский текст. Проверить, каких букв в нем больше: гласных или согласных.
20. Результаты вступительных экзаменов представлены в виде списка из N строк, в каждой строке которого записаны фамилия студента и отметки по каждому из М экзаменов. Определить количество абитуриентов, сдавших вступительные экзамены только на «отлично».
21. Для заданного текста определить длину содержащейся в нем максимальной серии символов, отличных от букв.
22. Отредактировать заданное предложение, удаляя из него все слова с нечетными номерами.
ЛАБОРАТОРНАЯ РАБОТА № 6
Оптимизация технологического процесса.