Вычисление произведения
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
Delphi: Задание: составить программу вычисления произведения, и закинуть получившееся число в файл, вот два первых члена(n-ый член представлен в самой программе): (1/2-cos|x|)(2/3-cos^2|x|)... (^2 я представил вам степень косинуса).Произведение бесконечное. Вот то что я надумал:
var
n,i:integer;
x,s:double;
f:textfile;
procedure t(var x,s:double;n,i:integer);
begin
s:=1;
for i:=1 to n do
x:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*x;
end;
begin
n:=strtoint(edit1.text);
x:=strtofloat(edit2.text);
assignfile(f,'data.txt');
rewrite(F);
t(x,s,n,i);
writeln(f,s);
closefile(F);
end;
программа работает, но неправильно, например при умножении первых трёх членов друг на друга он выдаёт не правильно число, а при четырёх выдаёт отрицательное число, при том что оно должно быть положительное ! Подскажите что делать, не могу понять, может у меня не правильно составлен код последовательного умножения??? n я в программе заменил на i ! если по заданию то n-ый член выглядит так:
n/(n+1)-exp(n*ln(cos(abs(x))));
var
n,i:integer;
x,s:double;
f:textfile;
procedure t(var x,s:double;n,i:integer);
begin
s:=1;
for i:=1 to n do
x:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*x;
end;
begin
n:=strtoint(edit1.text);
x:=strtofloat(edit2.text);
assignfile(f,'data.txt');
rewrite(F);
t(x,s,n,i);
writeln(f,s);
closefile(F);
end;
программа работает, но неправильно, например при умножении первых трёх членов друг на друга он выдаёт не правильно число, а при четырёх выдаёт отрицательное число, при том что оно должно быть положительное ! Подскажите что делать, не могу понять, может у меня не правильно составлен код последовательного умножения??? n я в программе заменил на i ! если по заданию то n-ый член выглядит так:
n/(n+1)-exp(n*ln(cos(abs(x))));
wanty писал(а):Delphi: Задание: составить программу вычисления произведения, и закинуть получившееся число в файл, вот два первых члена(n-ый член представлен в самой программе): (1/2-cos|x|)(2/3-cos^2|x|)... (^2 я представил вам степень косинуса).Произведение бесконечное. Вот то что я надумал:
var
n,i:integer;
x,s:double;
f:textfile;
procedure t(var x,s:double;n,i:integer);
begin
s:=1;
for i:=1 to n do
x:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*x;
end;
begin
n:=strtoint(edit1.text);
x:=strtofloat(edit2.text);
assignfile(f,'data.txt');
rewrite(F);
t(x,s,n,i);
writeln(f,s);
closefile(F);
end;
программа работает, но неправильно, например при умножении первых трёх членов друг на друга он выдаёт не правильно число, а при четырёх выдаёт отрицательное число, при том что оно должно быть положительное ! Подскажите что делать, не могу понять, может у меня не правильно составлен код последовательного умножения??? n я в программе заменил на i ! если по заданию то n-ый член выглядит так:
n/(n+1)-exp(n*ln(cos(abs(x))));
Попробуй вместовот этой строчки:
x:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*x;
написать вот так: s:=s*(i/(i+1)-exp(i*ln(cos(abs(x)))));
как не странно, но это помогло ! спс огромное ! но я не пойму, почему из-за одной строчки он считал не правильно ?
wanty писал(а):как не странно, но это помогло ! спс огромное ! но я не пойму, почему из-за одной строчки он считал не правильно ?
Потому что ты изменял значение х, которое в данной формуле не надо изменять, она при каждом умножении остается неизменной, посмотри внимательно на те твои две строчки. Если уж писать как ты писал, то надо было ввести еще одну переменную, и выглядело бы это вот так:
а:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*а;
Понятно, спс ! и ещё вопрос можно ? мне многие говорили что не хватает операторных скобок после for , но когда я их там ставил , программа начинала считать не правильно, так они нужны или нет ?
wanty писал(а):Понятно, спс ! и ещё вопрос можно ? мне многие говорили что не хватает операторных скобок после for , но когда я их там ставил , программа начинала считать не правильно, так они нужны или нет ?
Если ты напишешь вот так: s:=s*(i/(i+1)-exp(i*ln(cos(abs(x))))); - то не нужны, но если:
а:=i/(i+1)-exp(i*ln(cos(abs(x))));
s:=s*а;
то надо будет после for написать begin а после вот этой строчки - s:=s*а; надо поставить end; Тогда все будет правильно работать
помогите написать программу
a*(a+1)*(a+2)*...*(a+n-1)
a*(a+1)*(a+2)*...*(a+n-1)
y= (1/2-cos|x|)(2/3-cos^2|x|)... (n/n+1-cos^n|x|)
Хочу попросити перевірити на паскалі буде так? Якщо ні, то вести поправки..
program riv;
uses crt;
var n,x,a,y:real;
i:integer;
begin
clrscr;
write('n=');
read(n);
write('x=');
read(x);
i:=1;
a:=1;
y:=1;
begin
repeat a:=a*cos(abs(x));
y:=y*(i/(i+1));
i:=i+1;
until (i>n);
end;
writeln('y=',y:4:3);
readln;readln;
end.
Хочу попросити перевірити на паскалі буде так? Якщо ні, то вести поправки..
program riv;
uses crt;
var n,x,a,y:real;
i:integer;
begin
clrscr;
write('n=');
read(n);
write('x=');
read(x);
i:=1;
a:=1;
y:=1;
begin
repeat a:=a*cos(abs(x));
y:=y*(i/(i+1));
i:=i+1;
until (i>n);
end;
writeln('y=',y:4:3);
readln;readln;
end.
В цикле в вычислении переменной У не задействована переменная А
It's a long way to the top if you wanna rock'n'roll
так...вже підправила) Спасибіsomewhere писал(а):В цикле в вычислении переменной У не задействована переменная А