Помощь - Поиск - Пользователи - Календарь
Полная версия: прогрессия
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Andrej
arctg(X)= x-x^3/3+x^5/5-x^7/7+x^9/x+...... xe [-1;1]
правелно ли я делаю ? или лутше через массив?

Код

Program first;
uses crt;
var xn,E,summa,p,x2:real;
    i:integer;
begin
clrscr;
repeat
writeln ('введите xn [-1..1]');
readln(xn);
until (xn>=(-1)) and (xn<=1);
write('E=');
read(E);
x2:=xn*xn;
summa:=xn;
p:=xn;
i:=3;
repeat
p:=-p*x2/(i*(i-2));
summa:=summa+p;
i:=i+2;
until p<E;
writeln('p=',p:5:5);
writeln('summa=',summa:5:5);
readln;
readln;
end.


так как мне надо вводить n тоесть n=1 =x
n=2 = x+x^3/3
n=3 = x+x^3/3+x^5/5
volvo
У тебя не совсем верно здесь:
repeat
p:=-p*x2/(i*(i-2)); { <--- }
summa:=summa+p;
i:=i+2;
until p<E;

(тебе не нужно изменять знаменатель... То, что ты делаешь, аналогично:

x-x^3/3+x^5/(3*5*3)-x^7/(7*5*3*5*3)+...,
то есть знаменатель ДОМНОЖАЕТСЯ на i*(i-2), а тебе нужно:
next := xn;
repeat
p := next/i;
next := - next * x2; { next хранит изменяющийся числитель, знаменатель вычисляется уже в p }
summa:=summa + p;
i:=i+2;
until abs(p) < E; { <--- Не забывай про abs }

)
Andrej
спасиба wink.gif
Andrej
что то не то если x=1 a e=0.2 то должна сумма быть 0 .... а у меня что-то считает wacko.gif
Andrej
и еще с abs нелзя е=0
вечный цикл получается
volvo
Ну вот расскажи мне, если у тебя X = 1, и s = X + ... то как может быть сумма равна 0 ???

Цитата
с abs нелзя е=0
E = 0 вообще нельзя... Какой смысл ты в это вкладываешь? "С точностью до НУЛЯ"???
Andrej
да ты прав...понял give_rose.gif
а он считает только x+x^3/3 .... далше несчитает norespect.gif
Andrej
Код

Program first;
uses crt;
var xn,p,E,summa,next,x2:real;
    i,n:integer;
begin
clrscr;
repeat
writeln ('iveskyte xn [-1..1]');
readln(xn);
until (xn>=(-1)) and (xn<=1);
repeat
writeln ('iveskyte E<>0=');
readln(E);
until E<>0;
x2:=xn*xn;
summa:=xn;
next:=xn;
i:=3;
for n:=1 to 3 do begin
repeat
p:=next/i;
next:=next*x2;
summa:=summa+p;
i:=i+2;

until abs(p)<E;
writeln('p=',p:5:5);
writeln('summa=',summa:5:5);
end;
readln;
end.



во..... но теперь я хотчу чтобы я вводил n а не чикл мне векидивал от 1 до 3 , хелп yes2.gif
volvo
А вот теперь ты мне расскажи, зачем тебе в программе нужен вот этот цикл:
for n:=1 to 3 do begin
? Что, нельзя точность поменьше задать? Чего ты добиваешься этим циклом? Правильности результату он никак не прибавляет, в смысле, ты задал E = 0.2, и результат с данной точностью получился уже при n = 1... Все остальное - никому не нужные вычисления...

Сначала приведи код в нормальный вид, потом напиши, ЧТО ИМЕННО ты хочешь вводить, и какой результат получить, а потом будем разговаривать...
Andrej
Код
for n:=1 to 3 do begin

так хоть далше считает.... а то ответ такой же самий :/

мне же надо его вводить .... цикл считает отлично , но я им немогу руководит тока от и до ввести
а мне надо например чтобы n=3 ; p:=x+x^3/3-^5/5
Andrej
ну кажись решил....посчитал на бумаге вроде всио оки
Код

Program first;
uses crt;
var xn,p,E,summa3,summa2,next,x2:real;
    i,n:integer;
begin
clrscr;
repeat
writeln ('iveskyte xn [-1..1]');
readln(xn);
until (xn>=(-1)) and (xn<=1);
repeat
writeln ('iveskyte E=');
readln(E);
until E<>0;
repeat
writeln ('iveskyte n=');
readln(n);
until n<>0;
x2:=xn*xn;
summa2:=xn;
next:=xn;
i:=3;
for n:=1 to n do begin
repeat
next:=next*x2;
p:=next/i;
summa2:=summa2+p;
i:=i+2;
until abs(p)<E;
writeln('p=',p:5:10);
writeln('summa2=',summa2:5:5);
end;
readln;
end.


еще бы зделать чтобы все n непоказывало , а толко последний
Sozialist
Код

Program first;
uses crt;
var xn,p,E,summa3,summa2,next,x2:real;
    i,n:integer;
begin
clrscr;
repeat
writeln ('iveskyte xn [-1..1]');
readln(xn);
until (xn>=(-1)) and (xn<=1);
repeat
writeln ('iveskyte E=');
readln(E);
until E<>0;
repeat
writeln ('iveskyte n=');
readln(n);
until n<>0;
x2:=xn*xn;
summa2:=xn;
next:=xn;
i:=3;
for n:=1 to n do begin
repeat
next:=next*x2;
p:=next/i;
summa2:=summa2+p;
i:=i+2;
until abs(p)<E;
end;
writeln('p=',p:5:10);
writeln('summa2=',summa2:5:5);
readln;
end.


чтоб только значения при последнем n? есля я правильно понял, надо предпоследний end на 2 строки выше поднять, как у меня выше.
volvo
Sozialist, ты что изменил-то в основном цикле программы??? Зачем просто так Copy/Paste-ить?

Объясните вы мне РУССКИМ языком, зачем КОМБИНИРОВАТЬ 2 цикла (For + Repeat), если можно обойтись одним Repeat-ом, только не Until abs(p)<E ...

Особенно мне понравилось вот это:
Цитата
for n:=1 to n do begin
smile.gif

Program first;
uses crt;
var
xn,p,E,summa3,summa2,next,x2:real;
i,n:integer;
begin
clrscr;
repeat
writeln ('iveskyte xn [-1..1]');
readln(xn);
until (xn>=(-1)) and (xn<=1);

{
!!! Этот кусок можно убрать - от него теперь никакого толка нет...
Ты НЕ можешь одновременно считать и ДО определенной точности, и
определенное число членов ряда... Или одно или другое...
}
repeat
writeln ('iveskyte E=');
readln(E);
until E<>0;
{ ... !!! }

repeat
writeln ('iveskyte n=');
readln(n);
until n > 0; { А если бы я при твоем условии задал -1 ? }

x2:=xn*xn;
summa2:=xn;
next:=xn;
i:=3;

if n = 1 then p := 0
else repeat
next:=-next*x2; { А вот сюда посмотреть уже 10 постов никто не догадался, я забыл здесь минус }
p:=next/i;
summa2:=summa2+p;
i:=i+2;
dec(n);
until n <= 1;

writeln('p=',p:5:10);
writeln('summa2=',summa2:5:5);

readln;
end.

Теперь ясно?
Sozialist
Человек просил вывести только последний результат, что я и обеспечил, за основной код я не брался, т.к. товарищ им удовлетворен, я ничего не имею против ;-)
Andrej
ище мне надо так же найти cумму которая >E
но наверна ана почти всегда будет 0
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.