Задание № 7. Программирование двумерных массивов
Постановка задачи
Вычислить сумму элементов столбцов двумерного массива MN(m1, n1) (матрицы).
Анализ задачи
Анализ постановки задачи показывает, что в алгоритме задачи должны быть элементы циклической структуры. Исходные данные – размерность массива m1 и n1, значения элементов массива MN(m1, n1). Результирующие данные – суммы столбцов, количество которых равно n1.
Алгоритм задачи
Для реализации цикла используем оператор цикла For … Next. Чтобы задача позволяла работать с двумерными массивами (матрицами) любой размерности предусматриваем ввод размерности матрицы. После этого матрицу, которую сначала объявляем как безразмерную, снова переопределяем.
Затем, используя вложенные циклы, вводим значение элементов матрицы по строкам с помощью окна ввода InputBox() и сразу выводим их на форму для контроля.
Просматривая элементы матрицы с помощью вложенных циклов For…Next по столбцам, определяем суммы элементов столбцов и сохраняем их в одномерном массиве размерности n1 (по числу столбцов матрицы).
Используя оператор цикла, выдаем суммы элементов всех столбцов матрицы.
Блок-схема алгоритма изображена на рис. 7.1.
Разработка пользовательского интерфейса
Один из вариантов разработки интерфейса формы может быть таким, каким изображен на рис. 7.2.
Откройте приложение Visual Basic и создайте новый проект, следуя технологии, изложенной в задании № 1. Проект сохраните в своей папке под именем Матрица_СвоиИнициалы.vbp.
Введите Имя (Name) формы frmMatr, а Название (Caption) – Сумма строк матрицы. Затем разработайте интерфейс новой формы.
Интерфейс связан с тремя основными блоками: ввода исходных данных, блока вычислений, вывода результатов.
Ввод исходных данных. Ввод размерности массива m1 и n1 проще всего осуществлять с помощью двух Текстовых полей, ЭтикеткаВведите размерность матрицы перед этими текстовыми полями, Этикеткаxи ЭтикеткаМатрица. Ввод элементов массива сделайте с помощью функции InputBox.
Блок вычислений.Все вычисления будут запрограммированы в программе (процедуре). Но для начала вычислений необходимо предусмотреть на форме Кнопку с названием Вычислить, которая и будет запускать на выполнение такую процедуру. Еще одну Кнопкус названием Выход необходимо построить на форме для завершения работы с формой.
Вывод результатов. Поскольку после ввода элементов матрицы они должны быть выданы для контроля на форму, а их количество не постоянное, то предусмотреть на форме постоянное место для вычисляемых конечных значений не представляется возможным. Переменным будет и количество вычисленных сумм строк матрицы. Поэтому выдачу этих величин на форму необходимо предусмотреть в программе.
Таким образом, на форме frmMatr должны быть объекты и их свойства, представленные в табл.7.1.
Таблица 7.1
Объект | Свойство | Установленное значение |
Label1 | Caption | Введите размерность матрицы: |
BackColor | Светло-коричневый (из палитры) | |
ForeColor | Темно-коричневый (из палитры) | |
Label2 | Caption | Матрица |
BackColor | Голубой (из палитры) | |
ForeColor | Темно-синий (из палитры) | |
Label3 | Caption | x |
Text1 | Имя | txtM1 |
Text | Пусто (для ввода m1) | |
Text2 | Имя | txtN1 |
Text | Пусто (для ввода n1) | |
Command1 | Имя | cmdВвод |
Caption | Ввод элементов матрицы | |
Command2 | Имя | cmdВычислить |
Caption | Сумма элементов столбцов | |
Command3 | Имя | cmdВыход |
Caption | Выход |
Для свойства Fontвсех надписей на Labelи Commandвыберите размер шрифта в 10 пунктов.
Написание программного кода
Перед написанием программного кода в процедурах следует определить, какие переменные в этом проекте будут глобальными (Public). Поскольку ввод элементов матрицы и вычисления сумм элементов строк будет происходить в разных процедурах, то двумерный массив MN(m1, n1) должен быть объявлен как глобальный в стандартном блоке формы. Для этого в открывшемся Окне написания кода в разделе (General)ниже слов Option Explicit (явный выбор) введите Public MN() As Double.
Для события Click кнопки cmdВвод (Ввод элементов матрицы) напишите следующий код:
Private Sub cmdВвод_Click()
Dim i As Integer, j As Integer
Dim m1 As Integer, n1 As Integer
m1 = Val(Text1.Text)
n1 = Val(Text2.Text)
ReDim MN(m1, n1) As Double ‘переопределение массива MN()
Cls ‘ чистка формы от вывода данных оператором Print
CurrentX = 200 ‘ координаты подбираются X, Y
CurrentY = 1500
For i = 1 To m1
For j = 1 To n1
MN(i, j) = Val(InputBox("Введите элемент MN(" _
& i & "," & j & ")", "Ввод матрицы", , 3700, 5050))
MN(i, j) = Format(MN(i, j), "0000.##;-0000.##")
Print " "; MN(i, j); " ";
Next j
Next i
End Sub
Для события Click кнопки cmdВычислить (Сумма элементов столбцов) напишите следующий код:
Private Sub cmdВычислить_Click()
Dim s As Integer, i As Integer, j As Integer
Dim m1 As Integer, n1 As Integer, su() As Double
m1 = Val(Text1.Text)
n1 = Val(Text2.Text)
ReDim su(n1) As Double
For i = 1 To n1
su(i) = 0
For j = 1 To m1
su(i) = su(i) + MN(i, j)
Next j
Next i
Font.Size = 10 ‘ выбор размер шрифта 10 пунктов
Print " ";
Font.Underline = True ‘ ввод текста с подчеркиванием
Print "Сумма элементов:"
Font.Underline = False ‘ отмена ввода текста с подчеркиванием
For i = 1 To n1
Print “ “; i; " столбца = "; Format(su(i), "0.##")
Next i
End Sub
Для события Click кнопки cmdВыход (Выход) напишите следующий код:
Private Sub Command3_Click()
Unload Me ‘Закрытие формы frmMatr
End Sub
Изменение программного кода
Вычислительные задачи требуют соблюдения определенного порядка работы с элементами управления. В этой задаче необходимо сначала ввести размерность матрицы, затем элементы матрицы и только после этого можно вычислять сумму столбцов. Если этот порядок будет нарушен, то может быть аварийный останов задачи. Избежать этого можно, если сначала заблокировать кнопки, а затем, в нужные моменты, их разблокировать. Такая блокировка, например, для кнопки cmdВвод, осуществляется командой
cmdВвод.Enabled = False,
а разблокировка –
cmdВвод.Enabled = True
Самостоятельно сделайте следующие изменения проекта.
1) В окне Свойств для кнопок Command1 и Command2 свойству Enabledзадать значения False.
2) Для текстового поля txtN1написать процедуру Private Sub txtN1_LostFocus()(LostFocus – событие поля Потеря фокуса). В процедуре запрограммировать следующий алгоритм. Если текстовые поля txtM1и txtN1не пустые, то разблокировать кнопку cmdВвод (Ввод элементов матрицы) и установите на ней фокус, используя метод SetFocus,для чего напишите код cmdВвод. SetFocus
3) В самом конце процедуры Private Sub cmdВвод_Click()записать код разблокирования кнопки cmdВычислить.
4) В самом конце процедуры Private Sub cmdВычислить_Click()записать коды блокирования кнопок cmdВвод иcmdВычислить.
Если дополнения программы будут сделаны правильно, то после ввода размерности матрицы и нажатия клавиши Tabкнопка cmdВвод будет активизирована и получит фокус. Если же размерность не будет введена или введена не полностью, то после нажатия клавиши Tabкнопка cmdВвод разблокирована не будет, а фокус будет передан на кнопку END.
Дата добавления: 2015-02-05; просмотров: 1342;