Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика VBA.pdf
Скачиваний:
891
Добавлен:
27.03.2016
Размер:
1.1 Mб
Скачать

. . .

Buf = –1.e10 ' начальное значение буферной переменной

For i=1 To n ' цикл поиска максимального отрицательного элемента

If D(i) < 0 AND Buf < D(i) Then Buf = D(i)

Ind = i

End If

Next ' Конец цикла For

'анализ результата и его вывод

If Buf = -1.E10 THEN

'Если значение буферной переменной не изменилось - в массиве

'нет отрицательных чисел

MsgBox " В массиве нет отрицательных чисел"

ELSE

' значение буферной переменной изменилось

MsgBox "Максимальный отрицательный элемент D(" _

&Ind & ")=" & Buf

End If ' конец оператора If Buf = -1.E10 Then

. . . ' продолжение программы

5.3 Программирование обработки двумерных массивов

Двумерные массивы обозначаются переменными с двумя индексами и используются для представления матриц. Например, массив А(3,5) можно представить в виде таблицы:

А(1,1) А(1,2) А(1,3) А(1,4) А(1,5)

А(2,1) А(2,2) А(2,3) А(2,4) А(2,5)

А(3,1) А(3,2) А(3,3) А(3,4) А(3,5)

Первый индекс в обозначении элемента массива является номером строки, а второй - номером столбца матрицы.

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

80

Dim MAMI(4,6), A2(4,-3 To 3), B_matr(3 To 7, 6)

определяет три двумерных массива, содержащих по 35 элементов в каждом и имеющих 5 строк и 7 столбцов. Для массива MAMI номера строк должны изменяться в диапазоне от 0 до 4, столбцов - в диапазоне от 0 до 6. Для массива A2 номера строк изменяются в том же диапазоне, а номера столбцов должны изменяться в диапазоне от-3 до 3. В матрице B_matr номера строк должны быть от 3 до 7, а столбцов от 0 до 6.

Расположение многомерных массивов в памяти ЭВМ в стандарте языка VBA не оговариваются.

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

' схема обработки массива

' схема обработки массива

' по строкам

' по столбцам

For i=1 To N ' внешний цикл

For j=1 To M

For j=1 To M ' внутренний цикл

For i=1 To N

' обработка элемента А(i,j)

'обработка элемента А(i,j)

Next 'конец внутреннего цикла j

Next ' внутр. цикл i

Next 'конец внешнего цикла i

Next ' внешний цикл j

При написании операторов Next для наглядности можно дописать имена индексов соответствующего цикла. Однако, если их перепутать, то при выполнении программы будет выдано сообщение об ошибке.

81

Схема обработки по строкам заключается в следующем. Сначала индексы i и j получают значение единицы и происходит обработка элемента А(1,1). После этого индекс j увеличивается на единицу, а индекс i остается прежним. В результате происходит последовательная обработка элементов 1-ой строки: А(1,2), А(1,3), А(1,4), ... , А(1,M). После завершения внутреннего цикла увеличивается значение переменной i, и при выполнении цикла по индексу j осуществляется обработка 2-ой строки матрицы и т.д. Аналогичный процесс происходит при обработке по столбцам, только здесь изменяется индекс i при фиксированном номере столбца j.

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

Пример 5.8. Написать фрагмент программы для определения сумм элементов каждого столбца матрицы М(5,7) и записи полученных значений в одномерный массив. Исходная матрица расположена на активном листе таблицы Excel. Полученный массив с суммами столбцов поместить в восьмую строку этой же таблицы.

В этой программе следует использовать схему обработки двумерного массива по столбцам. Сумма элементов каждого столбца формируется в переменной S и записывается в одномерный массив Summa, содержащий 7 элементов.

Option Explicit ' запрет на использование необъявленных переменных

Sub Пример_5_8()

Dim Mas(4, 6) As Single

Dim Summa(6) As Single, S As Single Dim i As Integer, j As Integer

' ввод массива из таблицы Excel по строкам

82

For i = 1 To 5 For j = 1 To 7

Mas(i - 1, j - 1) = Cells(i, j)

Next Next

For j = 0 To 6 ' внешний цикл по столбцам

S = 0 ' подготовка переменной для накапливания суммы For i = 0 To 4 ' внутренний цикл по строкам

S = S + Mas(i, j) ' вычисление суммы j-го столбца Next ' конец внутреннего цикла по параметру i

Summa(j) = S ' запись суммы столбца в одномерный массив Next ' конец внешнего цикла по параметру j

Cells(7, 1) = "Сумма элементов по столбцам"

For i = 1 To 7

