8315

Сложение элементов столбцов матрицы и нормирование вектора

Практическая работа

Информатика, кибернетика и программирование

Сложение элементов столбцов матрицы и нормирование вектора Часть 1. Сложение элементов в столбцах матрицы. Задача 1: Просуммировать элементы столбцов заданной матрицы размером mхn. Результат получить в одномерном массиве размером n Задача была выпол...

Русский

2013-02-09

215.5 KB

13 чел.

Сложение элементов столбцов матрицы и нормирование вектора

Часть 1. Сложение элементов в столбцах матрицы.

Задача 1: Просуммировать элементы столбцов заданной матрицы размером mхn. Результат получить в одномерном массиве размером n

Задача была выполнена с помощью следующей программы написанной на языке VBA.

Программа 1:

Option Explicit

Sub StolbElementSum()

   'должны быть заданы две соседние ячейки ,

   'в которые вводится размерность матрицы

   'текущей ячейкой должна быть ячейка с текстом  "m= "

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

   

   'вычисление m

   Dim r, m&, n&

   Dim str As String

   str = ActiveCell.Value

   r = Left(str, 1)

   If Not (r = "m") Then   'необходимо. чтобы ячейка "m="

                           'была активной

       MsgBox "выделите ячейку m= или введите в пустую ячейку"

       Exit Sub

       End If

   r = Right(str, 2)

   r = IIf(IsNumeric(Left(r, 1)), r, Right(r, 1))

   m = IIf(IsNumeric(r), CInt(r), 0)

   

   

   'запомним координаты ячейки с текстом "m= "

   'в переменных Row0 и Col0

   Dim Row0&, Col0&

   Row0 = CInt(ActiveCell.Row)

   Col0 = CInt(ActiveCell.Column)

   

   'вычислим n

   str = CStr(Cells(Row0, Col0 + 1).Value)

   r = Right(str, 2)

   If Len(r) = 0 Then

       MsgBox "Введите  n !" 'ячейка не должна быть пустой

       Exit Sub

   End If

   r = IIf(IsNumeric(Left(r, 1)), r, Right(r, 1))

   n = IIf(IsNumeric(r), CInt(r), 0)

   'исключаем недопустимые значения m и n"

   If m = 0 Or n = 0 Then

       MsgBox "m и n не равны 0"

       Exit Sub

   End If

   'задаём строку и столбец с номерами

   Dim rng As Range

   Dim rng2 As Range

   

   

   Set rng = Cells(Row0 + 1, 1)

   rng.Activate

   Set rng = Range(rng, rng.SpecialCells(xlLastCell))

   rng.ClearContents

   rng.Delete

  

   'записываем в столбец числа 1,...,m

   Dim Rw&, Cl&    ' Rw, Cl - текущие значения Row, Column

   Rw = Row0 + 3

   Cl = Col0 - 1

   Set rng = Range(Cells(Rw, Cl), Cells(Rw + m - 1, Cl))

   rng.Interior.Color = RGB(20, 220, 220)

   'Заполнение значениями 1...m

   Dim i&, rn As Range

   i = 1

   For Each rn In rng

       rn.Cells.Value = i

       i = i + 1

   Next rn

   

   'записываем в строчку числа 1,...,n

   Rw = Row0 + 2

   Cl = Col0

   Set rng = Range(Cells(Rw, Cl), Cells(Rw, Cl + n - 1))

   rng.Interior.Color = RGB(20, 220, 220)

   i = 1

   For Each rn In rng

       rn.Cells.Value = i

       i = i + 1

   Next rn

   

   'Заполняем матрицу произвольными числами

   Rw = Row0 + 3

   Cl = Col0

   Set rng = Range(Cells(Rw, Cl), _

                   Cells(Rw + m - 1, Cl + n - 1))

   Dim j&

   Randomize

   For i = 1 To m

       For j = 1 To n

           rng.Cells(i, j) = Int((10 * Rnd) + 1)

       Next j

   Next i

   Cells(Row0, Col0).Activate

   

   'Считаем сумму элементов в строках

   Rw = Row0 + 3

   Cl = Col0

   'обозначим массив из сумм элементов столбцов

   Set rng2 = Range(Cells(Rw + m + 2, Cl), Cells(Rw + m + 2, Cl + n - 1))

   

   Dim s&

   s = 0

   For j = 1 To n

       For i = 1 To m

           s = s + rng.Cells(i, j)

       Next i

       rng2.Cells(j) = s

       s = 0

   Next j

   rng2.Interior.Color = RGB(256, 256, 20) 'выделяем цветом массив с результатом

   Dim sum As Range

   Set sum = Cells(Rw + m + 2, Cl - 1)

   sum = "суммы элементов в столбцах"

   sum.Interior.Color = RGB(256, 206, 56)

   

   sum.Select                           'форматируем ячейку

   With Selection                       'задаём горизонтальное выравнивание

        .HorizontalAlignment = xlGeneral 'по ширине

       .VerticalAlignment = xlDistributed 'вертикальное выравнивание-

       .WrapText = False                   'распределённый

       .Orientation = 0

       .AddIndent = False

       .IndentLevel = 0

       .ShrinkToFit = False

       .ReadingOrder = xlContext

       .MergeCells = False

   End With

