КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Двумерные массивы
End Sub
3.5.1. Ввод двумерных массивов (создание массивов)
Ввод двумерного массива осуществляется поэлементно с помощью вложенных циклов. Ввод с клавиатуры (фрагмент процедуры) ... Dim I As Integer Dim A(1 To 15, 1 To 8) As Single For I = 1 To 15 For J = 1 To 8 A (I, J) = InputBox (“Ввести значение элемента с координатами:” & I _ & “ ” & J Next J, I ...
3.5.2. Вывод двумерных массивов
Одним из способов отображения двумерного массива на форму является использование массива элементов ListBox (списков). Каждый список будет содержать элементы столбца двумерного массива. Пусть массив состоит из 10 строк (0 – 9) и 7 столбцов (0 – 6). Создание массива элементов ListBox осуществляется с использованием Линейки инструментов следующим образом: 1. Создать на форме элемент ListBox с именем List1. 2. Щёлкнуть левой мышкой по кнопке Копировать Линейки инструментов. 3. Щёлкнуть левой мышкой по кнопке Вставить Линейки инструментов, появится запрос: “ Вы хотите создавать массив управления?” (“Do you to create a control array?”) Ответить: “Да”. Копия List1 появится в левом верхнем углу формы. Перетащить её (копию List1) в один ряд с исходным элементом ListBox - List1. В перечне элементов текущей формы копии будут получать имена List1(0), List1(1) и т.д., что будет отображаться каждый очередной раз в окне свойств (см. рис. 3.2).
Рис. 3.2. Окно свойств с отображённой в нём копией List1(0)
Повторить кнопкой Вставить (указанный выше Запрос при этом высвечиваться не будет). Размещение копий исходного элемента ListBox на текущей форме будет столько раз, сколько столбцов имеется в двумерном массиве. Пример. Создадим двумерный массив и отобразим его: ... Dim I As Integer, J As Integer Dim A(9, 6) As Single For I = 0 To 9 For J = 0 To 6 A(I, J) = Rnd * 20 – 10 ‘создание или A (I, J) = InputBox (“Ввести значение _ элемента с координатами:” & I & “ ” & J) List1(J).List(I) = A(I, J) ‘отображение Next J, I
Форма имеет вид: Массив элементов ListBox
Кнопка Cmd1 Рис. 3.3. Экранная форма для отображения выводимого дву- мерного массива А
Обработка двумерных массивов
Пример 1. Нахождение первого максимального элемента массива и его координат. Private Sub Cmd1_Click () Const N = 10, M = 6 Dim A(1 To N, 1 To M) As Single Dim I%, J%, Max!, Imax%, Jmax% Imax=1: Jmax=1: Max = A(1, 1) ‘или Мax = -1Е38 (очень малое число) For I = 1 To N For J = 1 To M A (I, J) = InputBox (“Ввести значение элемента с координатами:” & I _ & “ ” & J) Next J, I For I =1 To N For J = 1 To M If A(I, J) > Max Then Max = A(I, J): Imax=I: Jmax=J Next J, I End Sub
Пример 2. Нахождение всех максимальных элементов и их координат. Private Sub... ‘До команды с меткой 10 (включительно) программа идентична программе примера 1 ‘Далее следует новый просмотр массива и операторы вывода данных Print “Искомые координаты:” For I = 1 To N For J = 1 To M If A(I, J) = Max Then Print “I=”; I, “J=”; J Next J, I End Sub
3.6. Использование элемента MSFlexGrid для работы с двумерными массивами
Элемент управления MSFlexGrid (называемый Гибкая сетка) представляет собой сетку двумерной таблицы и обеспечивает отображение на Экранной форме двумерных массивов (и таблиц Баз Данных). В базовый набор Элементов управления панели Инструментов Toolbox этот элемент не включён. Элемент можно вызвать из дистрибутивного хранилища элементов Components, либо следующей командой:
Меню – Project – Components - MSFlex Control 6.0
В окне Components поставить галочку у компоненты Microsoft FlexGrid Control 6.0 и нажать ОК. На панели ToolBox появится значок элемента в виде с обозначением MSFlexGrid. Затем обычным способом можно вызвать элемент на форму и установить его размеры (произвольные) с использованием свойств Rows и Cols. Основные свойства элемента MSFlexGrid: Name – имя элемента в программе (по умолчанию MSFlexGrid1). Можно, например, задать имя Fl1; Rows – количество строк в сетке, начиная с нуля (задаётся используя окно свойств элементов управления); Cols – количество столбцов в сетке, начиная с нуля (задаётся используя окно свойств элементов управления). При использовании элемента управления MSFlexGrid при работе с массивами (и таблицами БД) удобно использовать его методы: TextMatrix(I,J), позволяющий определять координаты ячейки сетки, где I – номер строки, J – номер столбца, и Rows и Cols, обеспечивающие задание количества строк и столбцов сетки в процессе выполнения программы. В таблицу можно заносить числа или данные типа String.
Пример1
Создание и отображение двумерного массива. Создадим на форме сетку Fl1 и кнопки: “Вв и Обр” - c именем CmdVv и “Выход” - с именем CmdExit (Рис. 3.4.). Форма может иметь вид:
Командная кнопка CmdVv
Командная кнопка CmdExit
MSFlexGrid - гибкая сетка с именем Fl1
Рис. 3.4. Экранная форма программы CmdVv_Click
Программа (программный код): Private Sub CmdVv_Click() Const N = 3, M = 4 Dim I%, J%, S! Dim A(N,M) As Single Fl1.Rows = N + 1 ‘задание размеров Fl1 Fl1.Cols = M + 1 For I = 0 To N ‘ввод массива A For J = 0 To M A(I, J) = InputBox(“Вв. Элем. с коорд.” & I & “ “ & J) Fl1.TextMatrix (I, J) = A(I, J) ‘ или можно ввести непосредственно в Fl1: Fl1.TextMatrix (I,J) = InputBox (“Вв элемент...”) Next J, I ‘При желании можно произвести обработку массива А или ‘тождественного ему массива Fl1 ‘Пусть нужно найти сумму S элементов массива S = 0 For I = 0 To N ‘или To Rows – 1 For J = 0 To M ‘или To Cols – 1 S = S + A(I, J) ‘или S = S + Fl1.TextMatrix (I, J) Next J, I Print “искомая сумма =” & S
Пример 2 Найти наибольший из чётных элементов строк матрицы A(10,12) и заменить его наименьшим из нечётных элементов столбцов. Результирующую матрицу вывести на экран. Макет исходных данных (вариант): Экранная форма (интерфейс) рассматриваемого задания имеет вид (рис. 3.5):
Рис. 3.5. Экранная форма Примера 2 до запуска программы
Для компоновки Экранной формы (формирования Интерфейса) рассматриваемого задания использованы следующие Элементы управления окна ToolBox: –метка Label (надпись: Исходная матрица A)cименем Lbl1; – метка Label (надпись: Результирующаяя матрица A)cименем Lbl2; – Гибкая сетка MSFlexGrid с именем Fl1 (Отображение на Экранной форме Исходной матрицы A); – Гибкая сетка MSFlexGrid с именем Fl2 (Отображение на Экранной форме Результирующей матрицы A); – командная кнопка CommandButton с именем ПУСК; – командная кнопка CommandButton с именем Выход. Программа Private Sub ПУСК _Click() ‘Программа обработки исходного массива Dim A() As Integer ‘исходный двумерный массив (матрица) Dim Ki As Integer ‘количество строк матрицы Dim Kj As Integer ‘количество столбцов матрицы Dim I%, J% ‘индексы Dim Max As Single ‘максимальный из чётных элементов строк _ массива A Dim Mi As Integer ‘номер строки элемента Max массива A Dim Mj As Integer ‘номер столбца элемента Max массива A Dim Min As Single ‘минимальный из нечётных элементов _ столбцов массива A Dim Ni As Integer ‘номер строки элемента Min массива A Dim Nj As Integer ‘номер столбца элемента Min массива A Dim F As Byte ‘переменная, фиксирующая первый элемент _ массива А, удовлетворяющий заданному условию Ki = InputBox (“Укажите количество строк массива A: ”) Kj = InputBox (“Укажите количество столбцов массива A: ”) ReDim A(1 To Ki, 1 To Kj) Fl1.Rows = Ki + 1 ‘задание числа строк сетки Fl1 Fl1.Cols = Kj + 1 ‘задание числа столбцов сетки Fl1 Fl2.Rows = Ki + 1 ‘задание числа строк сетки Fl2 Fl2.Cols = Kj + 1 ‘задание числа столбцов сетки Fl2 For I = 1 To Ki ‘ввод и отображение массива A For J = 1 To Kj
A(I, J) = InputBox (“Введите значение элемента _ массива A: ” & I & “ “ & J) Fl1.TextMatrix(I, J) = A(I, J) Next J Next I F = 0 For I = 1 To Ki ‘цикл по строкам For J = 1 To Kj ‘поиск наибольшего из чётных элементов строк If A(I, J) Mod 2 = 0 And F = 0 Then Max = A(I, J): Mi=I: Mj=J: F=1 If A(I, J) Mod 2 = 0 And F = 1 And A(I, J)>Max Then Max = A(I, J) Mi = I: Mj = J End If Next J Next I F = 0 For J = 1 To Kj ‘цикл по столбцам For I = 1 To Ki ‘поиск наименьшего из нечётных элементов _ столбцов If A(I, J) Mod 2 <> 0 And F = 0 Then Min = A(I, J):Ni = I:Nj=J: F=1 If A(I, J) Mod 2 <> 0 And F = 1 And A(I, J)<Min Then Min = A(I, J) Ni = I: Nj = J End If Next I Next J A(Mi, Mj) = Min: A(Ni, Nj) = Max ‘перестановка Max и Min в массиве A For I = 1 To Ki ‘вывод результатов на экран (в сетку Fl2) For J = 1 To Kj Fl2.TextMatrix(I, J) = A(I, J) Next J Next I End Sub
Private Sub Выход_Click() End End Sub
Экранная форма Примера 2 с началом запуска программы имеет вид (рис. 3.6):
Рис. 3.6. Экранная форма Примера 2 с началом запуска программы
Рис. 3.7. Экранные формы Примера 2 в процессе выполнения программы
Рис. 3.8. Экранная форма Примера 2 с отображёнными результатами выполнения программы Пример 3 В бюро по ремонту квартир поступили сведения о состоянии N квартир ЖСК (N – задаваемое число). Сведения о каждой квартире содержат: номер квартиры, фамилию владельца и тип первоочередного ремонта (или отсутствие необходимости в ремонте). НЕОБХОДИМО: Составить сводные (по типам ремонта) заявки на ремонт с указанием номеров квартир и фамилий владельцев. Макет исходных данных с конкретными значениями (вариант):
Номер квартиры Фамилия владельца Тип ремонта (Kv) (Fam) (Trem)
Для компоновки экранной формы решения задачи на массивы в соответствии с условием варианта использованы следующие элементы управления: рамка Frame1 (Исходные данные); Элементы, размещённые в рамке: – метка Label (надпись) с именем Lbl1 имеет значение свойства Caption – № квартиры; – метка Label (надпись) с именем Lbl2 имеет значение свойства Caption – Фамилия владельца; – метка Label (надпись) с именем Lbl3 имеет значение свойства Caption – Тип ремонта; – список ListBox с именем List1 заполняется исходными номерами квартир; – список ListBox с именем List2 заполняется фамилиями владельцев квартир; – список ListBox с именем List3 заполняется типом требуемого ремонта; рамка Frame2 (Сводные заявки на ремонт); Элементы, размещённые в рамке: – метка Label (надпись) с именем Lbl4 имеет значение свойства Caption – Тип ремонта; – метка Label (надпись) с именем Lbl5 имеет значение свойства Caption – № квартиры; – метка Label (надпись) с именем Lbl6 имеет значение свойства Caption – Фамилия владельца; – список ListBox с именем List4 заполняется различными типами ремонта; – список ListBox с именем List5 заполняется номерами квартир; – список ListBox с именем List6 заполняется фамилиями владельцев квартир; – командная кнопка с именем ПУСК; командная кнопка с именем ВЫХОД.
Примечание. Рамка Frame как элемент управления, размещаемый на экранной форме, является одним из видов контейнеров, позволяющих объединить в группу несколько элементов управления. Эту группу элементов можно перемещать как единое целое вместе с рамкой, активизировать и дезактивизировать, делать видимой и невидимой. Вызывается рамка щелчком левой клавиши мышки по элементу Frame . Элементу необходимо дать уникальное имя, например, Fra1 или Frat, и достаточные размеры. Затем поместить внутрь рамки необходимые элементы управления. Можно осуществлять перемещение элементов управления с формы в рамку через буфер: удалить элемент с формы в буфер (Edit-Cut или Ctrl+V), щелкнуть левой клавишей мышки на рамке и внести элемент в рамку (Edit-Paste или Ctrl+Y). С помощью свойства Visible (видимость) можно организовать механизм переключения рамок во время выполнения программы:
Fra1. Visible = True Видима рамка Fra1 и невидима рамка Frat Frat. Visible = False Fra1. Visible = False Видима рамка Frat и невидима рамка Fra1 Frat. Visible = True
На форму можно помещать несколько рамок, делая одни рамки видимыми, а другие невидимыми со всеми расположенными в них элементами. Таким образом, можно “листать” разные рамки одной формы как страницы этой формы (рамка Frame в качестве страницы формы), что даёт выигрыш в размещении большого количества элементов на одной форме. На рис. 3.14 и 3.15 на экранных формах по две рамки Frame1 (Исходные данные с размещёнными в ней элементами List1, List2 и List3) и Frame2 (Сводные заявки на ремонт с размещёнными в ней элементами List4, List5 и List6).
. Рис. 3.9. Экранная форма до запуска программы
Элементы экранных форм (рис. 3.9 и рис. 3.10) и их основные свойства представлены в табл. 3.1.
Таблица 3.1
Программа Private Sub ПУСК_ Click() Dim Kv() As Integer 'массив номеров квартир Dim Fam() As String 'массив фамилий Dim Trem() As String ‘тип ремонта Dim Rtrem() As String 'разные типы ремонта Dim I As Integer 'индекс Dim J As Integer 'индекс Dim N As Integer 'количество квартир Dim K As Integer 'количество различных типов ремонта Dim FL As Integer 'флажок - показывает есть ли разные типы _ ремонта или нет Dim L As Integer ‘индекс N = InputBox ("Введите количество квартир") ReDim Kv(1 To N), Fam(1 To N), Trem(1 To N), Rtrem(1 To N) For I = 1 To N ‘ввод и отображение на форме исходных данных Kv(I) = InputBox (“Введите № квартиры ”) Fam(I) = InputBox ("Введите фамилию владельца " & Kv(I) & " квартиры") Trem(I) = InputBox ("Тип ремонта или его отсутствие") List1. List (I - 1) = Kv(I): List2. List (I - 1) = Fam(I): List3. List (I - 1) = Trem(I) Next I K = 0 For I = 1 To N 'образование массива разных типов ремонта FL = 0 For J = 1 To K If Trem(I) = Rtrem(J) Then FL = 1 Next J If Fl = 0 Then K = K + 1: Rtrem(K) = Trem(I) Next I L = 0 For I = 1 To K 'вывод на форму различных типов ремонта, _ номеров квартир, List4. List (L) = Rtrem(I) 'фамилий владельцев For J = 1 To N If Trem(J) = Rtrem(I) Then List5. List (L) = Kv(J): List6. List (L) = Fam(J) L = L + 1: List4. List (L) = “” ‘можно убрать
Дата добавления: 2014-01-04; Просмотров: 570; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |