Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычислить с заданной точностью ε
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
задали задачу dry.gif может, кто сможет помочь? я написал программу
var x,y,z,i,n: integer;
s,m,e:real;
begin
write ('vvedite x');
readln (x);
write ('vvedite n');
readln (n);
write ('vvedite e');
readln (e);
y:=1;
z:=1;
s:=1;
for i:=1 to n do
if y/z>e then {училка говорит,что тут нужен while,а не if.Пробовал с while,но прога вычисляет неверно mad.gif }
begin
z:=z*i;
y:=y*(2*x);
s:=s+y/z;
end;
write (s:9:5);
readln;
end.

задание прикреплено

М
Тэги!! Правила раздела, п.2 (подними глаза на верх страницы).
Lapp

Lapp
Цитата(marwell @ 19.11.2009 21:37) *
Пробовал с while,но прога вычисляет неверно
Покажи вариант с while, плз.
Unconnected
А какие исходные данные известны, x,n и точность? Точность - это в смысле количество знаков после запятой?
marwell
Цитата(Lapp @ 20.11.2009 12:25) *

Покажи вариант с while, плз.


var x,y,z,i,n: integer;
s,m,e:real;
begin
write ('vvedite x');
readln (x);
write ('vvedite n');
readln (n);
write ('vvedite e');
readln (e);
y:=1;
z:=1;
s:=1;
for i:=1 to n do
while y/z>e do
begin
z:=z*i;
y:=y*(2*x);
s:=s+y/z;
end;
write (s:9:5);
readln;
end.



Добавлено через 3 мин.
Цитата(Unconnected @ 20.11.2009 22:11) *

А какие исходные данные известны, x,n и точность? Точность - это в смысле количество знаков после запятой?

x и n вводятся пользователем, точность - это типа как только очередное значение слагаемого становится меньше ε, цикл останавливается и выводится сумма
Lapp
marwell, тебе не нужно вводить n - оно определяется точностью. Цикл for совсем лишний. И с типами чисел ты все перепутал - как могли быть x,y,z целыми? Речь же идет о вещественных. Кроме прочего, лучше использовать double вместо real. И последнее: не нужно отдельно считать числитель и знаменатель - будет короче, проще и надежнее (меньше вероятность переполнения).
Смотри, как надо:
var
i: integer;
x,y,s,e: double;

begin
write ('vvedite x: ');
readln (x);
write ('vvedite e: ');
readln (e);
y:=1;
s:=1;
i:=1;
while y>e do begin
y:=y*2*x/i;
s:=s+y;
Inc(i)
end;
write (s:9:5);
readln;
end.

Что неясно - спрашивай.
marwell
Цитата(Lapp @ 21.11.2009 4:03) *

marwell, тебе не нужно вводить n - оно определяется точностью. Цикл for совсем лишний. И с типами чисел ты все перепутал - как могли быть x,y,z целыми? Речь же идет о вещественных. Кроме прочего, лучше использовать double вместо real. И последнее: не нужно отдельно считать числитель и знаменатель - будет короче, проще и надежнее (меньше вероятность переполнения).
Смотри, как надо:
var
i: integer;
x,y,s,e: double;

begin
write ('vvedite x: ');
readln (x);
write ('vvedite e: ');
readln (e);
y:=1;
s:=1;
i:=1;
while y>e do begin
y:=y*2*x/i;
s:=s+y;
Inc(i)
end;
write (s:9:5);
readln;
end.

Что неясно - спрашивай.

понятно.Но так как тема у меня циклы, то и прогу надо делать с циклами, обязательно
Lapp
Цитата(marwell @ 21.11.2009 21:59) *
понятно.Но так как тема у меня циклы, то и прогу надо делать с циклами, обязательно
ммм...
У меня возникло смутное подозрение, что ты хочешь сказать, что эта прога без цикла.
Тогда я сомневаюсь, что тебе на самом деле понятно..
marwell
Цитата(Lapp @ 22.11.2009 2:01) *

ммм...
У меня возникло смутное подозрение, что ты хочешь сказать, что эта прога без цикла.
Тогда я сомневаюсь, что тебе на самом деле понятно..

я имею ввиду, что надо делать с for, а не с inc
Lapp

Цитата(marwell @ 19.11.2009 21:37) *
училка говорит,что тут нужен while

