Консультация № 173146
10.10.2009, 23:39
0.00 руб.
0 16 1
Добрый вечер уважаемые эксперты. Задача такая же как и в вопросе №173066 только другая формула. Пожалуйста помогите.

Обсуждение

Неизвестный
10.10.2009, 23:40
общий
http://s58.radikal.ru/i162/0910/85/03654c5123a8.jpg
Неизвестный
11.10.2009, 01:32
общий
это ответ
Здравствуйте, Dimon4ik.
C++. MS VS 2008.
Код:

#include <iostream>
#include <cmath>

const double eps=1.0e-4;

using namespace std;

// Рекуррентная формула реализована здесь
// fPrev - предыдущий член ряда A(n)
// n - номер предыдущего члена ряда
// Возвращает A(n+1)
double fNext(double fPrev,size_t& n)
{
double res;
if(n)
{
// A(n+1)=A(n)*(n+1)^2/(n^2*(5*n-2)*(5*n-1)*5*n*(5*n+1)*(5*n+2))
// res=A(n)*(n+1)^2/n^2
res=fPrev*pow(1.0+1.0/n,2.0);
// Далее последовательно делим на (5*n-2),(5*n-1),...,(5*n+2)
for(size_t i=0,div=5*n-3;i<5;++i)
{
res/=++div;
}
}
else
{
// Если n==0(т.е. первый член последовательности)
res=0.5;
}
// Инкрементируем номер члена
++n;
return res;
}

int main()
{
setlocale(LC_ALL,"russian");
// Сумма
double sum=0.0;
// Последний просуммированный член
double last=0.0;
// Счетчик членов
size_t count=0;
do
{
sum+=last=fNext(last,count);
}while(last>eps);// Условие выхода: последний просуммированный не больше требуемой точности
cout<<"Просуммировано членов:"<<count<<endl
<<"Сумма:"<<sum<<endl;
system("PAUSE");
return 0;
}

Результат:
Код:

Просуммировано членов:3
Сумма:0.500794
5
Большое спасибо за все.
Неизвестный
11.10.2009, 11:40
общий
Micren:
Спасибо, просто для наглядности, можете написать как выглядит выведенная формула в математическом виде?
Неизвестный
11.10.2009, 11:44
общий
И немного коментариев в ту часть где реализована реккурентная формула в программе.
Неизвестный
11.10.2009, 12:11
общий
Dimon4ik:
Формула выглядит посложнее чем в предыдущем задании.
A(n+1)=A(n)*(n+1)2/(5*n3*(25*n2-4)*(25*n2-1))
Неизвестный
11.10.2009, 12:18
общий
Dimon4ik:
Добавил комментарии на функцию
Неизвестный
11.10.2009, 14:51
общий
Вот это условие не пойму:
if(n)
Что оно с чем сравнивает?
И еще, что здесь:
for(size_t i=0,div=5*n-3;i<5;++i)
означает size_t ?
Просто конструкция для меня совсем не знакома...
Неизвестный
11.10.2009, 14:52
общий
Тоесть условие не равно 0?
Неизвестный
11.10.2009, 14:53
общий
Добрый день, господа! Dimon4ik пишет:
Задача такая же как и в вопросе №173066 только другая формула
. На самом деле требуется вычислить 8 членов, поэтому решение с эпсилон не совсем корректное.
Неизвестный
11.10.2009, 15:05
общий
Dimon4ik:
1.
В <stddef.h> есть такие строчки (TurboC 2.0)
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif

2. if (n) <=> if (n!=0)
Неизвестный
11.10.2009, 15:09
общий
leonid59:
На счет первого пункта, а что они означают в данной программе?
Неизвестный
11.10.2009, 15:11
общий
size_t& n
Этот аргумент функции что означает.
Неизвестный
11.10.2009, 16:04
общий
Dimon4ik:
Тип size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является результатом выполнения оператора sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной - 64-бита. Другими словами в переменную типа size_t может быть безопасно помещен указатель. Исключение составляют указатели на функции классов, но это особый случай. Тип size_t обычно применяется для счетчиков циклов, индексации массивов, хранения размеров, адресной арифметики.

RealCoding.net

Параметр n передается в функцию по ссылке
Неизвестный
11.10.2009, 16:14
общий
leonid59:
Спасибо. Теперь более менее ясней картина стала
Неизвестный
11.10.2009, 16:58
общий
Micren:
Я так понимаю что это Вы делаете чтобы не потерять номер члена после выполнения функции?
Неизвестный
11.10.2009, 17:18
общий
Dimon4ik:
Цитата: 218629
Я так понимаю что это Вы делаете чтобы не потерять номер члена после выполнения функции?

Всю обработку и инкремент номера члена вынес в одну функцию. Естественно после выполнения функции номер члена сохраняется.
Форма ответа