End Sub

  

Для запуска данной программы создадим специальную кнопку на рабочем листе. Для этого зайдём в меню: вид  – панели инструментов – элементы управления – кнопка. Создадим кнопку нужного размера с надписью:

«Создать матрицу и посчитать сумму элементов в столбцах».

Для того чтобы при нажатии на кнопку выполнялась наша программа на листе 1 в редакторе visual basic введём следующий код:

Option Explicit

Private Sub CommandButton1_Click ()

   Call StolbElementSum

End Sub

Пример 1: ( См. Рисунок 1)

1. Откроем приложение Microsoft Office Excel.

2.На рабочем листе  «лист 1» введём значение «m=10» в ячейку C2 и «n=10» в ячейку D2.

3.Выделим ячейку С2 и нажмём на кнопку

4.Получим случайно сгенерированную матрицу заданной размерности

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

5.Резултаты вычисления верны. Программа работает.

Примечания:

  •  Если в матрице одна строка, то она и будет результатом вычисления
  •  Если при нажатии на кнопку ячейка с текстом «m=10» не выделена, то пользователь будет уведомлён в специальном окне о необходимости выделить ячейку.(см. Рисунок 3)
  •  Если пользователь введёт значения m или n равные 0, то будет уведомлён о необходимости исправить ошибку.(см. рисунок 2)
  •  Если пользователь ввёл m, но не ввёл n, то он будет уведомлён.
  •  Размерность матрицы можно ввести в любые 2 соседние ячейки на любом листе. Программа всё равно будет работать.

Рисунок 1.

Рисунок 2.

Рисунок 3.

Часть 2. Нормирование вектора.

Задача 2: Нормировать вектор   и найти его длину. Формула

Задача выполнена с помощью следующей программы написанной на VBA.

Программа 2.

Option Explicit

Sub norm()

   'Ячейка "n=" должна быть активной

   'вычисление n

   Dim r, n&

   Dim str As String

   str = ActiveCell.Value

   r = Left(str, 1)

   If Not (r = "n") Then

       MsgBox "выделите ячейку n="

       Exit Sub

   End If

   If Len(r) = 0 Then

       MsgBox "введите размерность вектора"

       Exit Sub

   End If

   r = Right(str, 2)

   r = IIf(IsNumeric(Left(r, 1)), r, Right(r, 1))

   n = IIf(IsNumeric(r), CInt(r), 0)

   

   'запомним координаты ячейки с текстом "n= "

   'в переменных Row0 и Col0

   Dim Row0&, Col0&

   Row0 = CInt(ActiveCell.Row)

   Col0 = CInt(ActiveCell.Column)

   

   If n = 0 Then

       MsgBox "размерность не равна 0"

       Exit Sub

   End If

   

   Dim VEc As Range 'задаём вектор VEC

   

   Set VEc = Cells(Row0 + 1, 1)

   VEc.Activate

   Set VEc = Range(VEc, VEc.SpecialCells(xlLastCell))

   VEc.ClearContents

   VEc.Delete

   

   'Заполняем матрицу произвольными числами

   Rw = Row0 + 3

   Cl = Col0

   Set VEc = Range(Cells(Rw, Cl), _

                   Cells(Rw, Cl + n - 1))

   

   Randomize

   'Чтобы координаты могли быть отрицательными умножаем на -1 в

   'случайной степени

       For i = 1 To n

           VEc.Cells(i) = Int((10 * Rnd) + 0) * (-1) ^ (Int((2 * Rnd) + 0))

       Next i

   VEc.Interior.Color = RGB(234, 234, 56)

   Cells(Row0, Col0).Activate

   

   Dim D          'переменная обозначающая длину вектора

   D = 0           '(сумма квадратов координат)

   For i = 1 To n

   D = D + VEc.Cells(i) ^ 2

   Next i

   

   Dim nVEC As Range     'задаём массив для нормированного вектора

   Set nVEC = Range(Cells(Rw + 2, Cl), _

                   Cells(Rw + 2, Cl + n - 1))

   'нормируем

   For i = 1 To n

   nVEC.Cells(i) = VEc.Cells(i) / D

   Next i

   nVEC.Interior.Color = RGB(11, 200, 11)

   Cells(Row0, Col0).Activate

   End Sub

