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.


 

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

66459. Анализ эффективности управления кредитными операциями коммерческого банка (на примере АБ Капитал) 772 KB
  Анализ эффективности управления кредитными операциями коммерческого банка на примере АБ Капитал Поэтому перед российскими коммерческими банками при увеличении конкурентной борьбы за потенциальных заемщиков возникла необходимость планирования своей кредитной деятельности.
66461. Структурно-семантичні та прагматичні особливості парантезу в оповіданнях У.Фолкнера 209 KB
  Робоча гіпотеза, яка висувається в дослідженні полягає в тому, що експресивна функція парантетичних внесень, експресивний характер є результатом нашарування текстових характеристик на статичну природу речення. Тому парантези — це не тільки, навіть не стільки належність речення, скільки належність тексту.
66462. Розробка рекомендацій щодо підвищення дохідності КБ «Фінанси та кредит» 5.49 MB
  Метою нашої роботи є вивчення і аналіз роботи по проведенню валютно-розрахункових операцій на прикладі КБ Фінанси та кредит здійснення розрахунків по експортно-імпортних операціях залучення клієнтів та збільшення прибутків банку. Національна мережа банківського обслуговування банку...
66463. Шляхи покращення банківського кредитування фізичних осіб 713.5 KB
  Об'єктивні відхилення фактичної потреби господарюючих суб'єктів у фінансуванні їх господарської діяльності від наявності (надлишку або нестачі) вільних ресурсів залежать від багатьох факторів, серед яких: капіталомісткість виробничої діяльності; сезонність виробництва...
66465. Повышение эффективности базового обучения информатике за счет предоставления её теоретических образующих 1.19 MB
  Соответствующая программная среда позволила вести разработки так называемых интеллектуальных обучающих систем (ИОС). Если традиционные АУК считаются порождением бихевиористической теории обучения, то ИОС связывают с более глубокими психологическими теориями...
66466. Ефективність інфузійної терапії при дегідратації у собак в умовах приватної ветеринарної клініки «Доктор - Вет» м. Дніпропетровська» 3.86 MB
  Дослідити клінічний статус та визначити найбільш інформативні морфологічні показники крові собак за дегідратації; експериментально обґрунтувати ефективні схеми використання комбінованої інфузійної терапії у собак за дегідратації;
66467. Проблематика и система образов романа «Между двух зорь» сквозь призму исторических событий и религиозно-философской мысли России конца XIX – начала XX веков 429 KB
  Прозаик поэт драматург переводчик литературовед всё это соединилось в Иване Алексеевиче Новикове 1877-1959. Новиков оставил большое творческое наследие которое к сожалению было предано забвению но в последние годы оно начинает открываться заново. Перед нами же встала проблема не столько второстепенности...