- •Предисловие
- •Лабораторная работа №1 программирование арифметических выражений
- •Лабораторная работа №2 программирование линейных алгоритмов
- •Ввод и вывод данных при помощи текстового окна (-TextBox)
- •Ввод и вывод данных с помощью системных функций InputBox() и MsgBox()
- •Лабораторная работа №3 программирование разветвляющихся процессов
- •Лабораторная работа № 4 программирование циклов с параметрами
- •Лабораторная работа № 5 программирование циклов с предусловием
- •Лабораторная работа № 6 программирование циклов с постусловием
- •Лабораторная работа №7 программирование вложенных циклов
- •Программирование одномерных массивов
- •Лабораторная работа № 9 программирование многомерных массивов
- •Оглавление
Лабораторная работа № 9 программирование многомерных массивов
Цель работы – научиться составлять программы с использованием многомерных массивов, а также вводить и выводить информацию с помощью файлов.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ:
Частным случаем многомерных массивов является матрица или двумерный массив. При работе с двумерными массивами используются два индекса: первый указывает на номер строки, а второй определяет номер столбца таблицы. Рассмотрим двумерный массив, состоящий из ста элементов: десяти строк и десяти столбцов (см. таблицу ).
Таблица. Двумерный массив, содержащий десять строк и десять столбцов.
I\J |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
1 |
2 |
3 |
5 |
8 |
1 |
23 |
17 |
54 |
36 |
36.45 |
2 |
4 |
54 |
5 |
9 |
8 |
15 |
45 |
5.2 |
5.7 |
25.4 |
3 |
-8 |
5 |
76 |
43 |
76 |
12 |
45 |
32 |
4.5 |
2.1 |
4 |
-45 |
7 |
98.12 |
64 |
43 |
45 |
4 |
1 |
3 |
2 |
5 |
-2 |
7 |
-32 |
1 |
26 |
79 |
21 |
19 |
89 |
478 |
6 |
-7 |
0 |
-4 |
1 |
34 |
48 |
21 |
54 |
65 |
54 |
7 |
9 |
3 |
0 |
21 |
16 |
78 |
13 |
68 |
45 |
65 |
8 |
4 |
5 |
21.4 |
13 |
24 |
98 |
14 |
14 |
25 |
21 |
9 |
2 |
0 |
21.1 |
14 |
46 |
-72 |
-4 |
-9 |
134 |
12 |
10 |
8 |
7 |
12 |
14 |
-78 |
-98 |
-4 |
12 |
12 |
32 |
Ввод двумерного массива целесообразно осуществлять из файла, так как при отладке программы экономится время на ввод значений элементов массива. В качестве примера напишем программу, осуществляющую ввод значений элементов массива и отображающую ее в элементе MSFlexGrid. Создайте текстовый файл в текстовом редакторе Блокнот, который содержит приведенную выше таблицу (см. рис.). Приложение будет содержать систему меню. В пункте менюFileбудут находиться подпунктыOpen… - для открытия файла,SaveAs… для сохранения файлов иExitдля выхода из программы. Меню вVisualBasicсоздается с помощью редактора меню. Выберите пункт менюVisualBasicTools, а в выпадающем меню подпунктMenuEditor… На экране появится окно редактора меню (см. рис. 27).
Рис. 27. Окно редактора меню.
Рассмотрим основные поля и клавиши редактора. Свойство Caption отображает на экране пункт меню, а свойствоNameприсваивает имя пункту меню. ПолеShortcutпозволяет установить «горячие клавиши» для пункта меню. Для создания подпункта меню, необходимо нажать на стрелку вправо, расположенную рядом с клавишамиNext,InsertиDelete.
Создадим меню нашего приложения. Для создания меню выполните следующие действия:
В поле CaptionвведитеFile.
В поле NameвведитеmnuFile. Префиксmnuговорит программисту о том, что этот объект является пунктом меню.
Нажмите кнопку Next. Затем, для того чтобы создать подпункт меню, нажмите на кнопку.
В поле CaptionнаберитеOpen…, а в полеNamenmuOpen. Нажмите на кнопкуNext.
В поле CaptionвведитеSaveAs…, в качестве имени подпункта меню введитеmnuSave.
Для того чтобы отделить пункты меню от выхода из программы, необходимо поставить разделитель. Для этого в поле Captionнаберите знак -, а в полеNameвведитеmnuSep(от английскогоSeparation- разделение), затем, нажмите кнопкуNext.
И, наконец, добавьте последний пункт меню. В поле CaptionвведитеExit, а в полеNameвведитеmnuExit. В результате окно редактора меню должно выглядеть примерно так как показано на рисунке 28.
Рис. 28. Вид окна редактора меню.
Нажмите на кнопку Ok.
Пункты меню, так же как и командные кнопки обладают событием Click. Поэтому с ними можно работать также как и с кнопками.
Наша программа будет производить следующие действия: вводить двумерный массив из текстового файла, выводить его в MSflexGridи в файл.
Форма приложения приведена на рисунке 29.
Рис. 29. Изображение формы приложения с выпадающим меню.
Программный код приложения приведен ниже:
Dim a() As Single, n As Integer, m As Integer
Private SubmnuExit_Click()
End
End Sub
Private Sub mnuOpen_Click()
Dim s As String, i As Integer, j As Integer
CommonDialog1.Action = 1
s = CommonDialog1.FileName
Open s For Input As #1
Input#1, n, m
ReDim a(1 To n, 1 To m) As Single
For i = 1 To n
For j = 1 To m
Input#1, a(i, j)
Nextj
Nexti
Close#1
End Sub
Private SubmnuSave_Click()
Dim s As String, i As Integer, j As Integer
CommonDialog1.Action = 2
s = CommonDialog1.FileName
Open s For Output As #1
WithMSFlexGrid1
.Rows = n + 1
.Cols = m + 1
For i = 1 To n
.Col = 0
.Row = i
.Text = CStr(i)
For j = 1 To m
.Row = 0
.Col = j
.Text = CStr(j)
.Row = i
.Text = CStr(a(i, j))
Print#1, a(i, j); " ";
Nextj
Print#1, ""
Nexti
Close#1
End With
End Sub
Приведенный выше программный код требует пояснений. В нем используется оператор With…EndWith. Данный оператор позволяет обращаться к свойствам объекта, описанного после ключевого словаWith. Оператор заканчивается ключевым словомEnd With. Между ключевыми словамиWithиEnd Withзаписываются свойства объекта,
перед которыми ставится точка.
Рассмотрим еще один пример работы с двумерными массивами. Создадим программу, определяющую наименьшие элементы строк двумерного массива, и записывающую их в одномерный массив. Форма приложения будет содержать два текстовых окна Text1 иText2, куда будут выводиться соответственно одномерный и двумерный массивы. Ввод двумерного массива будет осуществляться из файла, а вывод одномерного массива только в текстовое окно. Форма приложения в момент выполнения представлена на рисунке 30.
Рис. 30. Изображение формы в период выполнения программы.
Блок-схема программы приведена ниже:
Программный код приложения имеет вид:
Dim a() As Single, n As Integer, m As Integer
Private SubCommand1_Click()
Dim s As String, i As Integer, j As Integer
CommonDialog1.Action = 1
s = CommonDialog1.FileName
Open s For Input As #1
Input#1, n, m
ReDim a(1 To n, 1 To m) As Single
For i = 1 To n
For j = 1 To m
Input#1, a(i, j)
Next j
Nexti
Close#1
End Sub
Private Sub Command2_Click()
Dim min() As Single, j As Integer, i As Integer
ReDim min(1 To n) As Single
Text1.Text = ""
Text2.Text = ""
For i = 1 To n
min(i) = a(i, 1)
For j = 2 To m
If a(i, j) < min(i) Then min(i) = a(i, j)
Next j
Nexti
For i = 1 To n
Text2.Text = Text2.Text + CStr(min(i)) + vbCrLf
For j = 1 To m
Text1.Text = Text1.Text + CStr(a(i, j)) + " "
Nextj
Text1.Text = Text1.Text + vbCrLf
Nexti
End Sub
Private SubCommand3_Click()
End
End Sub
Программный код приложения осуществляет вывод двумерного массива в текстовое окно. Для перехода на следующую строчку многострочного редактора используется константа vbCrLf. Фрагмент программного кода
Forj= 1Tom
Text1.Text = Text1.Text + CStr(a(i, j)) + " "
Nextj
предназначен для формирования и вывода строки матрицы. После закрытия внутреннего цикла осуществляется перевод строки.
ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ:
Найти количество элементов двумерного массива, равных 0 и количество элементов массива больше чем 7. Ввод массива осуществить через функцию InputBox().
Блок –схема:
Private SubCommand3_Click() End End Sub
ЗАДАНИЕ:
Найти суммы положительных элементов строк и записать их в одномерный массив. Вывести оба массива и среднее арифметическое одномерного массива.
Блок-схема:
Форма приложения:
Программный код:
Dim __As _______, __As _______, ____As _______
Private SubCommand1_Click()
Dim __As _______, __As ______, __As ______
WithCommonDialog1
.Action = ___
__= .________
End With
Open __For Input As #1
Input#1, __, __
WithMSFlexGrid1
.Cols = ______
.Rows = ______
ReDim __(__ To __, __ To __) As _______
For __ = __ To __
.Col = __
.Row = __
.Text = _____(__)
Next__
For __ = __ To __
.Row = __
.Col = __
.Text = ____(__)
Next __
For __ = __ To __
For __ = __ To __
.Row = __
.Col = __
Input#1, ______
.Text = CStr(______)
Next__
Next__
End With
Close #1
End Sub
Private SubCommand2_Click()
Dim __As _______, __As _______, ____As ______, ____As ______
ReDim __(__ To __) As ______
For __= __To __
____ = __
For __=__ To __
If ______ __ __ Then ___ = ____ + ______
Next__
Next__
___ = __
For __ = __ To __
____ = ____+ ___
Next__
Text1._____ = _____(____ / ___)
For i = __ To __
List1.__________(_____(____))
Next__
End Sub
Private Sub Command3_Click()
_____
End Sub