Cells(8,i)=Summa(i-1) 'запись массива Summa в 8-ю строку таблицы

Next End Sub

Тестовые данные и результат отладки программы показаны на рисунке 5.3.

Рисунок 5.3 - Данные и результат отладки программы «Пример_5_8»

Пример 5.9. Написать фрагмент программы транспонирования массива T размером N×N.

83

For i=1 To N–1 For j=i+1 To N

' перестановка элементов T(i,j) и T(j,i)

R = T(i, j) T(i, j)=T(j, i) T(j, i)=R

Next Next

Этот фрагмент программы переставляет местами строки и столбцы матрицы с одинаковыми номерами. При такой перестановке элементы T(i,j) и T(j,i) должны поменяться местами, например, Т(1,3) должен занять место Т(3,1) и наоборот. Перестановка элементов строки и столбца массива с одинаковыми номерами осуществляется во внутреннем цикле, а во внешнем цикле обеспечивается переход к следующей строке. Так как начальное значение параметра внутреннего цикла j равно i+1, перестановка элементов новой строки начинается не с первого элемента строки, а с элемента T(i,i+1) и продолжается от этого элемента вправо по строке. Элементы строки, расположенные левее главной диагонали, уже переставлены.

Для перестановки двух элементов местами целесообразно ввести дополнительную переменную соответствующего типа, а саму перестановку осуществлять по следующей схеме:

1-й шаг - значение первого элемента присваивается рабочей переменной (например «R»);

2-ой шаг - значение второго элемента записывается в первый элемент (при этом старое значение первого элемента пропадает, поэтому оно предварительно было сохранено в рабочей переменной);

3-ий шаг - старое значение первого элемента из рабочей переменной R записывается во второй элемент.

84

Пример 5.10. Написать фрагмент программы формирования единичной матрицы размером 5×5.

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

'Фрагмент программы формирования единичной матрицы

'E(i,j)=1, если i=j и E(i,j)=0, если i не равно j

For i=1 To 5 For j=1 To 5

E( i, j )=0. ' записываем в строку i нули

Next

E(i,i)=1. ' записываем в элемент главной диагонали единицу

Next

Пример 5.11. Написать программу перестановки минимального положительного и максимального отрицательного элементов матрицы размером 6×5. Исходные данные прочитать из текстового файла, а полученную матрицу вывести в другой текстовый файл.

Option Explicit ' запрет на использование в программе ' необъявленных переменных

Sub Пример_5_11()

Dim Mas(5, 4) As Single

Dim Min_E As Single ' минимальное положительное число в массиве

Dim i_Min As Integer, j_Min As Integer ' его индексы

Dim Max_E As Single ' максимальное отрицательное число в массиве

Dim i_Max As Integer, j_Max As Integer ' его индексы Dim i As Integer, j As Integer ' рабочие переменные

' ввод массива из файла

Open "dat2.txt" For Input As #1 ' открываем файл для ввода Open "res2.txt" For Output As #2 ' открываем файл для вывода

Print #2, "Исходная матрица Mas(6,5)"

For i = 0 To 5 For j = 0 To 4

85

If EOF(1) = True Then

' вывод сообщения об ошибке в диалоговое окно Excel и файл вывода

MsgBox "В файле ""dat2.txt"" мало данных: i=" & i & ", j=" & j

Print #2, Chr(13), "Вфайле""dat2.txt"" малоданных: i="; i; ", j="; j

GoTo 99

End If

Input #1, Mas(i, j) ' считываем из файла очередной элемент Print #2, Mas(i, j), ' выводим очередной элемент в файл,

' но не закрываем строку

Next j

Print #2, Chr(13) ' заканчиваем вывод строки матрицы

Next i

' поиск индексов мин. полож. и макс. отрицательного элементов Min_E = 10000000000# ' задаем начальное значение +1.е10 Max_E = -10000000000# ' задаем начальное значение -1.е10

For i = 0 To 5 ' внешний цикл по строкам For j = 0 To 4 ' внутренний цикл по столбцам

If Mas(i, j) > 0 And Mas(i, j) < Min_E Then Min_E = Mas(i, j)

i_Min = i: j_Min = j ' запоминаем индекс миним. полож. числа

End If

If Mas(i, j) < 0 And Mas(i, j) > Max_E Then Max_E = Mas(i, j)

i_Max = i: j_Max = j ' запоминаем индекс макс. отриц. числа

End If

Next j ' конец внутреннего цикла по параметру j Next i ' конец внешнего цикла по параметру i

' проверка

If Min_E = 10000000000# Or Max_E = -10000000000# Then

