ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.07.2024
Просмотров: 148
Скачиваний: 0
∙ В-третьих, анализ общей формулы, задающей каждое слагаемое в сумме, позволяет провести
его вычисление стандартными средствами языка Паскаль
S:=S+1/(sqr(i) + L),
при этом, расчет слагаемого и добавление его в сумму можно совместить в одном действии, не при- бегая к использованию дополнительных переменных. Однако перед началом цикла переменную S следует занулить. При входе в тело цикла в этом случае начальное значение суммы будет равно ну- лю, при выполнении первого шага оператора цикла с параметром значение переменной S изменится. К «старому» значению - ноль будет давлено рассчитанное значение, соответствующее первому сла- гаемому. На втором шаге, к уже имеющемуся в сумме первому слагаемому будет добавлено значе- ние выражения, соответствующее второму слагаемому суммы. На третьем – третье слагаемое, и т.д. до последнего слагаемого, номер которого указан пользователем при помощи переменной n. По за- вершении работы оператора цикла переменная S будет содержать требуемую сумму. Ее необходимо будет вывести на экран и закончит работу программы.
С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:
Program primer3 (input, output); |
{Заголовок программы} |
Const L=0.53; |
{Описание параметра - константы} |
Var; i, n: integer; s: real; |
{Описание переменных} |
Begin |
{Начало программы} |
Clrscr: |
{Процедура очистки экрана} |
Writeln(’Программа расчета суммы’); |
{Вывод пояснений к программе} |
Writeln(’Укажите необходимое число слагаемых’); |
{Организация диалога} |
Write(’n = ’); read(n); |
{Ввод значения переменной n } |
S:= 0; |
{Установка начального значения } |
For i:=1 to n do |
{Заголовок цикла } |
S:=S+1/(sqr(i)+L); |
{Расчет слагаемого и добавление его к сумме } |
Writeln(’Сумма равна, S = ’,S:6:4); |
{Вывод результата на экран} |
Repeat Until Keypressed; |
{Процедура «задержки» экрана } |
End. |
{Конец программы} |
Пример 3. Составить программу вывода таблицы функции y(x)=x(1+ex2 ) на отрезке [a,b] с шагом h
Решение.
Решение задачи следует производить по следующей схеме:
∙Следует ввести значения начала и конца отрезка табулирования и шаг табуляции функции;
∙Взять в качестве начального значения аргумента x значение начала отрезка табулирования;
∙До тех пор, пока не достигнут конец отрезка табулирования, следует рассчитывать значение функции; выводить его на экран и изменять значение аргумента с учетом шага табуляции;
Блок схема для решения задачи выглядит следующим образом:
- 18 -
При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:
∙ Во-первых, все переменные должны быть описаны. Поэтому в разделе описаний переменных введем переменные a – в качестве начала отрезка табулирования, b – в качестве конца отрезка табулирования, h – в качестве шага табулирования, x – в качестве независимого аргумента, y –
в качестве рассчитываемой функции. Все переменные вещественного типа.
∙Во-вторых, поскольку число шагов, которые необходимо будет выполнить для расчета суммы не известно, для организации цикла можно использовать оператор цикла с предварительной про- веркой условия. Однако следует помнить, что в теле цикла с предусловием должен быть исполь- зован только один оператор языка Паскаль и поэтому нам придется использовать составной опе- ратор. Можно воспользоваться для организации цикла и оператором цикла с постусловием, и в этом случае составной оператор в теле цикла не потребуется, в силу особенностей этого операто- ра цикла.
Заметим, что использование для данной задачи оператора цикла с параметром в принципе возможно, но неудобно, поскольку шаг табуляции вещественный, а оператор цикла с параметром может использовать только произвольный простой скалярный тип данных, кроме вещественного. В этом случае задачу можно решить, если определить, сколько шагов придется сделать, чтобы «накрыть» интервал табулирования. Для этого придется определить протяженность интервала табулирования и разделить его на величину шага, затем организовать вычисления с помощью дополнительной переменной. Этот вариант решения в силу его малой эффективности здесь не рассматривается.
∙В-третьих, перед использованием оператора цикла необходимо будет приписать всем перемен- ным, участвующим в циклических вычислениях некие начальные значения. Переменная x до на- чала цикла должна получить свое первое значение равное a (значение, соответствующее началу отрезка табулирования).
∙В-четвертых, поскольку при организации цикла с пред- или постусловием перебор параметров цикла (переменная x) следует производить программным образом, в теле цикла должен присут-
ствовать оператор, обеспечивающий переход к следующему значению параметра цикла с учетом
шага табулирования
x := x + h.
∙ В-пятых, с учетом особенностей операторов цикла с пред- и постусловием, в случае использо-
вания оператора цикла с предварительной проверкой условия тело цикла будет выполняться до тех пор, пока логическое условие в заголовке цикла истинно, выполнение будет прекращено, как только логическое условие становится ложным. При этом в теле цикла допускается только один оператор языка Паскаль и придется использовать составной оператор. В случае использования
- 19 -
оператора цикла с постусловием тело цикла будет выполняться до тех пор, пока логическое ус- ловие в заголовке цикла является ложным, выполнение прекращается, как только условие стано- вится истинным.
∙В-шестых, следует помнить, что при записи выражения для расчета функции следует соблю- дать правила синтаксиса языка Паскаль.
∙В-седьмых, вывод рассчитанных значений на экран должен осуществляться до изменения ар- гумента x, в противном случае будет нарушено соответствие, между аргументом и значением
функции.
Сучетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:
Сиспользованием цикла с предусловием:
program primer1 (input, output); |
|
{Заголовок программы} |
uses crt; |
|
{Подключение модуля} |
var a,b,x,y,h: real; |
|
{Описание переменных} |
begin |
|
{Начало программы} |
clrsсr; |
|
{Процедура очистки экрана} |
write (‘Введи начальные данные’); |
{Вывод пояснений к программе} |
|
write (‘Введи начало отрезка a=‘); readln(а); |
{Ввод начала отрезка табулирования } |
|
write (‘Введи конец отрезка b=‘); |
readln(b); |
{Ввод конца отрезка табулирования } |
write (‘Введи h=‘); readln(h); |
|
{ Ввод шага табулирования } |
x:=a; |
|
{Установка начального значения} |
while x<=b do |
|
{Заголовок цикла} |
begin |
|
{Открывающая операторная скобка} |
y:=x*(1+exp(SQR(x))); |
{Расчет значения функции} |
|
writeln(‘при x=‘,x, ‘ |
y=‘,y); |
{Вывод результата на экран} |
x:=x+h; |
|
{Изменения аргумента} |
end; |
|
{Закрывающая операторная скобка} |
repeat until keypressed; |
|
{Процедура «задержки» экрана } |
end. |
|
{Конец программы} |
С использованием цикла с постусловием: |
|
|
program primer1 (input, output); |
|
{Заголовок программы} |
uses crt; |
|
{Подключение модуля} |
var a,b,x,y,h: real; |
|
{Описание переменных} |
begin |
|
{Начало программы} |
clrsсr; |
|
{Процедура очистки экрана} |
write (‘Введи начальные данные’); |
{Вывод пояснений к программе} |
|
write (‘Введи начало отрезка a=‘); readln(а); |
{Ввод начала отрезка табулирования } |
|
write (‘Введи конец отрезка b=‘); |
readln(b); |
{Ввод конца отрезка табулирования } |
write (‘Введи h=‘); readln(h); |
|
{ Ввод шага табулирования } |
x:=a; |
|
{Установка начального значения} |
Repeat |
|
{Заголовок цикла} |
y:=x*(1+exp(SQR(x))); |
{Расчет значения функции} |
|
writeln(‘при x=‘,x, ‘ |
y=‘,y); |
{Вывод результата на экран} |
x:=x+h; |
|
{Изменения аргумента} |
until x > b |
|
{Проверка условия цикла} |
repeat until keypressed; |
|
{Процедура «задержки» экрана } |
end. |
|
{Конец программы} |
|
|
- 20 - |
Пример 3. Рассчитать сумму при заданном натуральном значении n
|
|
|
|
|
|
|
|
|
n |
(−1) |
i |
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
S = å |
|
|
. |
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
Решение. |
|
|
|
|
|
|
|
|
i =1 |
i ! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Запишем условия задачи в развернутом виде: |
|
|
|
|
|
|
|
|
|
|
|
|
+ (-1) |
|
|
|||||||||
S = å (-1) |
i |
= |
(-1) |
+ |
(-1) |
2 |
+ (-1) |
+ |
|
(-1) |
|
+ ... + |
(-1) |
n−2 |
+ |
(-1) |
n−1 |
. |
||||||
n |
|
|
1 |
|
|
|
3 |
|
|
4 |
|
|
|
|
|
|
|
n |
||||||
|
|
|
|
|
|
|
|
3! |
|
|
|
|
|
|
|
|
|
|
|
|
||||
i =1 |
i ! |
|
|
1! |
|
2! |
|
|
|
4! |
|
|
|
|
(n - 2)! |
(n -1)! |
|
n ! |
|
|
Формально эту сумму можно представить в общем виде как сумму из n слагаемых:
где |
|
|
|
|
S = a1 + a2 + a3 |
+ a4 +...+ an-2 + an-1 + an , |
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
(-1)n−2 |
|
|
|
|
(-1)n−1 |
|
|
|
|
|
a = |
(-1)1 |
, a |
|
= |
(-1)2 |
, a |
|
= |
(-1)3 |
...a |
n−2 |
= |
, a |
|
= |
, a |
n |
= |
(-1)n |
|||
1! |
|
2! |
|
3! |
(n - 2)! |
|
|
n! |
||||||||||||||
1 |
|
2 |
|
|
3 |
|
|
|
|
n-1 |
|
(n -1) ! |
|
По принципам нахождения суммы необходимо знать значение каждого слагаемого входящего в сумму. Для этого его необходимо рассчитать. Однако из-за отсутствия в стандарте языка Паскаль
функций возведения в степень и факториала числа провести непосредственный расчет слагаемого с определенным номером не представляется возможным. Попытка применить для расчета числителя формулу:
a х = ехр(х* ln( a))
приводит к необходимости записи натурального логарифма от отрицательного числа, что лишено смысла, поскольку натуральный логарифм определен только для положительных чисел, отличных от нуля. Поэтому запись вида
(-1) i = ехр(i* ln( -1))
не может быть использована для вычислений. Расчет знаменателя также стандартными средствами невозможен.
Конечно, можно описать в программе нестандартные функции для расчета степени и факториала, однако существует более рациональный способ решения данной задачи. Этот способ основан на ис- пользовании рекуррентной формулы. С ее помощью устанавливается связь между элементами по- следовательности текущим и предыдущим (или последующим). Получить рекуррентную формулу достаточно просто но не в общем виде, а конкретно для нашей последовательности. Для этого необ- ходимо разделить слагаемое, имеющее номер k на слагаемое с предыдущим номером – (k-1):
ak |
|
|
(-1)k |
|
(-1)k |
|
(k -1)! |
|
(-1)k -1 × (-1) |
|
(k -1)! |
|
-1 |
|
|||||
= |
|
k ! |
|
= |
× |
= |
× |
= |
. |
||||||||||
ak−1 |
(-1) |
k -1 |
k ! |
(-1) |
k -1 |
(k -1)!× k |
|
(-1) |
k -1 |
k |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
(k -1)!
Откуда получаем рекуррентную формулу, связывающую слагаемое с номером k с предыдущим слагаемым с номером – (k-1):
ak = -k1×ak−1 , - 21 -