Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Помогите с решением задачи с циклом while...


Автор: ZimAN 23.1.2008, 00:38
Помогите пожалуйста. Вот такая задача:

Даны действительные числа x, Е (x<>0, E > 0). Вычислить с точностью E:

http://radikal.ru/F/i007.radikal.ru/0801/aa/f3a00c916c37.jpg.html

Считать, что требуемая точность достигнута, если очередное слагаемое оказалось по модулю меньше, чем E, - это и все последующие слагаемые можно уже не учитывать.

Помогите пожалуйста, 2 дня мучаюсь, ничего не выходит...

Заранее благодарен.

Автор: source777 23.1.2008, 00:56
Цитата(ZimAN @  23.1.2008,  00:38 Найти цитируемый пост)
Помогите пожалуйста, 2 дня мучаюсь, ничего не выходит...

А в чём проблема то?
Код

program CalcSum;

{$APPTYPE CONSOLE}

var e, x, df: real;
k: integer = 0;
res: extended = 0;
begin
  e:=1e-10;
  x:=1.5;
  df:=1;
  while (df>=e) do
  begin
    res:=res+df;
    df:=df*x*x/(k+1)/2;
    inc(k);
  end;
  Writeln(k);
  Write(res:15:15);
  Readln;
end.


Автор: volvo877 23.1.2008, 01:08
Цитата(source777 @  22.1.2008,  23:56 Найти цитируемый пост)
А в чём проблема то?

В том, что во-первых, здесь - не Дельфи, а Паскаль... Переписывать все библиотеки тоже будешь, чтобы твоя программа хотя бы компилировалась?

А во-вторых, ZimAN, не надо считать факториалы и степень каждый раз с начала и до конца - тысячу раз говорилось: ДОМНОЖАЕМ на очередной итерации текущий член на <что-то>... Вот выведи, что есть это самое <что-то>, а потом берись за реализацию...

Автор: ZimAN 23.1.2008, 15:53
Код

Program qwerty;
uses crt;
var x,E,i,k: integer;
    R,Rez:real;
    Factorial:longint;
    begin
clrscr;
write ('Vvedite E>0 - ');
readln (E);
write ('Vvedite x - ');
readln (x);
Rez:=0;
k:=0;
Factorial:=1;
for i:=1 to k do Factorial:=Factorial*i;
R:=(exp(2*k*ln(x)/(exp(k*ln(2))*Factorial)));
while abs(R)>E do
begin
Rez:=Rez+(exp(2*k*ln(x)))/((exp(k*ln(2))*Factorial));
k:=k+1;
end;
Writeln ('Rez=', Rez:8:2); readkey;
end.



вот что у меня выходит, знаю что это не правильно... помогите, исправьте пожалуйста мои ошибки...  єто запускается, но Результат всегда равен 0.  

Автор: source777 23.1.2008, 21:41
ZimAN,  а чем тебя мой код не устаивает?  Убери {$APPTYPE CONSOLE} и будет тебе Паскаль, а не Delphi... Возитесь с этим Паскалем, как с писанной торбой, пора уж забыть о нём...

Автор: mmvds 23.1.2008, 22:08
Угу, у тебя всегда к=0, да и факториал не считался.
Вот отредактировал твой код, вроде работает smile
И кстати longint может хранить корректное значение только до 12 факториал = 479001600, т.е. всего при вычислениях будет не более 12 итераций, поэтому не для всех e и x будет работать прога.
Например, e=0.1, x=1.4 - работает smile
Код

Program qwerty;
uses crt;
var i,k:integer;
    x,E,Rez,l,R:real;
function Factorial(k:integer):longint;
begin
if k=1 then factorial:=1 else factorial:=factorial(k-1)*k;
end;
begin
  clrscr;
  write ('Vvedite E>0 - ');
  readln(E);
  write ('Vvedite x - ');
  readln (x);
  k:=0;
  Rez:=1;R:=1;
while abs(R)>=E do
begin
  k:=k+1;
  R:=exp(2*k*ln(x))/(exp(k*ln(2))*Factorial(k));
  Rez:=Rez+R;
end;
  Writeln ('Rez=', Rez:8:2);
  Writeln ('k=', k:5);
  readln;
end.


Добавлено через 8 минут и 21 секунду
Цитата(source777 @  23.1.2008,  21:41 Найти цитируемый пост)
ZimAN,  а чем тебя мой код не устаивает?  Убери {$APPTYPE CONSOLE} и будет тебе Паскаль, а не Delphi... Возитесь с этим Паскалем, как с писанной торбой, пора уж забыть о нём... 

Объясните плиз, как формулу выше преобразовали до такого:
Код

  while (df>=e) do
  begin
    res:=res+df;
    df:=df*x*x/(k+1)/2;
    inc(k);
  end;

Автор: source777 23.1.2008, 23:53
Цитата(mmvds @  23.1.2008,  22:08 Найти цитируемый пост)
Объясните плиз, как формулу выше преобразовали до такого:

разделил k+1 член ряда на k-ый...
Кстати ещё лучше будет так:
Код

  while (df>=e) do
  begin
    res:=res+df;
    inc(k);
    df:=df*x*x/(k shl 1);
  end;

