Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с решением задачи с циклом while... Вычислить с точностью Е 
:(
    Опции темы
ZimAN
  Дата 23.1.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Помогите пожалуйста. Вот такая задача:

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

user posted image

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

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

Заранее благодарен.
PM MAIL   Вверх
source777
Дата 23.1.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 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.



Это сообщение отредактировал(а) source777 - 23.1.2008, 01:36


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
volvo877
Дата 23.1.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



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

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

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

PM MAIL   Вверх
ZimAN
  Дата 23.1.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Код

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.  

Это сообщение отредактировал(а) ZimAN - 23.1.2008, 15:54
PM MAIL   Вверх
source777
Дата 23.1.2008, 21:41 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mmvds
Дата 23.1.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



Угу, у тебя всегда к=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;

PM MAIL ICQ   Вверх
source777
Дата 23.1.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



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



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
ZimAN
Дата 24.1.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



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

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

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






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



PM MAIL   Вверх
source777
Дата 24.1.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mmvds
Дата 24.1.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



Цитата(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 - истина?
PM MAIL ICQ   Вверх
mmvds
Дата 24.1.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



А все, извиняюсь, еще не проснулся 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 С делфей совсем отучился от оптимизации :(

Это сообщение отредактировал(а) mmvds - 24.1.2008, 09:20
PM MAIL ICQ   Вверх
volvo877
Дата 24.1.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



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

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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(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 Найти цитируемый пост)
Не нравится - вообще не заходи в раздел, чего ты СЮДА-то явился, если пора забыть? Забудь уже тогда...
О, скажи-ка как сделать, чтобы отображались все новые сообщения на форуме, исключая подраздел \"Паскаль\", и я тебя больше не потревожу... Зачем брюзжать то? 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
orthrus
Дата 25.1.2008, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: нет
Всего: 16



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


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


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.