Форум программистов, компьютерный форум CyberForum.ru

Найти сумму ряда при введении с клавиатуры числа n - C++

Восстановить пароль Регистрация
 
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
16.12.2012, 18:11     Найти сумму ряда при введении с клавиатуры числа n #1
Дан ряд
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{n=o}^{k}\frac{{(-1)}^{n}}{(2n+1){2}^{2n+1}}

Первое задание: программа без рекурсии.
Вот что получилось, но вычисляется неправильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <conio.h>
 
using namespace std;
 
double series (int n);
 
// функция интерфейса
 
int main()
{
    int number_n;
    cout << "Vvedite polozhitelnoe chislo n >= 0 : ";
    cin >> number_n;
        if ( number_n < 0)
        {
            cout << "\nVvedeno otricatelnoe chislo\n";
            _getch();
            exit(1);
        }
        else 
        cout << "\nSumma ryada ravna : ";
        cout << series (number_n);
    _getch();
    return 0;
}
 
// функция вычисления суммы ряда
 
double series (int n)
{
    int zn = 1, i;
    i = 1;
    double res = 0.5; // первый член ряда при n=0 равен 0,5
    while ( zn <= n)
    {
        i+=2;
        res += (-1)^zn/i*2^i;
        zn++;
    }
    return res;
}
Добавлено через 1 час 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double series (int n)
{
    int zn = 1, i;
    i = 1;
    double res = 0.5; // первый член ряда при n=0 равен 0,5
    while ( zn <= n)
    {
        i+=2;
        res += (-1)^zn/i*2^i;
        zn++;
    }
    return res;
}
Почему при вычислении res, знаменатель вообще не учитывается, может ввести еще одну функцию???

Добавлено через 1 час 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
float series (int n)
{
    int zn = 1, i = 1;
    float slag = 0;
    float res = 0.5;
    float chis = pow(abs(-1),zn);
    float znam = i*pow(2,i); 
    while ( zn <= n)
    {
        i+=2;
        //slag = (-1)^zn/i*2^i;
        //slag = pow(abs(-1),zn)/i*pow(2,i);
        slag = chis/znam;
        res = res + slag;
        zn++;
    }
    return res;
}
уже и так делаю, знаменатель просто игнорируется((( все вычисляется, но без знаменателя
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 18:11     Найти сумму ряда при введении с клавиатуры числа n
Посмотрите здесь:

вводятся числа a и b. Надо найти сумму таких чисел в диапазоне [a;b], которые при возведении в квадрат дают число с последней цифрой 6. C++
C++ При использовании оператора GOTO зацикливается программа при введении букв.
C++ Найти сумму цифр заданного с клавиатуры числа
Даны действ числа. вычислить с заданной точностью сумму ряда C++
C++ Введя числа с клавиатуры без ограничения их количества (конец ввода - число ноль), найти сумму положительных и произведение отрицательных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
16.12.2012, 18:11     Найти сумму ряда при введении с клавиатуры числа n #2
вот моя версия:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <math.h>
using namespace std;
 
int main () {
    double n, s = 0, i;
    cin >> n;
    for(i = 0; i <= n; i++)
        s += (pow(-1, i)) / ((2 * i + 1) * (pow(2, 2 * i + 1)));
    cout << s << endl;
return 0;
}
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
17.12.2012, 18:12  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #3
Оказалось все так просто(, но хотелось бы через условие while

Добавлено через 17 минут
Цитата Сообщение от vizapromo Посмотреть сообщение
вот моя версия:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <math.h>
using namespace std;
 
int main () {
    double n, s = 0, i;
    cin >> n;
    for(i = 0; i <= n; i++)
        s += (pow(-1, i)) / ((2 * i + 1) * (pow(2, 2 * i + 1)));
    cout << s << endl;
return 0;
}
спасибо большое, через цикл while все прекрасно работает.
Теперь займемся рекурсией.

Добавлено через 3 часа 34 минуты
А как теперь из этого сделать рекурсию?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <conio.h>
#include <math.h>
#include <windows.h>
using namespace std;
 
double series (int n);
 
// функция интерфейса
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int number_n;
    cout << "Введите положительное число n : ";
    cin >> number_n;
        if ( number_n < 0)
        {
            cout << "\nВведенно отрицательное число.\n";
            _getch();
            exit(1);
        }
        else 
        cout << "\nСумма ряда равна : " << series (number_n);
    _getch();
    return 0;
}
 
// функция вычисления суммы ряда
 
double series (int n)
{
    double  res, i;
    res = i = 0;
    while ( i <= n)
    {
        res += (pow(-1, i)) / ((2 * i + 1) * (pow(2, 2 * i + 1)));
        i++;
    }
    return res;
}
Добавлено через 11 часов 42 минуты
по поводу рекурсии, есть такие соображения:
при n=0, слагаемое равно 0,5, значит можно записать
C++
1
2
if (f == 0) 
             return 0.5;
а дальше.....
если подставлять n, то получим ряд следующего вида:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{1}{1*{2}^{1}}-\frac{1}{3*{2}^{3}}+\frac{1}{5*{2}^{5}}-\frac{1}{7*{2}^{7}}+\frac{1}{9*{2}^{9}}-...
Видно, что i+=2. Тогда ряд можно представить следующим образом:
http://www.cyberforum.ru/cgi-bin/latex.cgi?(\frac{1}{5*{2}^{5}}-\frac{1}{3*{2}_{3}})+(\frac{1}{9*{2}^{9}}-\frac{1}{7*{2}^{7}})+...
Видно, что можно использовать рекурсивную функцию, но как???

Добавлено через 2 часа 51 минуту
как же сделать рекурсию??????

Добавлено через 2 часа 27 минут
Может отдельную функцию для разности???

Добавлено через 2 часа 53 минуты
Люди добрые, отзовитесь!!!!!
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
17.12.2012, 18:41     Найти сумму ряда при введении с клавиатуры числа n #4
Вот версия с рекурсией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
double f(int n, int k){
    if(n > k)
        return 0;
    double a = 1, b = 1, i;
    for(i = 1; i <= n; i++)
        a *= -1;
    for(i = 1; i <= 2 * n + 1; i++)
        b *= 2;
    b *= (2 * n + 1);
    return f(n + 1, k) + (a / b);
}
 
int main(){
    int n, k;
    cin >> n;
    cout << f(0, n) << endl;
    return 0;
}
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
17.12.2012, 19:10  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #5
vizapromo, спасибо большое, буду разбираться

Добавлено через 7 минут
Цитата Сообщение от vizapromo Посмотреть сообщение
double f(int n, int k)
а что такое k?
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
17.12.2012, 19:13     Найти сумму ряда при введении с клавиатуры числа n #6
Да не обращайте на это внимания Ирина., я по началу во примеру по ошибке K ввел, и потом по ходу исправлено.
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
17.12.2012, 19:21  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #7
vizapromo, я в смысле - для чего переменная эта нужна? подсчитывает сколько раз вызывается рек. функция?
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
17.12.2012, 19:27     Найти сумму ряда при введении с клавиатуры числа n #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include "iostream"
#include "cmath"
using namespace std;
 
double Series(int n, int k);
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    
    int n, k;
    double sum;
 
    cout << "Введите n: ";  cin >> n;   // 0
    cout << "Введите k: ";  cin >> k;
 
    sum = Series(n, k);
 
    cout << sum << endl;
    
    system("pause");
    return 0;               
}
 
double Series(int n, int k)
{
    double sum = 0.0;
 
    for (int i=n; i<=k; i++)
        sum = sum + pow(-1.0, i) / (2.0*i + 1.0) * pow(2.0, 2*i+1.0);
 
    return sum;
}
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
17.12.2012, 19:39  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #9
v.a.l.i.d, но это не рекурсивная функция, она сама себя не вызывает.... А вот эта

Цитата Сообщение от vizapromo Посмотреть сообщение
#include <iostream>
using namespace std;
double f(int n, int k){
* * if(n > k)
* * * * return 0;
* * double a = 1, b = 1, i;
* * for(i = 1; i <= n; i++)
* * * * a *= -1;
* * for(i = 1; i <= 2 * n + 1; i++)
* * * * b *= 2;
* * b *= (2 * n + 1);
* * return f(n + 1, k) + (a / b);
}
int main(){
* * int n, k;
* * cin >> n;
* * cout << f(0, n) << endl;
* * return 0;
}
есть то что надо, но непонятно мне!!!!
зачем k? почему i начинает с единицы (i=1)...
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
17.12.2012, 19:46     Найти сумму ряда при введении с клавиатуры числа n #10
Цитата Сообщение от irina3456 Посмотреть сообщение
но непонятно мне!!!!
Это надо у автора программы спросить)
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
17.12.2012, 20:09     Найти сумму ряда при введении с клавиатуры числа n #11
f(n, k) <=> for(n = 0; n <= k; n++)
просто у меня функции степени отдельно
для них еще одна переменная
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
17.12.2012, 21:02  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #12
тогда непонятно, зачем а? кажется значение всегда отрицательное?

Добавлено через 3 минуты
ой, сори))) знак а чередуется

