Содержание
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Цель работы
Освоить работу со строковыми данными в среде VBA.
Варианты заданий
№ | Условие задачи |
1 | Подсчитать, сколько в строке слов, содержащих буквосочетание «мн». |
2 | Подсчитать, сколько в строке слов нечетной длины. |
3 | В заданной строке найти слова четной длины и вывести их на экран в столбик. |
4 | В заданной строке символов, среди которых есть одно двоеточие, поменять местами группы символов, стоящие до двоеточия и после него. |
5 | С клавиатуры вводится строка, содержащая слово «дым» несколько раз. Заменить это слово словом «лед». |
6 | В заданной строке исключить группы символов, расположенные между скобками […]. Сами скобки тоже должны быть исключены. Предполагается, что в строке может быть несколько пар скобок, но внутри каждой пары нет других скобок. |
7 | В заданной строке определить, сколько раз в ней встречается сочетание букв «аб», удалить данное сочетание из строки. |
8 | В заданной строке найти те слова, которые начинаются и оканчиваются одной и той же буквой и вывести их в столбик. |
9 | В заданной строке найти те слова, которые начинаются с букв «т» или «п» и вывести их в столбик. |
10 | В заданной строке найти те слова, которые содержат хотя бы одну букву «м» и вывести их в столбик. |
Лабораторная работа №6 предполагает написание программы/макроса на VBA in Excel. При заказе работы своего варианта вы получите качественно написанную и хорошо прокомментированную программу.
Если дополнительно закажите алгоритм решения вашей задачи (мы крайне рекомендуем это сделать), то получите аккуратно оформленный отчет-алгоритм, поясняющий все тонкости решения поставленной задачи.
Образец выполнения (вариант №2)
Условие задания
Подсчитать, сколько в строке слов нечетной длины. |
Алгоритм решения задачи
Начнем с этапа алгоритмизации. Чтобы успешно закодировать любую задачу, надо в самую первую очередь определиться с алгоритмом решения.
💡 Опытный реализатор студенческих работ, прочитав постановку задания, скажет, что формулировка явно неполная. Да, это так!
И вот, почему:
- Неизвестен алфавит, из которого строятся слова исходной строки. Другими словами, что следует понимать под «словом». Мы под «словом» будем понимать любой фрагмент строки, обрамленной пробелами.
- Допустима ли к обработке пустая строка? Мы реализуем так, что алгоритм будет корректно обрабатывать в том числе и пустые входные строки.
- Может ли больше одного пробела разделять слова в строке? Да, мы реализуем так, что алгоритм будет корректно обрабатывать любое количество пробелов-разделителей слов.
- Может ли строка начинаться с пробела и заканчиваться пробелом? Да, мы реализуем так, что алгоритм будет корректно обрабатывать и такие случаи.
Как известно из теории школьной математики ($3$ класс):
Целое число называется нечетным, если при делении на $2$ в остатке образуется $1$. Например, это числа: $5$, $17$, $2001$ и т.д.
Допустим, что на вход программе подается следующая строка
s = «Я учусь создавать макросы на VBA».
Все дальнейшие рассуждения будут привязаны к данной строке.
➡ Важнейший момент алгоритма! Нужно заметить, что во входной строке имеется чередование: слово — пробел — слово — пробел — слово и т.д. Не заметив этой особенности, можно очень долго и неэффективно решать поставленную задачу 🙂
Данное чередование (слово — пробел) позволяет нам достаточно быстро и емко закодировать макрос, используя цикл. Достаточно лишь научиться обрабатывать одно слово, а остальные слова будет обрабатываться аналогично.
Детально рассмотрим обработку первого слова входной строки.
С точки зрения VBA in Excel строка имеет следующую структуру:
Далее, находим самые левый (он является и самым первым пробелом, если двигаться по строке слева направо) пробел, а точнее его индекс.
После этого, нам необходимо вычленить первое слово. Как определить его границы? Поскольку оно самое левое слово в текущей строке, то это слово начинается от начала строки и заканчивается найденным ранее пробелом.
➡ После вычленения слова необходимо получить его длину и проверить ее на нечетность. Если количество букв в полученном слове нечетно, то увеличиваем счетчик, отвечающий за результат на $1$.
После обработки текущего слова, нужно переходить на обработку дальнейших слов. Но для начала нужно избавиться от уже обработанного слово, чтобы оно не мешало процессу. Следовательно, на данном этапе, нам требуется удалить из входной строки уже обработанное слово, включая ведомый пробел.
После удаления только что обработанного слова, входная строка принимает вид:
➡ Дальнейшие вычленения слов из входной строки работают по принципу, описанному выше, поэтому весь процесс можно закодировать в цикле!
💡 Единственный момент, который нужно учесть — проверка самого последнего слова в строке. Почему здесь возникает нюанс? Потому что за последним словом пробела может не быть и алгоритм просто не учтет его при обработке. Следовательно, придется после окончания цикла отдельно проверить на нечетность самое последнее слово.
Решение задачи с использованием макроса на VBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ' процедура, благодаря которой ищем во входной строке количество слов нечетной длины Sub Calculate() Dim s As String ' входная строка, вводимая пользователем с клавиатуры Dim k As Byte ' хранит длину первоначальной строки Dim kword As Byte ' хранит кол-во слов нечетной длины Dim p As Integer ' вхождение самого левого пробела в строке Dim token As String ' хранит текущее слово входной строки ' запрашиваем входную строку вводом с клавиатуры s = InputBox("Введите строку, состоящую из слов, разделенную строго одним пробелом") Worksheets("ЛР6").Cells(4, 7) = s k = Len(s) ' определяем длину строки (сколько в ней знаков/символов) kword = 0 ' так как обработка входной строки еще не начиналась, то кол-во искомых слов равно 0 p = InStr(s, " ") ' находим самый левый пробел ' пока во входной строке остались слова для обработки While (p <> 0) token = Mid(s, 1, p - 1) ' получаем самое левое слово в строке (с начала строки до 1го левого пробела) ' проверяем вырезанное слово на нечетность длины If (Len(token) Mod 2 <> 0) Then kword = kword + 1 s = Mid(s, p + 1, k) ' удаляем из входной строки самое левое слово вместе с пробелом, т к оно уже обработано p = InStr(s, " ") ' продолжаем искать самый левый пробел Wend ' отдельно проверяем последнее слово на нечетность длины ' такая проверка необходима, так как после последнего слова может не быть пробела и в цикле оно не найдется If (Len(s) Mod 2 <> 0) Then kword = kword + 1 Worksheets("ЛР6").Cells(6, 7) = kword ' выводим кол-во слов нечетной длины в нужную ячейку листа Excel End Sub |
Результаты работы программы
№ | Описание теста | |
1 | Вводим с клавиатуры строку, рассмотренную в алгоритме выше. Все слова разделяются строго одним пробелом. Перед первым и после последнего слова нет ни одного пробела. | |
2 | Вводим с клавиатуры строку, состоящую только из слов четной длины. Также перед первым словом введем цепочку пробелов. | |
3 | Вводим с клавиатуры произвольную строку, слова в которой могут разделять произвольное количество пробелов. | |
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Добавить комментарий