Студопедия

КАТЕГОРИИ:


Архитектура-(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

Элемент экранной формы Имя свойства Значение свойства
Frame Name Frame1
Caption Исходные данные
Label Name Lbl1
Caption № квартиры
Label Name Lbl2
Caption Фамилия владельца
Label Name Lbl3
Caption Тип ремонта
ListBox Name List1
ListBox Name List2
ListBox Name List3
Frame Name Frame2
Caption Сводные заявки на ремонт
Label Name Lbl4
Caption Тип ремонта
Label Name Lbl5
Caption № квартиры
Label Name Lbl6
Caption Фамилия владельца
ListBox Name List4
ListBox Name List5
ListBox Name List6
CommandButton Name ПУСК
Caption ПУСК
CommandButton Name ВЫХОД
Caption ВЫХОД

Программа

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) = “” ‘можно убрать

<== предыдущая лекция | следующая лекция ==>
Динамические массивы | End Sub. Рис. 3.10. Экранная форма c отображён-ными резул
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 548; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.126 сек.