Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_8_Масс_2.doc
Скачиваний:
20
Добавлен:
17.04.2015
Размер:
421.38 Кб
Скачать

7

Лабораторная работа №8

Работа с двухмерными массивами

Цель:

изучить приемы программирования задач с использованием двухмерных массивов.

Результат обучения:

  • знать алгоритмы ввода/вывода двухмерного массива;

  • уметь составлять описание двухмерных массивов;

  • уметь программировать задачи по обработке двухмерных массивов.

Изучение приемов программирования задач с использованием двухмерных массивов

В Visual Basic имеется возможность работы с двухмерными массивами. В математике аналогом двухмерного массива является матрица.

А =

Матрица А состоит из четырех строк и четырех столбцов. В матрице каждый элемент идентифицируется номером строки и номером столбца, на пересечении которых он расположен.

В двухмерном массиве элемент также определяется двумя индексами, которые заключаются в скобки и отделяются друг от друга запятыми, например: a(2, 3)

В двухмерном массиве первый индекс указывает на номер строки, а второй индекс указывает на номер столбца, на пересечении которых расположен элемент. В матрице А, записанной выше, элемент а(2, 3) равен 1, а элемент a(3, 2) равен 0.

Предположим, перед нами стоит задача обнулить все элементы первой строки. Можно рассматривать строку матрицы как одномерный массив. Тогда нужно записать оператор:

For i=1 To 4

a (1, i) =0

Next i

Первый индекс элемента остается неизменным, он равен 1. Это номер строки. Второй индекс изменяется от 1 до 4. Это номер столбца.

Пусть теперь необходимо обнулить все элементы первого столбца.

For i=1 To 4

a (i ,1 ) =0

Next i

В цикле организуем изменение первого индекса. Второй индекс, определяющий номер столбца остается неизменным.

Если нужно обнулить все элементы матрицы, то следует организовать два вложенных цикла.

For i=1 To 4

For j =1 To 4

a (i ,j) =0

Next j

Next i

При каждом значении i (номера строки) j пробегает все значения от 1 до 4.

Так, при работе с двумерными массивами для определения каждого элемента массива нужно организовать два вложенных цикла. Например, для ввода значений элементов матрицы, состоящей из 4-х строк и 4-х столбцов, нужно записать следующий код:

Для ввода элементов используется текущий лист электронной таблицы.

For i = 1 To n

For j = 1 To m

A(i, j) = cells(i, j)

Next j

Next i

Для ввода элементов массива в VBA используется функция InputBox:

For i = 1 To n

For j = 1 To m

A(i, j) = InputBox("a(" + Str(i) + Str(j) + ")")

Next j

Next i

Ввод по строкам, реализованный в приведенном фрагменте программы является наиболее естественным. В случае необходимости можно организовать заполнение массива по столбцам. Для этого внешний цикл должен быть организован по номеру столбца (j), а внутренний — по номеру строки (i) с соответствующими границами изменения индексов.

For j = 1 To 4

For i = 1 To 4

a (i, j) = cells(i, j)

Next j : Next i

Объявление массивов фиксированного размера осуществляется с помощью тех же операторов, что и простая переменная. Только после имени массива в круглых скобках проставляется размер массива. Размер массива можно задавать целым числом или переменной, значение которой перед этим должно быть определено. Область видимости массивов определяется так же, как для простых переменных.

Примеры объявления массивов:

Dim intA(21) As Integer

Public sngMas(6, 4) As Single

или

Dim intA(1 To 21) As Integer, intD(- 4 To 5) As Single

Public sngMas(1 To 6, 1 To 4) As Single

В первом варианте в массиве intA(21) всего 22 элемента, т. к. индекс изменяется от 0 до 21. Но можно использовать только элементы с индексами от 1 до 21, хотя элемент intA(0) также будет существовать. А в двумерном массиве sngMas(6, 4) всего 35 элементов (7х5), т. к. отсчет каждого индекса начинается с 0. В одномерном массиве intD(- 4 To 5) начальное значение индекса – отрицательное число.

Элементов с нулевыми индексами во втором варианте объявления массивов нет. И количество элементов в массиве intA() всего 21, а в sngMas() – 24 (6х4). Но можно «заставить» вести отсчет индексов всегда с 1, если ввести оператор Option Base 1 в раздел (General) (Declarations).

Объявление динамического массива производится в случае, когда размер массива может изменяться во время выполнения программы. В начале программы (процедуры) необходимо объявить массив без указания его размера, например для массива А

Dim A() As Integer

После того, как размер массива (N и M) в программе станет известен, нужно переопределить массив с помощью оператора Redim:

ReDim A(M, N) As Integer

Форма:

Данная задача решена в среде VBA. Для ввода информации используются редакторы ввода TextBox1 и TextBox2. Для вывода информации используется текстовый редактор TextBox3. Его свойство MultiLine должно быть равно True.

Пример 1.

Условие задачи: сформировать матрицу размером N на M и вывести ее на экран. Программа формирует двухмерный массив с ‘помощью датчика случайных чисел и выводит массив на экран.

Схема алгоритма:

Программа:

Private Sub CommandButton1_Click()

Dim A() As Single

