- •7. Одномерные массивы 114
- •8. Обработка двумерных массивов (матриц) 162
- •9. Обработка строк 183
- •10. Тип данных, определенный пользователем. Структуры 214
- •11. Использование подпрограмм 228
- •Приложение 52 310 Список литературы 313 Введение
- •1. Этапы создания Windows-приложения
- •2. Среда Visual Basic 2005
- •2.1. Структура среды Visual Basic 2005
- •2.2. Создание нового проекта
- •2.3. Сохранение проекта
- •2.4. Выполнение приложения
- •2.5. Основные команды среды Visual Basic 2005
- •2.6. Методы тестирования
- •2.7. Отладка приложений в среде vb
- •3. Разработка интерфейса в среде vb. Основные элементы управления
- •3.1. Метка
- •3.2. Текстовое поле
- •3.3. Кнопка
- •3.4. Окно списка
- •3.5. Выравнивание положения элементов управления
- •4. Программа линейной структуры
- •4.1. Понятие переменной
- •4.2. Типы данных
- •4.3. Объявление переменных
- •4.4. Оператор присваивания
- •Оператор присваивания работает справа налево.
- •4.5. Константы
- •4.6. Арифметические операции
- •4.7. Математические функции
- •4.8. Арифметическое выражение
- •4.9. Окно ввода (InputBox)
- •4.10. Окно вывода сообщения (MsgBox)
- •4.11. Пример. Вычисление площади треугольника
- •4.12. Пример. Нахождение цифр числа
- •5. Организация ветвлений
- •5.1. Логические константы и переменные
- •5.2. Операции сравнения
- •5.3. Логические операции
- •5.4. Логическое выражение
- •5.5. Условный оператор
- •5.6. Функция iIf
- •5.7. Оператор множественного ветвления ElseIf
- •5.8. Оператор выбора Select Case
- •5.9. Оператор безусловного перехода GoTo
- •5.10. Пример. Решение линейного уравнения
- •5.11. Пример. Программа-калькулятор
- •6. Программирование повторений
- •6.1. Цикл со счетчиком
- •6.1.1. Табуляция функции
- •6.1.2. Вычисление факториала
- •6.1.3. Обработка совокупности чисел с известным числом элементов
- •6.2. Цикл с условием
- •6.2.1. Ввод с проверкой
- •6.2.2. Обработка совокупности чисел с неизвестным числом элементов
- •6.2.3. Вычисление суммы ряда по общей формуле
- •Вычисление суммы ряда с использованием рекуррентного соотношения
- •6.2.5. Вычисление произведения ряда
- •Решение нелинейных уравнений методом простой итерации
- •7. Одномерные массивы
- •Массивы всегда обрабатываются в цикле.
- •7.1. Ввод массива
- •Вывод массива в окно списка и в текстовое поле
- •7.3. Вычисление суммы и произведения элементов массива
- •7.4. Определение количества элементов массива, удовлетворяющих некоторому условию
- •7.5. Вычисление среднего арифметического и среднего геометрического элементов массива, удовлетворяющих некоторому условию
- •7.6. Нахождение максимального элемента массива
- •7.7. Нахождение минимального элемента массива, удовлетворяющего некоторому условию
- •7.8. Поиск первого элемента массива, удовлетворяющего некоторому условию
- •7.9. Поиск последнего элемента массива, удовлетворяющего некоторому условию
- •7.10. Замена одного элемента массива
- •7.11. Замена всех элементов массива, удовлетворяющих некоторому условию
- •7.12. Перестановка местами двух элементов массива
- •7.13. Формирование нового массива из некоторых элементов исходного массива
- •7.14. Проверка совпадения всех элементов массива
- •7.15. Проверка упорядоченности всех элементов массива
- •7.16. Сортировка массива методом пузырька
- •7.17. Линейная сортировка массива (методом поиска минимума)
- •Никогда нельзя использовать одновременно оба способа перестановки элементов массива.
- •8. Обработка двумерных массивов (матриц)
- •8.1. Ввод прямоугольной матрицы
- •8.2. Вывод прямоугольной матрицы в окно списка и в текстовое поле
- •8.3. Поиск максимального элемента матрицы
- •8.4. Обработка матрицы по строкам
- •8.5. Обработка матрицы по столбцам
- •8.6. Обработка квадратных матриц
- •Для обработки элементов, стоящих на любой диагонали, достаточно одного цикла. Для обработки элементов, принадлежащих к одному из треугольников, необходимо использовать вложенные циклы.
- •9. Обработка строк
- •9.1. Основные функции обработки строк
- •9.2. Посимвольная обработка строки
- •9.3. Формирование массива слов строки
- •9.4. Формирование строки из массива слов
- •9.5. Слова-палиндромы
- •9.6. Выделение чисел из строки
- •9.7. Сравнение строк
- •9.8. Обработка многострочного текста
- •10. Тип данных, определенный пользователем. Структуры
- •10.1. Описание структуры. Область видимости. Понятие метода
- •10.2. Оператор With
- •10.3. Ввод массива структур
- •10.4. Вывод массива структур
- •10.5. Поиск в массиве структур
- •10.6. Формирование нового массива из некоторых элементов исходного массива
- •10.7. Сортировка массива структур
- •11. Использование подпрограмм
- •11.1. Определение процедуры и функции. Описание процедуры и функции
- •11.2. Передача параметров по ссылке и по значению
- •11.3. Формальные параметры и фактические переменные
- •11.4. Локальные и глобальные переменные
- •11.5. Static-переменные
- •Приложение 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
- •Приложение 32
- •Приложение 33
- •Приложение 34
- •Приложение 35
- •Приложение 36
- •Приложение 37
- •Приложение 38
- •Приложение 39
- •Приложение 40
- •Приложение 41
- •Приложение 42
- •Приложение 43
- •Приложение 44
- •Приложение 45
- •Приложение 46
- •Приложение 47
- •Приложение 48
- •Приложение 49
- •Приложение 50
- •Приложение 51
- •Приложение 52
- •Список литературы
8.3. Поиск максимального элемента матрицы
Для поиска максимального элемента матрицы и определения его индексов нам потребуются три дополнительные переменные. В первой из них будем хранить значение максимального элемента, а во второй – номер строки, к которой он находится, а в третьей – номер столбца. Поиск максимального элемента в матрице традиционно начинают с элемента, стоящего в нулевой строке и нулевом столбце. Затем организуют вложенные циклы, которые позволят проанализировать все элементы матрицы. Если значение какой-либо элемента матрицы окажется больше ранее найденного максимума, то значение максимума необходимо обновить, сделав равным этому элементу. При этом сразу запоминаются оба его индекса. Рассмотрим особенности программной реализации этого алгоритма.
Объявляем необходимые переменные. Переменная maxпредназначена для хранения значения максимального элемента. Ее тип всегда должен совпадать с типом элементов матрицы. В переменнойimaxмы будем запоминать номер строки, в которой находится максимальный элемент матрицы, а в переменнойjmaxмы будем хранить номер столбца, в котором находится максимальный элемент. Эти две переменные всегда будут иметь целочисленный тип.
Dim max, imax, jmax As Integer
Поиск максимума мы начинаем с элемента, стоящего в нулевой строке и нулевом столбце матрицы.
max = a(0, 0)
В переменные imaxиjmaxмы записываем соответственно номера строки и столбца, которые равны нулю.
imax = 0
jmax = 0
Организуем цикл по всем строкам матрицы.
For i = 0 To m
Организуем цикл по столбцам матрицы. Он позволит нам перебрать все элементы в пределах i-й строки.
For j = 0 To n
Анализируем очередной элемент матрицы.
If a(i, j) > max Then
Если его значение больше, чем значение ранее найденного максимума, то необходимо обновить значение максимума (переменной max), записав в него значение текущего элемента.
max = a(i, j)
Сразу же запоминаем индексы нового максимума. Номер строки, в которой находится данный элемент матрицы, хранится в переменной i, а номер столбца – в переменнойj.
imax = i
jmax = j
End If
Next
Next
После завершения вложенных циклов нам остается только вывести полученные результаты в окно списка. Сначала выведем горизонтальную черту, чтобы зрительно отделить исходные данные от полученных результатов.
lstMatrix.Items.Add("------------------------------")
Заем выведем максимальное значение и его индексы.
lstMatrix.Items.Add("Максимум:" + Str(max))
lstMatrix.Items.Add("Строка:" + Str(imax))
lstMatrix.Items.Add("Столбец:" + Str(jmax))
Полный текст программы представлен в приложении 38. Пример работы программы приведен на рис. 53.
Рис. 53. Пример работы программы поиска максимального элемента в прямоугольной матрице
8.4. Обработка матрицы по строкам
Обработка прямоугольной матрицы может вестись двумя способами: по строкам и по столбцам. Как правило, способ обработки определяется условием решаемой задачи. При обработке по строкам вложенные циклы организуются таким образом, чтобы за один шаг внешнего цикла полностью обрабатывалась одна строка матрицы. В этом случае внешний цикл будет идти по строкам матрицы, а внутренний – по столбцам. В качестве примера рассмотрим задачу вычисления среднего арифметического четных элементов в каждой строке матрицы.
Для решения этой задачи необходимо в каждой строке матрицы вычислить свою сумму и количество четных элементов. Затем, если это возможно, найти среднее арифметическое. Если же в какой-то строке матрицы нет четных элементов, то вместо среднего арифметического мы будем печатать поясняющее сообщение. Результаты работы программы будем выводить в окно списка.
Начнем с объявления необходимых переменных. Переменные sumиkol, имеющие целочисленный тип данных, предназначены для хранения суммы и количества четных элементов в одной строке матрицы.
Dim sum, kol As Integer
Так как среднее арифметическое получается в результате деления, то соответствующая переменная всегда будет иметь рациональный тип данных.
Dim sred As Single
Для каждой строки матрицы мы будем получать отдельный результат. Поэтому удобно совместить процессы вычисления и вывода в одном цикле. Чтобы результаты вычислений зрительно отделялись от исходных данных, выведем горизонтальную черту.
lstMatrix.Items.Add("-----------------------------")
Результаты вычислений мы будем выводить в две колонки. В первой будет указываться номер обрабатываемой строки матрицы, а во второй – найденное значение среднего арифметического четных элементов. Выводим поясняющий заголовок. Константа vbTabпозволяет организовать вывод в две колонки.
lstMatrix.Items.Add("Строка" + vbTab + _
"Сред. арифм.")
Так как по условию задачи требуется, чтобы каждая строка матрицы обрабатывалась отдельно, то обработку матрицы будем вести по строкам. Для этого организуем внешний цикл по строкам, а внутренний – по столбцам.
For i = 0 To m
За один шаг внешнего цикла мы будем полностью обрабатывать одну строку матрицы. Для этого мы будем использовать внутренний цикл. Следовательно, начальные значения для суммы и количества необходимо задать до него.
sum = 0
kol = 0
Организуем внутренний цикл. Нам необходимо обработать все элементы, находящиеся в i-й строке матрицы. Для этого мы должны пройтись по всем столбцам матрицы. Соответственно, внутренний цикл будет по столбцам.
For j = 0 To n
На каждом шаге цикла анализируем элемент матрицы.
If a(i, j) Mod 2 = 0 Then
Если его значение при делении на 2 дает в остатке ноль, значит, оно четное, и данный элемент надо добавить к сумме. При этом количество четных элементов в данной строке матрицы увеличивается на единицу.
sum += a(i, j)
kol += 1
End If
Next
После завершения внутреннего цикла можно приступать к вычислению среднего арифметического четных элементов в одной строке матрицы. Сначала анализируем количество четных элементов.
If kol = 0 Then
Если количество четных элементов равно нулю, значит, их в рассматриваемой строке нет ни одного четного элемента. Следовательно, вычислить их среднее арифметическое невозможно. Поэтому вместо ответа выводим номер строки и поясняющее сообщение.
lstMatrix.Items.Add(Str(i) + vbTab + _
"В строке нет четных")
Else
Иначе мы делим сумму четных элементов на их количество и получаем искомое значение.
sred = sum / kol
В окно списка выводим номер строки и найденное значение среднего арифметического четных элементов в этой строке.
lstMatrix.Items.Add(Str(i) + vbTab + _
Str(sred))
End If
Next
Полный текст программы представлен в приложении 39. Пример работы программы приведен на рис. 54.
Рис. 54. Пример работы программы поиска среднего арифметического четных элементов в каждой строке прямоугольной матрицы