Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теоретические и практические вопросы дисциплины «Информатика». Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
121
Анализ задачи:
,
n
x
n
.
11
1
1
n
xx
n
x
a
nn
n
,
)1(
1
nn
nxx
a
n
n
.
)1(1
n
nx
aa
nn
;aan
11aan
.
)1(1
n
nx
aa
.
22
1
2
xx
xa
2
2
x
В данной задаче задан знакопеременный ряд. В принципе нетрудно составить программу, в которой каждый член ряда будет вычисляться отдельно. Однако такой способ вычисления рядов считается неэффективным, хотя в ряде случаев используется. Использование рекуррентной формулы, связывающей последующий член ряда с предыдущим, позволяет разработать более эффективную программу.
Для вычисления членов ряда выведем рекуррентную формулу, связывающую последующий член ряда (a
) с предыдущим (аn). Знак
n+1
каждого члена ряда будем менять в самой программе.
Пусть: a
n
=
тогда
Умножим числитель и знаменатель последней дроби на n, тогда
в результате получим
Для удобства составления программы заменим индексные переменные простыми переменными:
рекуррентная формула имеет следующий вид:
,
тогда
Таким образом, получена рекуррентная формула, связывающая каждый последующий член ряда (а1) с предыдущим членом (а).
Подберем значения a и n, для которых возможно вычисление очередного члена ряда. Первый член ряда вычислять не будем, т.к. он задан. Вычислим второй член ряда по рекуррентной формуле, задав
a=x, n=1:
Вычислим третий член ряда, задав a=
; n=2:
122
a1=
33
2
2
32
xxx
Public Sub Rjd_1 ()
1
' Программа для вычисления суммы ряда
2
'Название файла программы: RJD.xls
3
'Дата составления программы : 14.12.98
4
'Программист: Юнусов А.A.
5
Dim a1 As Single, y As Single
6
Dim x As Single, e As Single, a As Single
7
Dim n As Integer, k As Integer, s As Double
8
x = .5 : e=0.01
9
a = x : n = 1 : k = -1 : s = a
10
Do While abs( a) > e
11
a1 = a * x * n / (n + 1)
12
s = s + a1 * k ' накопление суммы ряда
13
n = n + 1 : k = -1 * k : a = a1
14
Loop
15
y= Log(1+x)
16
MsgBox "Сумма ряда равна"&s
17
MsgBox "Контрольная сумма ряда равна"&y
18
End Sub
19
1
- начало процедуры;
2-5
- шапка программы;
6
- описаны переменные a1 и y1, как переменные одинарной
Такая проверка рекуррентной формулы позволяет убедится, что она выведена верно. Вычисления следующих членов ряда можно выполнить аналогичным образом.
Для изменения знака члена ряда введем коэффициент k= - 1, знак которого будем менять в программе.
Для записи команды Option Explicit в модуль необходимо войти в меню VBA: Tools=>Options, на вкладке Editor Format установить галочку в окне Require Variable Declaration. В этом случае при создании модуля команда Option Explicit будет вставлена в модуль автоматически. Программа на VBA:
.
Обсуждение программы:
123
точности;
7-8
- описаны переменные, которые используются в программе:
переменные x, e, a, заданы одинарной точности; переменные n и k заданы как целые; переменная s задана двойной
точности;
9
- заданы значения переменных x и e;
10
- присваивание идентификаторам начальных значений: а=x
(первый член ряда); s=a (начальное значение суммы ряда); n=1. Коэффициент k задается отрицательным, т.к.
вычисляется второй член ряда;
11
- начало цикла Dо ... Lоор:
- открытие цикла с проверкой условия в начале цикла.
Условие проверяется перед выполнением цикла, и цикл будет выполняться до тех пор, пока проверяемое условие имеет значение True. Вначале проверяемое значение имеет значение True, т.к. Abs(a)>e, и поэтому управление будет передано в строку 12. Если проверяемое условие будет иметь значение False, то управление будет передано к строке 16, т.е. к оператору, расположенному за оператором Loop. В проверяемом условии необходимо использовать модуль, т.к. члены ряда могут быть отрицательными;
12
- вычисление очередного члена ряда по рекуррентной формуле;
13
- накопление суммы ряда. Первоначальное значение s равно
a, т.е. x. К этому значению прибавляется a1*k, и результат записывается в ячейку s;
14
- изменение параметров, что необходимо для вычисления
следующего члена ряда. Знак коэффициента k изменен на противоположный;
15
- конец цикла Loop;
16
- вычисление контрольной суммы ряда;
17
- вывод накопленной суммы ряда;
18
- вывод контрольной суммы ряда. Осуществляется
вычисление натурального логарифма и вывод полученного значения;
19
- конец процедуры.
124
После запуска программы на экран выводится:
Public Sub Rjd_2 ()
1
'Программа для вычисления суммы ряда
2
'Название файла программы: RJD2.xls
3
'Дата составления программы: 14.12.98
4
'Программист: студент КНИТУ Богданов Р.И.
5
' Реализация защиты от "дурака":
6
Do 7 x = Val(InputBox("Введите значение аргумента ", "Ввод х"))
8
If x < .5 OR x > 1.2 Then
9
MsgBox "Аргумент вне диапазона. Повторите ввод!"
10
End If
11
Loop Until x >= .5 And x <= 1.2
12
e = Val(InputBox("Введите точность вычислений ", "Ввод e"))
13
a1 = x : n = 1 : k = -1 : s = x
14
Do
15
a=a1
16
a1 = a * x * n / (n + 1)
17
s = s + a1 * k
18
n = n + 1: k = -1 * k
19
Loop Until Abs(Abs(a)-Abs(a1)) <= e
20
MsgBox"Вычисленная сумма ряда равна"s
21
Y=Log(1 + x)
22
Сумма ряда равна 4.07Е-01 Контрольная сумма ряда равна 4.05Е-01
Вычисленная сумма ряда и контрольная сумма практически
совпали, что свидетельствуют о правильной работе программы.
Задача 34. Вычислить сумму ряда (смотри условие предыдущей задачи) для произвольного значения аргумента, взятого из интервала
0.5<= x <= 1.2. Вычисление суммы ряда производить до тех пор, пока разность между двумя членами ряда по модулю не станет меньше заданной точности Е.
Вычислить функцию в левой части ряда, используя стандартную функцию VBA.
Защитить аргумент x от «дурака», т.е. от ввода значения, выходящего за указанный интервал.
Программная реализация на VBA:
125
MsgBox"Контрольная сумма ряда равна"y
23
End Sub
24
Обсуждение программы:
1
- начало процедуры Sub
2-5
- шапка программы;
6
- подсказка;
7
- начало цикла оператора Dо ... Loop;
8
- вывод окна, в которое вводится значение аргумента x и приостановка вычислений;
9-11
- блочный IF;
9
- начало цикла If. Анализ x. Если x вне заданного диапазона,
то выполняется строка 10, в противном случае управление передается строке 12;
10
- вывод сообщения о неверном вводе x;
11
- конец блочного оператора If;
12
- конец цикла Do Loop с условием. Если проверяемое
условие имеет значение False (x вне указанного диапазона), то управление передается к началу цикла, т.е. в строку 6. Если проверяемое условие имеет значение True (х находится внутри указанного диапазона), то управление передается в 13 строку.
13
- ввод точности (погрешности вычисления ряда);
14
- присваивание переменным (идентификаторам) начальных
значений: a1=x (первый член ряда. В этой записи искусственно допущена ошибка, т.к. первый член ряда должен быть а, а не а1); s= a1; n=1. Коэффициент k задан отрицательным, т.к. вычисляется второй член ряда;
15-20
- цикл Do ... Loop
15
- открытие цикла с проверкой условия в конце. Вначале цикл будет выполнен без проверки условия;
16
- переменная a принимает значение a1, т.е. x, т.к. в следующей строке используется выражение с переменной a;
17
- вычисление последующего члена ряда;
18
- накопление суммы ряда с учетом знака ряда;
19
- изменение параметров n и k, что необходимо для
вычисления следующего члена ряда. Знак коэффициента k меняется на противоположный;
126
20
- конец цикла. Проверяется условие. Вначале проверяемое
значение имеет значение False, поэтому управление будет передано к началу цикла, т.е. в строку 16. Если значение проверяемого условия станет True, то управление будет передано в строку 21;
21
- вывод вычисленной суммы ряда;
22
- вычисление контрольной суммы ряда с использованием стандартной функции бейсика.
23
- вывод контрольной суммы ряда;
24
- конец процедуры.
После запуска программы в диалоговом окне появляется надпись: Введите значение аргумента. В поле ввода необходимо ввести число из заданного диапазона, например 1.
В новом окне Windows выводится: Введите точность вычислений. В поле ввода введем число 0.01.
В окне вывода высвечивается: Вычисленная сумма ряда равна
4.07D-01. В новом окне вывода выводится:
Контрольная сумма ряда равна 4.05D-01.
Учитывая, что контрольная сумма практически равна контрольной сумме ряда, можно сделать вывод о правильности работы программы.
Если аргумент х задан вне указанного диапазона, то появляется сообщение Аргумент вне диапазона. Повторите ввод. Программа не будет вычислять значение ряда до тех пор, пока значение x выходит за пределы заданного диапазона.
3.11 Программы для работы с массивами
Для работы с массивами используют два основных оператора ­оператор Dim и оператор ReDim.
Оператор Dim, описанный ранее, используются не только для описания простых переменных, но также переменных массива.
Рассмотрим более полный формат оператора Dim.
Оператор Dim для описания переменных и массивов
(DIMension – резервирование места )
Формат оператора:
Dim переменная [(индексы)] [AS тип] [,переменная [(индексы)] [ AS тип ]…
127
переменная − имя массива или простой переменной. Правила написания имени массива такое же, как у простой переменной; индексы − константы, переменные или арифметические выражения, разделенные запятыми, максимальные значения которых определяют величину массива, а число индексов − размерность массива. Формат индексов:
[начало To] конец
начало и конец устанавливают нижнюю и верхнюю границы индексов
массива из диапазона ц е л ы х чисел: от -32768 до +32767. Если параметр начало не указан, то он равен нулю. Параметр начало должен быть меньше параметра конец; тип устанавливает тип элементов массива или простой переменной (Integer, Long, Single, Double, String). Если параметр тип не задан, то тип по умолчанию устанавливается Variant (различный).
Назначение оператора: объявляет массивы или устанавливает тип данных для простых переменных, например:
Dim A(50) As Single, B (10 To 100) AS Double
- описан одномерный массив одинарной точности с именем А,
содержащий 51 элемент: А(0), А(1),...А(50) и одномерный массив с именем В двойной точности, индексы которого меняются от 10 до
100.
К моменту выполнения оператора Dim переменные, определяющие значения индексов, должны быть определены или вычислены. Если значение индекса не целое, то оно округляется до ближайшего целого. Если при выполнении программы индекс элемента массива выходит за пределы, указанные в операторе, то выводится сообщение об ошибке «Индекс вне диапазона». Максимальное число элементов массива определяется оперативной памятью ЭВМ.
Если размер массива не может быть определен заранее, то допускается определение пустого массива, например:
Dim A() As Single
-определен пустой (динамический массив) с именем А, размер
которого можно неоднократно менять в программе. Прежде чем произойдет первое обращение к элементу динамического массива, размер последнего должен быть определен с помощью оператора ReDim. В программе размер динамического массива можно
128
многократно переопределять, используя тот же оператор ReDim. При
'Программа для вычисления суммы одномерного массива
1
'Название файла программы: SUM~mas.xls
2
'Дата составления программы: 31.10.98
3
'Программист: студент гр. 6131-11 Хальфина А.А.
4
Dim s AS Double
5
Dim d(100) As Single
6
Dim n As Integer′
7
′ ===================блок защиты n от дурака
8
Do
9
n=Val(InputBox("Введите число элементов _
10
одномерного _ массива"))
11
IF n <= 0 Or n> 100 Then
12
MsgBox "Неверный ввод данных. Повторите ввод!"
13
End If
14
Loop While n <= 0 Or n>100
15
' ========================конец блока
16
j=3
17
For i = 1 To n
18
d( i )= Worksheets (" Summa").Cells(i, j).Value
19
переопределении элементы массива стираются.
3.11.1. Одномерные массивы
Задача 35. Найти сумму элементов одномерного массива D, состоящего из N элементов.
Обеспечить защиту параметра N от «дурака» (N не может быть отрицательным числом и числом большим 100). Обеспечить диалог с пользователем.
Элементы массива расположить на листе Excel в виде вектор­столбца.
Вывести найденную сумму на лист Excel в конце вектор­столбца и в окно Windows. Программа на VBA:
После загрузки Microsoft Excel запишем в третий столбец листа Excel массив чисел, начиная с ячейки C1. Присвоим листу имя Summa. Затем загрузим редактор VBA (Alt+F11), Вставим модуль и создадим процедуру типа Sub. Внутри процедуры запишем код программы:
129
Next i
20
s = 0
21
For i = 1 To n
22
s = s + d(i)
23
Next i
24
Worksheets(" Summa").Cells(i, j).Value=s
25
MsgBox " Сумма элементов одномерного массива ="&s
26
Обсуждение программы:
1-4
- шапка программы;
5
- переменная s получает тип Double (двойной точности), т.к.
она предназначена для хранения суммы (больших или маленьких) чисел;
6
- оператор Dim задает размерность массива (используется
один индекс, т.к. массив одномерный), тип элементов и максимальное значение индекса массива;
7
- оператор Dim определяет n как число целого типа;
8
- выводится подсказка, поясняющая назначение блока программы;
9-15
- начало и конец цикла Do …. Loop;
9
- открытие цикла Do .... Loop c проверкой условия в конце
цикла;
10
- записана часть оператора InputBox. Учитывая, что оператор
не умещается в строке, вторая часть оператора записана в 11 строке. Перенос части оператора на VBA осуществляется с помощью знака подчеркивания, впереди которого ставится пробел;
11
- конец оператора InputBox;
12
- проверяется значение переменной n. Если число элементов
вне заданного диапазона (одно или оба условия не выполняются) то управление передается в строку 13. Если значение условия ложно, т.е. значение n находится внутри диапазона, то управление передается в строку 15;
Особенностью программы является то, что в ней используется массив − упорядоченный набор однотипных элементов, число которых фиксировано.
Элементы одномерного массива имеют один индекс. В качестве индекса, как правило, используют целые числа.
130
13
- в окне Windows появляется сообщение о неверном вводе
информации. Работа программы приостанавливается до начатия на клавишу OK;
14
- конец блочного оператора If;
15
- конец оператора Loop с условием на конце цикла. Если
условие истинно, т.е. параметр n выходит за указанный диапазон то управление передается в начало цикла в строку
10. Если параметр n находится внутри заданного диапазона, управление передается строке 16;
16
- оператор Rem, содержащий сообщение;
17
-переменная j (номер столбца таблицы Excel) равна 3;
18
- открывается цикл с параметром i, который задает индексы
массива. Начальное значение параметра i равно единице. Цикл выполняется до тех пор, пока значение параметра цикла не станет больше n;
19
- из ячейки Excel с индексами (1,3) т.е. С1, читается число и присваивается переменной массива d(1);
20
- конец цикла. Управление передается автоматически к началу цикла;
21
- обнуление переменной s для накопления суммы;
22-24
- цикл с параметром i:
22
- открывается цикл с параметром цикла i, который задает индексы массива;
23
- суммирование элементов массива;
24
- конец цикла. Управление передается в строку 22;
25
- вывод суммы элементов одномерного массива в ячейку с параметрами (n+1, j);
26
- вывод суммы элементов одномерного массива в окно Windows.
Для запуска программы используйте меню Run (кл. F5). После запуска программы на выполнение на экране появляется окно для ввода числа элементов массива. Если число элементов введено верно, то на листе Excel появляется сумма элементов массива, находящаяся внизу вектор-столбца массива. Аналогичный результат появляется в окне Windows.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]