Цитата(marwell @ 22.11.2009 10:01) *
я имею ввиду, что надо делать с for, а не с inc

Ну, и чему верить?

А теперь послушай.
Задачи такого типа НИКОГДА не решаются с циклом for. Если не веришь мне, спроси свою "училку". Это во-первых. Во-вторых, никто и никогда не станет всовывать в такую программу два цикла. Поэтому, если она сказала while, то значит этот while не вместо if, а вместо for. И если она и сказала "вместо if" то имела она в виду, что условие, которое в иф - оно должно быть в вайл.
marwell
Цитата(Lapp @ 21.11.2009 4:03) *

marwell, тебе не нужно вводить n - оно определяется точностью. Цикл for совсем лишний. И с типами чисел ты все перепутал - как могли быть x,y,z целыми? Речь же идет о вещественных. Кроме прочего, лучше использовать double вместо real. И последнее: не нужно отдельно считать числитель и знаменатель - будет короче, проще и надежнее (меньше вероятность переполнения).
Смотри, как надо:
var
i: integer;
x,y,s,e: double;

begin
write ('vvedite x: ');
readln (x);
write ('vvedite e: ');
readln (e);
y:=1;
s:=1;
i:=1;
while y>e do begin
y:=y*2*x/i;
s:=s+y;
Inc(i)
end;
write (s:9:5);
readln;
end.

Что неясно - спрашивай.

я ошибаюсь, или тут в этой строчке "y:=y*2*x/i;" числитель делится на очередное число, а не на факториал? этого числа?
volvo
Цитата
я ошибаюсь, или тут в этой строчке "y:=y*2*x/i;" числитель делится на очередное число, а не на факториал? этого числа?
Да, именно так и происходит, ты не ошибаешься. А теперь подумай, что произойдет, если на первой итерации поделим на 1, на второй на 2, на третьей на 3, и так далее? В итоге на что поделим?
marwell
Цитата(volvo @ 1.01.2010 18:22) *

Да, именно так и происходит, ты не ошибаешься. А теперь подумай, что произойдет, если на первой итерации поделим на 1, на второй на 2, на третьей на 3, и так далее? В итоге на что поделим?

и так далее на очередное число. Но ведь факториал это произведение, например если n=5 то 1*2*3*4*5?
Lapp
Цитата(marwell @ 1.01.2010 18:37) *
и так далее на очередное число. Но ведь факториал это произведение, например если n=5 то 1*2*3*4*5?

Да. Но

1/n! = 1/(1*2*3*..*n) = 1/1/2/3/../n
marwell
Цитата(Lapp @ 1.01.2010 19:05) *

Да. Но

1/n! = 1/(1*2*3*..*n) = 1/1/2/3/../n

я уже не знаю что делать wacko.gif училка говорит, что надо делать с while, но условие такое что пока разность между предыдущим и следующим меньше эпсилон dry.gif
Lapp
Цитата(marwell @ 1.01.2010 19:25) *
я уже не знаю что делать wacko.gif училка говорит, что надо делать с while, но условие такое что пока разность между предыдущим и следующим меньше эпсилон dry.gif

Супер-трудно. Вычитание же проходят в академии, да?..
Вот так попробуй:
var
i: integer;
x,y,s,e,d: double;

begin
write ('vvedite x: ');
readln (x);
write ('vvedite e: ');
readln (e);
y:=1;
s:=1;
i:=1;
d:=e+1;
while d>e do begin
d:=y;
y:=y*2*x/i;
d:=Abs(d-y);
s:=s+y;
Inc(i)
end;
write (s:9:5);
readln;
end.
marwell
Цитата(Lapp @ 1.01.2010 19:42) *

Супер-трудно. Вычитание же проходят в академии, да?..
Вот так попробуй:
var
i: integer;
x,y,s,e,d: double;

begin
write ('vvedite x: ');
readln (x);
write ('vvedite e: ');
readln (e);
y:=1;
s:=1;
i:=1;
d:=e+1;
while d>e do begin
d:=y;
y:=y*2*x/i;
d:=Abs(d-y);
s:=s+y;
Inc(i)
end;
write (s:9:5);
readln;
end.


спасибо большое smile.gif ну уж если она и это не примет, я молча врежу ей lol.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.