Для того чтобы пользователю было удобно работать с макросом создадим специальную кнопку с надписью «Создать вектор и нормировать его». Создадим и отформатируем кнопку, как мы это делали при выполнении Задачи  1. На листе 1 в редакторе VBA введём следующий код:

Private Sub CommandButton1_Click()

 Call norm

End Sub

Таким образом мы связали кнопку и наш макрос.

Проверим программу на следующем примере.

Пример 2.: (см. рисунок 4)

1. Откроем приложение Microsoft Office Excel

2.На рабочем листе  «лист 1» введём значение «m=7» в ячейку C3

3.Выделим ячейку С3 и нажмём на кнопку

4.Получим случайно сгенерированный вектор размерности  7(выделен жёлтым)  и нормированный  вектор

5.Резултаты вычисления верны. Программа работает.

Примечания:

  •  Если при нажатии на кнопку ячейка с текстом «n=7» не выделена, то пользователь будет уведомлён в специальном окне о необходимости выделить ячейку (см. рисунок 5)
  •  Если пользователь введёт значения n равное 0, то будет уведомлён о необходимости исправить ошибку.(см рисунок 6)
  •  Размерность вектора можно ввести в любую ячейку на любом листе. Программа всё равно будет работать.

Рисунок 4.

Рисунок 5.

Рисунок 6.


 

А также другие работы, которые могут Вас заинтересовать

70146. Одноэтажное промышленное здание. Проект центра сервисного обслуживания автомобилей LADA в городе Новосибирске 61.5 KB
  Проект - одноэтажное промышленное здание выполняется на 2-х листах формата А1. Помимо этого к проекту прилагается пояснительная записка. Схема промышленного здания выдаётся преподавателем, а также задаются основные размеры...
70147. Расчет и выбор посадок с зазором, с натягом, колец подшипников качения 989.5 KB
  Взаимозаменяемостью издедий (машин, приборов, механизмов и т.д.), их частей или других видов продукции (сырья, материалов, полуфабрикатов и т.д.) называют их свойство равноценно заменять при использовании любой из множества экземпляров изделий, их частей или иной продукции...
70149. Отопление и вентиляция жилого четырехэтажного здания 143.02 KB
  Система отопления Выбор системы отопления и типа нагревательных приборов; Тепловой расчет стояка; Гидравлический расчет системы отопления; Расчет элеваторной установки; Расчет нагревательных приборов; Вентиляция Нормы вытяжки воздуха...
70150. Отопление и вентиляция жилого четырёхэтажного здания (жилого дома) 336.12 KB
  Назначение здания - жилой дом. СНиП- 23-02-03 «Тепловая защита зданий» СНиП- 23-01-99 «Строительная климатология» Район постройки г.Татарск Число этажей- 4 Температура воздуха наиболее холодной пятидневки, обеспеченностью 0,92 t= - 39 Температура наиболее холодных суток, обеспеченностью 0,92 t= - 41...
70151. Отопление и вентиляция жилого четырехэтажного здания в г. Минусинск 1.05 MB
  Район постройки г. Минусинск Число этажей- 4 Расчетная температура наружного воздуха обеспеченностью 0,92 t=-42 Температура холодных суток t=-43 Температура среднего отопительного периода t=-9,5 Средняя скорость ветра за январь...
70152. Деревянный каркас одноэтажного производственного здания 771.5 KB
  Ограждающей конструкцией покрытия является утеплённая клеефанерная плита с одной верхней обшивкой. Размер панели в плане 1518-4180 мм. Обшивка плиты выполнена из фанеры клееной повышенной водостойкости марки ФСФ ГОСТ 3916.2-96, порода древесины шпона фанеры – лиственница.