Добавлено через 16 минут
C++
1
return f(n + 1, k) + (a / b);
vizapromo, получается, что после первого прохода return возвращает первое слагаемое + вызывает себя же, но для второго прохода, чтобы получить второе слагаемое f(n + 1, k), значит параметр n в функции f как счетчик для подсчета количества слагаемых? Я правильно понимаю?
И не понятно как получается первое слагаемое, знак положительный, а при i=1, a=-1?
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
17.12.2012, 21:38     Найти сумму ряда при введении с клавиатуры числа n #13
Да примерно так. А на счет 2-ого вашего вопроса: Мы вызываем f(0, n) - это т.е в функции double(int n, int k) - у нас
n = 0, значит там цикл ток 1 раз повторяется, т.е b получается равно 2, а т.к там a / b <=> a = 1, b = 2 т.е 1/2.
Извиняюсь за долгие ответы, я не сижу перед компом данное время, а изредка проверяю...

Добавлено через 1 минуту
return f(n + 1, k) + (a / b) - на 1-ом шаге как бы будущий элемент неизвестен, поэтому получается только a / b;
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
18.12.2012, 10:52  [ТС]     Найти сумму ряда при введении с клавиатуры числа n #14
vizapromo, спасибо вам большое
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 13:23     Найти сумму ряда при введении с клавиатуры числа n
Еще ссылки по теме:

Вылетает при введении данных в структуру. C++
Написать программу, которая выводит квадрат, введенного с клавиатуры, числа в диапазоне от 0 до 10 включительно. При введении отрицательного числа осу C++
При введении шаблона игнорируются ошибки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vizapromo
 Аватар для vizapromo
18 / 11 / 1
Регистрация: 04.12.2012
Сообщений: 51
18.12.2012, 13:23     Найти сумму ряда при введении с клавиатуры числа n #15
Всегда пожалуйста. Обращайтесь
Yandex
Объявления
18.12.2012, 13:23     Найти сумму ряда при введении с клавиатуры числа n
Ответ Создать тему
Опции темы

Текущее время: 13:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru