Proc41. Описать функцию Sin1(x, $$\epsilon$$) вещественного типа (параметры $$x$$, $$\epsilon$$ — вещественные, $$\epsilon > 0$$), находящую приближенное значение функции sin($$x$$): $$sin(x) = x — x^3/(3!) + x^5/(5!) — … + (-1)^n*x^{2*n+1}/((2*n+1)!) + …$$ . В сумме учитывать все слагаемые, модуль которых больше $$\epsilon$$. С помощью Sin1 найти приближенное значение синуса для данного x при шести данных $$\epsilon$$.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
program Proc41; Function Sin1(x,e:Real):Real; var Znak,i:integer; xi,ni:Real; TempRez,Rez:Real; begin xi:=1; i:=0; ni:=1; Znak:=-1; Rez:=0; TempRez:=x; While (abs(TempRez) > e) do begin if odd(i) then begin Znak:=Znak*(-1); Rez:=Rez+Znak*TempRez; end; inc(i); xi:=xi*x; ni:=ni*i; if odd(i) then begin TempRez:=xi/ni; end; end; Sin1:=Rez; end; var X,E:real; i: integer; begin Write('X :'); Readln(X); for i:=1 to 6 do begin Write('E :'); Readln(E); Writeln(Sin1(X,E)); end; end. |
Решение olegst1975:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
function Sin1(x,e:real):real; var sin1_n:real; i:integer; begin sin1_n:=x; result:=0; i:=0; while abs(sin1_n)>e do begin result:=result+sin1_n; inc(i); sin1_n:=-sin1_n*x*x/((2*i+1)*(2*i)); end; end; var i:integer; x,e:real; begin read(x); for i:=1 to 6 do begin read(e); write(Sin1(x,e)); end; end. |
Другие задачи из раздела Proc можно посмотреть здесь.
строку 17 необходимо поправить, чтобы работало и для отрицательных X
[/crayon]
Поправил
Было:
Стало:
пока не объявлял result отдельно
[/crayon]
Добавил в шапку.
Решение, схожее с предложенным Олегом, плюс немного дополнительной автоматизации, проверки и наглядности:
Да, оформление у вас красивое… но мой мозг не заточен, на столько пробелов между переменной… и её типом в строчке :
Если их будет 3 таких строчки подряд, то без линейки не обойдёшься. 🙂
К стати забавно выглядело бы это оформление в питоне, когда переменным a,b,c присваиваются значения 1, 2 и 3 соответственно:
a,b,c = 1,2,3
если это отдалить друг от друга, то всё будет плохо…
Так что я рекомендую не пренебрегать читабельностью ради красоты….
Ну это так… моё фи… возможно это даже дело привычки.
Решение да действительно получилось, как у olegst1975.
Надеюсь ваше решение поможет кому нибудь разобраться в нём.
Откуда взялась эта формула sin1_n:=-sin1_n*x*x/((2*i+1)*(2*i));??? Как её выразить?
var
sin1_n:real;
i:integer;
begin
sin1_n:=x;
result:=0;
i:=0;
while abs(sin1_n)>e do
begin
result:=result+sin1_n;
inc(i);
sin1_n:=-sin1_n*x*x/((2*i+1)*(2*i));
end;
end;
var
i:integer;
x,e:real;
begin
read(x);
for i:=1 to 6 do
begin
read(e);
write(Sin1(x,e));
end;
end.
Это рекурсия. Она в самом конце учебника проходиться.
ну и откуда взялась эта формула :sin1_n:=-sin1_n*x*x/((2*i+1)*(2*i));, Это немного другая запись вот этого: $$(-1)^n*x^{2*n+1}/((2*n+1)!)$$ где sin1_n это предыдущее значение с n-1 типо $$(-1)^(n-1)*x^{2*(n-1)+1}/((2*(n-1)+1)!)$$