Форум «Всё о Паскале» _ Задачи _ Вычислить с заданной точностью ε
Автор: marwell 20.11.2009 1:37
задали задачу может, кто сможет помочь? я написал программу
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,но прога вычисляет неверно } 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
я уже не знаю что делать училка говорит, что надо делать с while, но условие такое что пока разность между предыдущим и следующим меньше эпсилон
Автор: Lapp 1.01.2010 23:42
Цитата(marwell @ 1.01.2010 19:25)
я уже не знаю что делать училка говорит, что надо делать с while, но условие такое что пока разность между предыдущим и следующим меньше эпсилон
Супер-трудно. Вычитание же проходят в академии, да?.. Вот так попробуй:
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.
спасибо большое ну уж если она и это не примет, я молча врежу ей