Автор: ZimAN 24.1.2008, 00:52
спасибо за помощь, но меня интересует еще один вопрос:

в условии задачи сказано, что "считать, что требуемая точность достигнута, если очередное слагаемое оказалось по модулю меньше, чем Е, - это и все последующие слагаемые можно уже не учитывать" .
Но  при перепроверке на листке бумаги и обнаружил , что программа не отбрасывает первое слагаемое , которое является меньшим чем Е.. В условии пишет ----- """ - это и все последующие не учитывать""", то есть если ввести Е=1 и Х=1, то в итоге результат Rez=1.5, а не 1.    0,5 , которое является меньшим чем Е(1) не отбрасывет ... 

как это исправить ? 






если что-то путаю, то извините..



Автор: source777 24.1.2008, 01:06
Мля, ZimAN, я для кого правильный код писал? что ты тупишь?

Автор: mmvds 24.1.2008, 08:55
Цитата(source777 @  24.1.2008,  01:06 Найти цитируемый пост)
Мля, ZimAN, я для кого правильный код писал? что ты тупишь? 

Спокойнее, для начала тоже проверьте на бумажке, подставляя в исходную формулу.
x=1 E=1
K=0
Первое слагаемое=1, сумма=1; 1 не меньше 1 (по условию именно < а не <=), значит считаем далее
K=1
Второе слагаемое=0.5, сумма=1,5; 0,5<1, значит результат найден - 1,5

Что собственно и считает моя прога, у Вас source777, результат равен 1.

Цитата(ZimAN @  24.1.2008,  00:52 Найти цитируемый пост)
что программа не отбрасывает первое слагаемое , которое является меньшим чем Е

С каких пор 1<1 - истина?

Автор: mmvds 24.1.2008, 09:15
А все, извиняюсь, еще не проснулся smile

Если есть желание, переставь местами строчки
R:=exp(2*k*ln(x))/(exp(k*ln(2))*Factorial(k)); и Rez:=Rez+R; и Rez:=1 замени на Rez:=0

Код source777 действительно правильнее, т.к. позволяет считать с большим К, затрачивая меньше вычислений, лучше использовать его.
Цитата

разделил k+1 член ряда на k-ый...

Действительно smile С делфей совсем отучился от оптимизации :(

Автор: volvo877 24.1.2008, 14:38
Цитата(source777 @  23.1.2008,  20:41 Найти цитируемый пост)
а чем тебя мой код не устаивает? 

Вот не устраивает, и все тут. Во-первых, ты когда исправляешь - хотя бы говорил об этом, а то втихую поправил и все тут, и мой пост как-бы вообще ни при чем, да? А во-вторых, если уж ты снизошел до ответов в разделе Паскаль, то будь добр поставить себе компилятор Паскаля (а не Дельфи в консольном режиме) и откомпилировать то, что ты привел. Получилось? Я тебе безо всякого компилятора скажу, что НЕТ.

Цитата(source777 @  23.1.2008,  20:41 Найти цитируемый пост)
Возитесь с этим Паскалем, как с писанной торбой, пора уж забыть о нём... 
Тебя сюда что, кто-то под дулом автомата загнал? Не нравится - вообще не заходи в раздел, чего ты СЮДА-то явился, если пора забыть? Забудь уже тогда...

Автор: source777 24.1.2008, 21:01
Цитата(volvo877 @  24.1.2008,  14:38 Найти цитируемый пост)
 Во-первых, ты когда исправляешь - хотя бы говорил об этом, а то втихую поправил и все тут, и мой пост как-бы вообще ни при чем, да?
Почему втихую, там в конце поста есть такая приписка \"Это сообщение отредактировал(а) source777 - 23.1.2008, 01:36\" Обрати внимание! твоего поста я не заметил, уж извини...

Цитата

Я тебе безо всякого компилятора скажу, что НЕТ.
Ты лучше скажи какие ошибки компиляции, а я так и быть скажу как их исправить, раз уж тебе так \"сложно\" их самому исправить...
Хотя я думаю, что это:
Код

program CalcSum;

uses crt;

var e, x, df: real;
k: integer = 0;
res: real = 0;
begin
  clrscr;
  e:=1e-10;
  x:=1.5;
  df:=1;
  while (df>=e) do
  begin
    res:=res+df;
    inc(k);
    df:=df*x*x/(k shl 1);
  end;
  Writeln(k);
  Write(res:15:15);
  Readln;
end.
 итак скомпилируется...


Цитата(volvo877 @  24.1.2008,  14:38 Найти цитируемый пост)
Не нравится - вообще не заходи в раздел, чего ты СЮДА-то явился, если пора забыть? Забудь уже тогда...
О, скажи-ка как сделать, чтобы отображались все новые сообщения на форуме, исключая подраздел \"Паскаль\", и я тебя больше не потревожу... Зачем брюзжать то? 

Автор: orthrus 25.1.2008, 04:48
Цитата(source777 @  24.1.2008,  21:01 Найти цитируемый пост)
О, скажи-ка как сделать, чтобы отображались все новые сообщения на форуме, исключая подраздел \"Паскаль\", и я тебя больше не потревожу... Зачем брюзжать то? 


Мой профиль->Отображение разделов->Там дальше наверное поймешь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)