Пример 2
Лекция 12
Усложним условие примера, рассмотренного на предыдущей лекции. Заданы те же два одномерных массива. Требуется центрировать и вывести массив, у которого меньше среднее значение элементов, величина которых больше h. Новое условие полностью выглядит так:
Заданы два одномерных массива a(1), a(2), … , a(k) и b(1), b(2), … , b(l). Центрировать и вывести массив а, если среднее значение его элементов, имеющих значение больше h, меньше среднего значения элементов массива b, имеющих значение больше h. В противном случае центрировать и вывести массив b. Каждый элемент центрированного массива получается как разность значения соответствующего элемента исходного массива и среднего значения его элементов, имеющих значение больше h.
Изменения в перечне подзадач.
Изменения коснуться только подзадачи вычисления для одномерного массива x, имеющего imax элементов, среднего значения тех его элементов, значение которых больше h. Применим функцию: Function Среднее (x() As Single, imax As Integer, _ h As Single, Сигнал As Boolean) As Single
Новшество состоит в том, что если не окажется ни одного элемента массива x, значение которого больше h, то среднего вообще не существует. Обращение к функции Среднее может привести к двум ситуациям:
а) среднее значение существует (при этом аргумент Сигнал должен получить значение True.
б) среднее значение не существует (при этом аргумент Сигнал должен получить значение False).
Изменению подлежат только текст процедуры Command1_Click и функции Среднее.
Блок-схема алгоритма функции Среднее
![]() |
Рис. 12.1. Блок-схема алгоритма вычисления среднего значения вектора |
Изменения в основном алгоритме
![]() |
Рис. 12.2. Блок-схема измененного участка основного алгоритма |
Здесь sa и sb – переменные типа Boolean вычисляются при обращениях к функции Среднее для вектора a и b соответственно. Их значение говорит о том, существует или не существует среднее значение для соответствующего вектора.
Исходный текст программы
Option Explicit
Option Base 1
Private Sub Command1_Click()
Dim k As Integer, l As Integer, h As Single
Dim a() As Single, b() As Single
Cls
k = InputBox("k=?")
l = InputBox("l=?")
h = InputBox("h=?")
Print "k= "; k; " l= "; l; " h= "; h
ReDim a(k), b(l)
Print "Ввод вектора а"
Ввод_вектора a
Print "Ввод вектора b"
Ввод_вектора b
Dim СреднееА As Single, СреднееВ As Single
Dim sa As Boolean, sb As Boolean
СреднееА = Среднее(a, k, h, sa)
СреднееВ = Среднее(b, l, h, sb)
If sa And sb Then
If СреднееА < СреднееВ Then
ЦентрированиеВектора a, k, СреднееА
Print "Центрированный вектор а"
Вывод_вектора a
Else
ЦентрированиеВектора b, l, СреднееВ
Print "Центрированный вектор b"
Вывод_вектора b
End If
Else
Print "Решения нет "
End If
End Sub
Private Sub Ввод_вектора(x() As Single)
1: Dim i As Integer
Dim i_min As Integer
Dim i_max As Integer
i_min = LBound(x)
5: i_max = UBound(x)
For i = i_min To i_max
x(i) = InputBox("Элемент вектора (" _
& i & ")=?",”Ввод вектора”)
Print x(i),
Next
End Sub
Private Function Среднее(x() As Single, imax As _
Integer, h As Single, Сигнал As Boolean) As Single
Dim sum As Single, kol As Integer, i As Integer
sum = 0
kol = 0
For i = 1 To imax
If x(i) > h Then
sum = sum + x(i)
kol = kol + 1
End If
Next
If kol <> 0 Then
Среднее = sum / kol
Сигнал = True
Else
Сигнал = False
End If
End Function
Private Sub ЦентрированиеВектора(x() As Single, _
imax As Integer, Вычитаемое As Single)
Dim i As Integer
For i = 1 To imax
x(i) = x(i) - Вычитаемое
Next
End Sub
Private Sub Вывод_вектора(x() As Single)
1: Dim i As Integer
Dim i_min As Integer
Dim i_max As Integer
i_min = LBound(x, 1)
5: i_max = UBound(x, 1)
For i = i_min To i_max
Print x(i),
Next
End Sub