Задания для контрольной работы. Составить алгоритм для расчета значений выражений
Составить алгоритм для расчета значений выражений. Реализовать алгоритм в Turbo Pascal. Отсутствующие в языке функции выразить через имеющиеся.
Вариант 1.
Вариант 2.
Вариант 3.
Вариант 4.
Вариант 5.
Вариант 6.
Вариант 7.
Вариант 8.
Вариант 9.
Вариант 10.
Вариант 11.
Вариант 12.
Вариант 13.
Вариант 14.
Вариант 15.
Вариант 16.
Вариант 17.
Вариант 18.
Вариант 19.
Вариант 20.
Алгоритмы с циклами
Примеры решения заданий
Задача 1. Дано натуральное число n. Вычислить n!.
Решение:
n! - это произведение всех натуральных чисел от 1 до п включительно. 0!=1!=1; 2!=1×2= 2; 3!= 2×3= 6; 4!=6×4=24 и т.д. Вообще, n!=(n-l)!×n. Факториалы растут очень быстро. Существует формула Стирлинга для приближённого вычисления этой величины, полезная при изучении теории вероятностей, рядов. Её относительная погрешность стремится к нулю с ростом n:
Алгоритм решения задачи запишется в виде, представленном на рис. 3.1.
Рис. 3.1. Блок схема алгоритма решения задачи 1
Программа в Turbo Pascal будет иметь следующий вид:
Program factorial;
Var n,i,f: Integer;
Begin
Write('Введите натуральное число ');
ReadLn(n);
f:=1;
For i:=2 to n do f:=f*i;
WriteLn(n:40, ' f = ', f:0:0);
Write('По приближенной формуле_ Стирлинга:');
Write(n:5,'f =', Sqrt(2*Pi*n)*_ Exp(n*(Ln(n)-1)):5:3);
ReadLn;
End.
Задача 2. Дано натуральное число n. Вычислить:
a) б)
Решение:
а) Алгоритм решения задачи запишется в виде, представленном на рис. 3.2.
Программа в Turbo Pascal будет иметь следующий вид:
Program Square_a;
Var x: Extended;
i,n: Byte;
Begin
Write('Введите количество корней N = ');
ReadLn(n);
x:=0;
For i:=l to n do x:=Sqrt(2+x);
WriteLn(x);
ReadLn;
End.
|
Рис. 3.2. Блок-схема алгоритма решения задачи 2
б) Алгоритм решения задачи будет иметь практически тот же вид, что и алгоритм для решения задачи а). Отличия заключаются лишь в организации цикла для расчета подкоренного выражения:
х:=0;
For i:=n downto 1 do x:=Sqrt(3*i+x);
Задача 3. Написать программу печати таблицы значений функции sin для аргумента, изменяющегося в заданных пределах с заданным шагом.
Решение
Исходными данными являются начальное значение аргумента Хn, конечное значение аргумента Xk и шаг изменения аргумента dX. Все величины - вещественные и могут принимать любые значения на числовой оси. Результатом работы программы должна быть таблица, состоящая из двух столбцов - значений аргумента и соответствующих им значений функции. Вид таблицы приведен на следующем рис.:
X | Y |
-4.00 | 0.76 |
-3.00 | -0.14 |
-2.00 | -0.91 |
-1.00 | -0.84 |
0.00 | 0.00 |
1.00 | 0.84 |
2.00 | 0.91 |
3.00 | 0.14 |
4.00 | -0.76 |
Алгоритм решения задачи запишется виде, представленном на рис. 3.3.
Программа в Turbo Pascal будет иметь следующий вид:
Program tab_fun;
Var x,y,Xn,Xk,dx:real;
Begin
Writeln('Введите значения Xn, Xk, dX');
Readln(Xn, Xk, dX);
Writeln(' ------------------------- ');
Writeln('| X | Y |');
Writeln(' ------------------------- ');
x:=Xn;
While x <= Xk do begin
у:=sin(x);
Writeln('|', х:9:2,' |', у:9:2,' |');
х:=х+dX;
End;
Writeln(' ------------------------- ');
End.
Рис. 3.3. Блок-схема решения задачи 3
Задача 4. Написать программу вычисления значения функции sin с помощью степенного ряда с точностью e по формуле:
Решение
Этот ряд сходится на всей числовой оси. Для достижения заданной точности требуется суммировать члены ряда до тех пор, пока абсолютная величина очередного члена не станет меньше или равна e.
Запишем в общем виде формулу для вычисления n-го члена ряда:
Легко заметить, что (n+1)-й член ряда вычисляется после n-го, поэтому программа получится более простой и эффективной, если находить член ряда не «с нуля», а умножением предыдущего члена на некоторую величину.
Найдем эту величину. Для этого сначала запишем формулу для (n+1)-го члена ряда, подставив в предыдущее выражение (n+1) вместо n:
Теперь найдем выражение, на которое надо будет умножить Сn, чтобы получить Сn+1:
Определить заранее, сколько членов ряда потребуется просуммировать для достижения точности, невозможно, поскольку при анализе условия выхода используется переменная, вычисляемая на каждой итерации цикла. Такие циклы потенциально опасны, поэтому для предотвращения зацикливания полезно предусмотреть аварийный выход из цикла по достижении некоторого максимально допустимого количества итераций с печатью предупреждающего сообщения.
Программа в Turbo Pascal будет иметь следующий вид:
Program sinus;
{ макс-но допустимое кол-во итераций }
Const Maxlter = 500;
{ аргумент и точность }
Var x, eps: double;
{ член ряда и его сумма }
с, у: double;
n: integer; { номер члена ряда }
{ признак достижения точности }
done: boolean;
Begin
Writeln('Введите аргумент и точность;');
Readln(x, eps);
done:=true;
с:=x; { первый член ряда }
у:=с; { начальное значение суммы }
n := 1;
While abs(c) > eps do begin
{ очередной член ряда }
с:=-с*sqr(x)/2/n/(2*n+l);
{ добавление члена ряда к сумме}
у:=у+с;
inc(n); { переход к след. члену ряда}
If n <= Maxlter then Continue;
Writeln('Ряд расходится!');
{аварийный выход из цикла}
done := false;
Break;
End;
If done then Writeln('ApryмeнT: ',_ x:10:6, #13#10, 'Значение функции: ',_ у:10:6, #13#10, 'Вычислено с точностью ',_ eps:8:6, ' за ', n, ' итераций');
Readln;
End.
Максимально допустимое количество итераций удобно задать с помощью именованной константы. Для аварийного выхода из цикла применяется процедура break, которая обеспечивает переход к первому после цикла оператору. Символы #13#10 при выводе вызывают переход на следующую строку.
Поскольку выход в случае как аварийного, так и нормального завершения цикла происходит в одну и ту же точку программы, вводится булева переменная done, которая предотвращает печать значения функции после выхода из цикла, когда точность вычислений не достигнута. Создание подобных переменных-«флагов», принимающих значение «истина» в случае успешного окончания вычислений и «ложь» в противном случае, является распространенным приемом программирования.