Другие языки программирования и технологии

как написать такую программу для c++?

Учусь писать на языке c++, дали задание написать такую программу, как - нет идей совершенно. Сможет ли кто нибудь мне помочь?
Необходимо написать программу, чтобы она считала сумму S.
double x, eps, s = 0.0, t = 1.0;
long i = 0;
cin >> x >> eps;
if (x <= -1.0 || x > 1.0) { cout << "решения не существует"; return 0; }
do {
double q = (t *= x) / ++i;
s = q - s;
} while (abs(q) >= eps);
cout << (s * x < 0 ? -s : s);

Если же нужно не до точности eps, а кол-во членов ряда, то меняем цикл do - while на:

for (int i = 1; i <= n; ++i) { s = (t *= x) / i - s; }
Леонид Сайков
Леонид Сайков
89 429
Лучший ответ
Oppus ;ll if (x <= 1.0 || x > 1.0) { cout << "решения не существует"; return 0; } // то есть, ни-ког-да!
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << "x: ";
double x;
cin >> x;
cout << "n: ";
unsigned n;
cin >> n;
double s = 0;
for (unsigned i = 1; i <= n; ++i) {
double m = pow(x, i) / i;
if (i & 1) s += m;
else s -= m;
}
cout << "s: " << fixed << setprecision(15) << s << endl;
system("pause");
}
Андрей Юданов
Андрей Юданов
54 878
Максим Борзунов вот такая ошибка
Юра Петренко Надо было еще преобразовать i к дабл иначе будет предупреждение.
pow(x, i) / i

P.S. А зачем if если там достаточно просто добавить умножение на -1 в степени i-1 тогда знак не зачем будет определять...
P/S/ что то давно я не программировал на плюсах...
#include "iostream"
using namespace std;
int main(){
int n; double x,s=0,t=-1; cout<<"x n: "; cin>>x>>n;
for(int i=1;i<=n;i++)s+=t*=-x/i; cout<<"S="<<s<<endl;}
циклом
ОМ
Олег Малой
93 962
Ограниченный ряд Меркатора. Тут х и n можно брать любыми, так как не сказано, что нужно вычислять значение функции у (х) =ln(1+x) на (-1;1]. При |х|>1 будет просто вычисляться какая-то ерунда, а при достаточно больших n пойдут ещё и inf'ы! Но в задании требуется именно найти ограниченную сумму ряда, а не искать чего-то там ещё или ограничивать возможный диапазон для аргумента х! Что тут непонятного?

А сравнивать вычисляемую сумму с ln(1+x) всё равно интересно. На выводе будем писáть значения суммы ряда, ln(1+x) и относительную ошибку вычислений:

#include "iostream"

#include "cmath"

using namespace std; int main()

{ double k,lo,n,s,t,x,y; for(;;) { cout <<

"x n > "; cin >> x >> n; lo=log(1+x); if (n==1) s=x; else { s=1; t=-x; y=1; for (k=2; k <= n; k++) { y*=t; s+=y/k; } s*=x; } cout.precision(15);

cout << s << ' ' << lo << ' ' << s/lo-1 << '\n';

} }

Как видно, никакие степени pow и eps'ы здесь совершенно неуместны! А теперь смотрим, что получается при х=1. При n=1000000000 ошибка вычисленного значения в сравнении с истинным значением ln2 равна всего -7.2е-10 - это довольно таки хорошая точность! Интересно поведение суммы при х=-1. С увеличением n она уменьшается до больших отрицательных величин ≈-ln n впрочем как и должно быть.
НN
Нурик Nurik
28 648
Это головоломка, а не пример для обучения.
Леонид Сайков Это абсолютно СТАНДАРТНЫЙ пример для обучения, который дают на программировании в любом техническом ВУЗ'е.
Виссарион Ким И, замечу, очень простой по сравнению с другими на суммирование рядов.