' нужных чисел нет

If Min_E = 10000000000# Then ' нет положительных чисел

MsgBox "В массиве нет положительных чисел" Print #2, "В массиве нет положительных чисел"

End If ' конец If Min_E = +1e10

If Max_E = -10000000000# Then ' нет отрицательных чисел

MsgBox "В массиве нет отрицательных чисел" Print #2, "В массиве нет отрицательных чисел"

End If ' конец If Max_E = -1e10

Else

86

' в массиве есть положительные и отрицательные числа

Print #2, "Минимальное положительное число Mas("; i_Min + 1;_ ","; j_Min + 1; ")="; Min_E

Print #2, "Максимальное отрицательное число Mas("; i_Max + 1;_ ","; j_Max + 1; ")="; Max_E

Mas(i_Min, j_Min) = Max_E ' меняем элементы местами Mas(i_Max, j_Max) = Min_E

' выводим полученную матрицу

Print #2, "Получення матрица Mas(6,5)"

For i = 0 To 5 For j = 0 To 4

Print #2, Mas(i, j), ' выводим очередной элемент в файл, ' но не закрываем строку

Next

Print #2, Chr(13) 'заканчиваем вывод очередной строки матрицы

Next i

End If ' конец оператора If Min_E = 1.t10 Or Max_E = -1.10

' метка "99" - аварийное завершение программы, если в файле

"dat2.txt" мало данных

99: Close ' закрываем все открытые файлы

End Sub

Для данных, представленных на рисунке 5.4, программой будет получен файл, показанный на рисунке 5.5.

1.1

1.2

1.3

1.4

1.5

2

0.5

2.3

-2.4

2.5

-3

-13

-0.5

3.4

 

3

4.1-4.2 4.3 -4.4 4.5

0.51 0.52 -0.53 0

4.9

0.610 -0.63 0.64 1.1

Рисунок 5.4 - Пример тестовых данных для отладки программы …..

87

Исходная

матрица

Mas(6,5)

 

1,1

1,2

1,3

1,4

1,5

2

0,5

2,3

-2,4

2,5

-3

-13

-0,5

3,4

3

4,1

-4,2

4,3

-4,4

4,5

0,51

0,52

-0,53

0

4,9

0,61

0

-0,63

0,64

1,1

Минимальное положительное число Mas( 2 , 2 )= 0,5 Максимальное отрицательное число Mas( 3 , 3 )=-0,5

Получення матрица Mas(6,5)

 

1,1

1,2

1,3

1,4

1,5

2

-0,5

2,3

-2,4

2,5

-3

-13

0,5

3,4

3

4,1

-4,2

4,3

-4,4

4,5

0,51

0,52

-0,53

0

4,9

0,61

0

-0,63

0,64

1,1

Рисунок 5.5 - Текст файла «dat2.txt»

В текст файла «dat2.txt» элементы, которые меняются местами, выделены жирным шрифтом. В данной программе для этой операции используются два оператора, но она может быть оформлена и «классическим» способом тремя операторами

R

= Mas(i_Min, j_Min)

Mas(i_Min, j_Min) = Mas(i_Max, j_Max)

Mas(i_Max, j_Max) =

R

88

6Задания к лабораторным и расчетно-графическим работам

Вданном разделе приведены основные правила оформления и базовые задания к лабораторным и расчетно-графическим работам. В задания могут быть внесены изменения, поэтому студентам рекомендуется действующие варианты заданий скачивать с сайта кафедры. При этом следует учитывать свою специальность. Из-за различий в учебных планах разных специальностей задания могут отличаться. В базовой версии заданий, приведенных в пособии, различия по специальностям не учитываются.

Лабораторные работы выполняются на компьютере без текстового оформления. Результаты выполненной работы показываются преподавателю.

Расчетно-графические работы оформляются на листах писчей бумаги формата А4 (можно в клеточку или линованной). Текст пишется с одной стороны листа. На первом листе указывается номер расчетно-графической работы, ее название, фамилия студента с указанием группы и номера варианта работы.

Далее записывается краткий конспект по работе – 2-3 страницы рукописного текста с определением основных понятий данной работы. После конспекта записывается условие задания, тестовые данные для отладки программы и текст программы на языке VBA.

Ккаждой работе прикладывается копия первого листа соответствующей лабораторной работы с заполненными полями: фамилия студента и дата выполнения работы. Первый лист лабораторной работы следует скопировать с сайта кафедры.

Вконспект первой работы рекомендуется включить:

-правила записи констант и переменных на VBA;

-типы переменных VBA;

-старшинство арифметических операций;

89