- •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.6. Обработка квадратных матриц
Квадратной называют матрицу, у которой число строк равно числу столбцов. В общем случае обработка квадратных матриц принципиально не отличается от обработки прямоугольной матрицы. Для нее также используют вложенные циклы, с той лишь разницей, что диапазоны значений для внешнего и внутреннего счетчиков будут одинаковыми. Посмотрим, как изменяется текст программы ввода матрицы и вывода ее в окно списка при переходе от прямоугольной матрицы к квадратной.
Так как размеры у квадратной матрицы совпадают, то для их хранения достаточно одной переменной. В квадратной матрице nстрок иnстолбцов. Следовательно, вместо двух блоков ввода (ввод числа строк и ввод числа столбцов) будет один – ввод размера матрицы.
Do
n = Val(InputBox("Введите размер матрицы"))
Loop Until n > 0
Нумерация элементов в квадратной матрице идет также как и в прямоугольной – с нуля. Поэтому номера последней строки и столбца будут на единицу меньше соответствующего размера.
n -= 1
Выделяем память для хранения квадратной матрицы.
ReDim a(n, n)
Организуем вложенные циклы для ввода элементов матрицы. Диапазоны значений счетчиков у этих циклов совпадают, так как совпадают размеры матрицы.
For i = 0 To n
For j = 0 To n
Вводим очередной элемент матрицы.
a(i, j) = Val(InputBox("Введите элемент (" + _
Str(i) + "," + Str(j) + ")"))
Next
Next
С завершением вложенных циклов завершается и процесс ввода значений элементов квадратной матрицы. Начинаем процесс вывода матрицы в окно списка. Сначала это окно необходимо очистить от предыдущих результатов работы программы.
lstMatrix.Items.Clear()
Затем мы выводим поясняющий заголовок.
lstMatrix.Items.Add("Матрица")
Организуем вложенные циклы для вывода матрицы. Диапазоны значений счетчиков у этих циклов совпадают, так как совпадают размеры матрицы. В остальном процесс вывода квадратной матрицы ничем не отличается от вывода прямоугольной матрицы.
For i = 0 To n
s = ""
For j = 0 To n
s += Str(a(i, j)) + vbTab
Next
lstMatrix.Items.Add(s)
Next
Полный текст программы обработки квадратной матрицы приведен в приложениях 41 и 42.
При обработке квадратных матриц можно использовать все алгоритмы, разработанные для прямоугольных матриц. Но существует ряд задач, характерных именно для квадратных матриц. Это задачи обработки элементов, находящихся на диагоналях матрицы или в одном из ее треугольников.
В квадратной матрице выделяют главную и побочную диагонали. Главная диагональ (см. рис. 56) идет из верхнего левого угла матрицы в правый нижний угол, то есть от элемента с индексами (0, 0) до элемента с индексами (n,n), гдеn– номер последнего столбца и строки матрицы. На каждой строке матрицы находится ровно один элемент, стоящий на главной диагонали. Для этого элемента всегда будет выполняться условиеi = j, гдеi– номер строки, аj– номер столбца.
Рис. 56. Главная диагональ квадратной матрицы
Главная диагональ разбивает матрицу на два треугольника. Все элементы верхнего треугольника расположены над главной диагональю. Для них выполняется условие i < j, гдеi– номер строки, аj– номер столбца. Все элементы нижнего треугольника расположены под главной диагональю. Для них выполняется условиеi > j, гдеi– номер строки, аj– номер столбца. Как правило, элементы, стоящие на диагонали, не включаются ни в один треугольник. Если же по условию задачи требуется включить диагональные элементы в один из треугольников, то в соответствующем условии строгое неравенство заменяется на нестрогое. Условия главной диагонали и соответствующих треугольников проиллюстрированы на рис. 56.
Побочная диагональ (см. рис. 57) идет из верхнего правого угла матрицы в левый нижний угол, то есть от элемента с индексами (0, n) до элемента с индексами (n, 0), гдеn– номер последнего столбца и строки матрицы. На каждой строке матрицы находится ровно один элемент, стоящий на побочной диагонали. Для этого элемента всегда будет выполняться условиеi + j = n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы.
Рис. 57. Побочная диагональ квадратной матрицы
Побочная диагональ разбивает матрицу на два треугольника. Все элементы верхнего треугольника расположены над побочной диагональю. Для них выполняется условие i + j < n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы. Все элементы нижнего треугольника расположены под побочной диагональю. Для них выполняется условиеi + j > n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы. Как правило, элементы, стоящие на диагонали, не включаются ни в один треугольник. Если же по условию задачи требуется включить диагональные элементы в один из треугольников, то в соответствующем условии строгое неравенство заменяется на нестрогое. Условия побочной диагонали и соответствующих треугольников проиллюстрированы на рис. 56.
Рассмотрим особенности алгоритма обработки диагональных элементов на примере решения задачи определения суммы элементов, стоящих на главной диагонали, и произведения элементов, стоящих на побочной диагонали. Полученные результаты будем выводить в окно списка.
Объявляем переменные для хранения суммы и произведения.
Dim sum, proiz As Integer
И задаем им начальные значения.
sum = 0
proiz = 1
Так как в каждой строке находится ровно один элемент с каждой диагонали, то для их обработки нам достаточно одного цикла, поскольку, зная номер строки, номер столбца можно вычислить, пользуясь условием соответствующей диагонали. Организуем цикл по всем строкам матрицы.
For i = 0 To n
Для элементов главной диагонали выполняется условие i = j, то есть номер строки совпадает с номером столбца. Следовательно, если элемент стоит на главной диагонали и находится в строке с номеромi, то он будет стоять в столбце с номеромi. Таким образом, любой элемент с главной диагонали матрицыa(,)можно обозначитьa(i, i). Добавляем этот элемент к итоговой сумме.
sum += a(i, i)
Для элементов побочной диагонали выполняется условие i + j = n. Номер строкиiнам известен, равно как и значение переменнойn. Следовательно, мы можем из этого условия выразить значение переменнойj.
j = n - i
Тогда, если элемент стоит на побочной диагонали и находится в строке с номером i, то он будет стоять в столбце с номеромn - i. Таким образом, любой элемент с побочной диагонали матрицыa(,)можно обозначитьa(i, n - i). Включаем этот элемент в искомое произведение.
proiz *= a(i, n - i)
Next
После завершения цикла печатаем полученные результаты. Сначала выводим горизонтальную черту, чтобы зрительно отделить исходные данные от результатов.
lstMatrix.Items.Add("------------------------------")
Затем печатаем значения суммы и произведения с поясняющим текстом.
lstMatrix.Items.Add("Сумма = " + Str(sum))
lstMatrix.Items.Add("Произведение = " + Str(proiz))
Полный текст программы представлен в приложении 41. Пример работы программы приведен на рис. 58.
Рис. 58. Пример работы программы вычисления суммы элементов, стоящих на главной диагонали квадратной матрицы, и произведения элементов, стоящих на побочной диагонали квадратной матрицы
Теперь рассмотрим особенности алгоритма обработки элементов, принадлежащих к какому-нибудь треугольнику. В качестве примера возьмем задачу поиска минимального из элементов, стоящих выше главной диагонали, и максимального из элементов, стоящих ниже побочной диагонали. Помимо самих значений определим еще индексы искомых элементов. Полученные результаты будем выводить в окно списка.
Описываем переменные для хранения минимального и максимального значений, а также их индексов.
Dim min, imin, jmin As Integer
Dim max, imax, jmax As Integer
Зададим начальное значение для минимума. Им может быть любой элемент, который всегда будет принадлежать к нужному треугольнику. Удобнее всего брать элемент, который расположен в вершине прямого угла (см. рис. 56 и рис. 57). Для треугольника, расположенного выше главной диагонали, это будет элемент, находящийся в правом верхнем углу – a(0, n).
min = a(0, n)
Задаем соответствующие начальные значения индексов.
imin = 0
jmin = n
Рассуждая аналогичным образом, зададим начальное значение для максимума. Так как нужный треугольник расположен ниже побочной диагонали, то это будет элемент, находящийся в правом нижнем углу – a(n, n).
max = a(n, n)
Задаем соответствующие начальные значения индексов.
imax = n
jmax = n
Организуем вложенные циклы для обработки всех элементов матрицы. Внешний цикл будет идти по строкам, а внутренний – по столбцам.
For i = 0 To n
For j = 0 To n
На каждом шаге цикла проверяем, принадлежит ли очередной элемент матрицы к треугольнику, расположенному выше главной диагонали, и меньше ли значение этого элемента, чем ранее найденный минимум.
If i < j And a(i, j) < min Then
Если на оба вопроса дан положительный ответ, значит надо обновить значение минимума, записав в соответствующую переменную значение анализируемого элемента матрицы.
min = a(i, j)
При этом необходимо еще запомнить индексы текущего элемента.
imin = i
jmin = j
End If
Теперь проверяем, принадлежит ли очередной элемент матрицы к треугольнику, расположенному ниже побочной диагонали, и больше ли значение этого элемента, чем ранее найденный максимум.
If i + j > n And a(i, j) > max Then
Если на оба вопроса дан положительный ответ, значит надо обновить значение максимума, записав в соответствующую переменную значение анализируемого элемента матрицы.
max = a(i, j)
При этом необходимо еще запомнить индексы текущего элемента.
imax = i
jmax = j
End If
Next
Next
После завершения вложенных циклов в соответствующих переменных хранится искомая информация. Нам остается только вывести ее в окно списка. Сначала выводим горизонтальную строку, чтобы зрительно отделить исходные данные от полученных результатов.
lstMatrix.Items.Add("------------------------------")
Затем печатаем поясняющий текст и значения необходимых переменных.
lstMatrix.Items.Add("Минимум над глав. диагональю")
lstMatrix.Items.Add("Значение:" + Str(min))
lstMatrix.Items.Add("Строка:" + Str(imin))
lstMatrix.Items.Add("Столбец:" + Str(jmin))
lstMatrix.Items.Add("Максимум под побоч. диагональю")
lstMatrix.Items.Add("Значение:" + Str(max))
lstMatrix.Items.Add("Строка:" + Str(imax))
lstMatrix.Items.Add("Столбец:" + Str(jmax))
Полный текст программы представлен в приложении 42. Пример работы программы приведен на рис. 59.
Рис. 59.Пример работы программы поиска минимального из элементов, стоящих выше главной диагонали квадратной матрицы, и максимального из элементов, стоящих ниже побочной диагонали квадратной матрицы
Сформулируем основные правила обработки элементов матрицы, стоящих на любой диагонали или принадлежащих к одному из треугольников.