n = Val(TextBox1.Text)

m = Val(TextBox2.Text)

ReDim A(n, m)

For i = 1 To n

For j = 1 To m

A(i, j) = Int(Rnd * 10)

Next j

Next i

Rez = ""

For i = 1 To n

For j = 1 To m

Rez = Rez + Str(A(i, j)) + vbTab

Next j

Rez = Rez + vbCrLf

Next i

TextBox3.Text = Rez

End Sub

Вывести массив — значит вывести все элементы массива. Также как и при вводе массива, следует организовать два цикла по строкам и по столбцам для определения индексов элементов массива.

В поле TextBox3 выводится строка Rez. В строке Rez записана матрица. Численные значения элементов матрицы преобразованы в строку с помощью функции STR. Константа vbTab обеспечивает расстояние в 7 пробелов между элементами массива при выводе. Константа vbCrLf — перевод положения курсора на новую строку.

Пример 2.

Условие задачи: Рассчитать суммы элементов строк матрицы. Результат представить в виде одномерного массива.

Дано: n — количество строк матрицы. m — количество столбцов матрицы. [B] — матрица с элементами bij, где i изменяется от 1 до n, j изменяется от 1 до m. Найти: Sumi =

Фрагмент схемы:

Фрагмент программы:

Расчет суммы строк одномерного массива

For I = 1 To n

Sum(i) =0

For j=1 To m

Sum(i) = Sum(i) + a(i,j)

Next j

Next i

Rez = “”

For i:= 1 To n

Rez = Rez + Str(Sum(i))+vbTab

TextBox3.Text = Rez

Сумма каждой строки матрицы должна храниться в соответствующем элементе одномерного массива. Так, сумма 1-ой строки должна храниться в первом элементе Sum1, сумма 2-ой строки в элементе Sum2 и так далее. Цикл по i определяет номер элемента одномерного массива Sum и номер строки матрицы А. Индекс j определяет номер строки матрицы. В цикле по j накапливается сумма элементов соответствующей строки матрицы.

На поиск в массиве элемента, с заданными значениями индексов, затрачивается время. Адрес i-го элемента определяется прибавлением к адресу начала массива значения i. Поэтому для повышения эффективности лучше использовать вспомогательную переменную S при суммировании, что исключает многократное обращение к элементам массива Sum.

For I = 1 To n

S =0

For j=1 To m

S = S + a(i,j)

Next j

Sum(i) = S

Next i

Пример 3.

Условие задачи:

Дана матрица размером N на M. Поменять местами четные и нечетные столбцы матрицы.

Схемы ввода и вывода матрицы приведены в предыдущих примерах. Схема алгоритма перестановки столбцов в соответствие с условием задачи:

Фрагмент программы:

‘ ***Перестановка столбцов ***

For i=1 To n ‘Цикл по строкам

‘Цикл по столбцам.

Перебираем только четные столбцы.

For j =2 To m Step 2

Перестановка четного и нечетного элементов

Z = D(i, j – 1) : D(i, j – 1) = D(i, j) : D(i, j) = Z

Next j

Next i

Для перестановки элементов четных и нечетных столбцов организован цикл с шагом 2. Перебираются только четные столбцы (со второго по последний с шагом 2). Нечетный столбец определен как J – 1. Во избежание потери информации вводится вспомогательная переменная Z, которая является буфером для хранения значения элемента нечетного столбца.

Пример 4.

Условие задачи: написать программу удаления строки из матрицы.

Удалить k-ую строку матрицы можно, сдвинув строки, следующие за k-ой строкой на одну позицию вверх.

Фрагмент схемы:

Фрагмент программы:

For I = k To n – 1

For j = 1 To m

a( i, j ) = a (i + 1, j)

Next j

Next i

Все строки, начиная с (k+1)-й, нужно переместить вверх. Цикл по строкам начинается с k-ой строки. Все элементы k-ой строки заменяются на k + 1 строку. Число строк уменьшается на единицу.

Пример 5.

Условие задачи:

Написать программу включения строки в матрицу. Включаемая строка задана как вектор.

В этой задаче задана матрица размером N на M и вектор, состоящий из M элементов. Задано k — номер новой строки.

Фрагмент схемы алгоритма:

Фрагмент программы:

For i = n To k Step -1

For j = 1 To m

‘с n –ой по k –ую строки передвинули вниз

a(i + 1, j) = a(i, j)

Next j

Next i

n = n+1

For j = 1 To m

На место k –ой строки матрицы записали вектор

a(k, j) = c(j)

Next j

Матрица [A] будет увеличена на одну строку, поэтому в описании переменной [A] максимальный размер строк должен быть увеличен на единицу.

Два первых цикла организуют перемещение строк матрицы вниз на одну строку.

В цикле по строкам параметр цикла изменяется с шагом –1. Начиная с n-ой строки и до k-ой, все строки смещаются вниз, оставляя k-ую строку свободной для элементов вектора С. Перемещение одной строки связано с пересылкой всех элементов этой строки, что требует организации цикла по номеру столбца. Отдельно организован цикл для записи элементов вектора С на место k-ой строки матрицы [A]. В цикле по j элементам Akj присваивается значение Cj