Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Вычислить с заданной точностью ε

Автор: marwell 20.11.2009 1:37

задали задачу 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 20.11.2009 16:25

Цитата(marwell @ 19.11.2009 21:37) *
Пробовал с while,но прога вычисляет неверно
Покажи вариант с while, плз.

Автор: Unconnected 21.11.2009 2:11

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

Автор: marwell 21.11.2009 3:00

Цитата(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 21.11.2009 8: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.

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

Автор: marwell 22.11.2009 1:59

Цитата(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 22.11.2009 6:01

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

Автор: marwell 22.11.2009 14:01

Цитата(Lapp @ 22.11.2009 2:01) *

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

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

Автор: Lapp 22.11.2009 16:10


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

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

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

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

Автор: marwell 1.01.2010 22:04

Цитата(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 1.01.2010 22:22

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

Автор: marwell 1.01.2010 22:37

Цитата(volvo @ 1.01.2010 18:22) *

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

и так далее на очередное число. Но ведь факториал это произведение, например если n=5 то 1*2*3*4*5?

Автор: Lapp 1.01.2010 23:05

Цитата(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 1.01.2010 23:25

Цитата(Lapp @ 1.01.2010 19:05) *

Да. Но

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

я уже не знаю что делать wacko.gif училка говорит, что надо делать с while, но условие такое что пока разность между предыдущим и следующим меньше эпсилон dry.gif

Автор: Lapp 1.01.2010 23:42

Цитата(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 2.01.2010 0:45

Цитата(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