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

Сумма ряда с заданной точностью - C++

Восстановить пароль Регистрация
 
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
11.10.2010, 17:54     Сумма ряда с заданной точностью #1
Помогите пожалуйста, уже не знаю что и делать, неправильно решает программа...
Для х ( -25 < x < 25) составить функцию, которая вычисляет сумму ряда с заданной точностью 0<eps<=1 . Считать, что требуемая точность достигнута, если очередное слагаемое оказалось по модулю меньше чем eps. Функция в качестве результата должна вернуть вычисленную сумму, количество учтенных слагаемых и последнее слагаемое, которое было включено в сумму.
В вызывающей функции main() организовать контроль ввода чисел x и eps.


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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <math.h>
using namespace std;
double calculate_for(const double , const double , int& , double& );
double calculate_while(const double , const double , int& , double& );
double calculate_do_while(const double , const double , int& , double& );
bool repeat (void);
void main (void)
{
        double x, eps, result, summand;
        int numbers_of_summands;
 
        do
        {
            do
            {
                cout << "Input X (-25<X<25): ";
                cin >> x;
 
                if (x>25 || x<-25)
                    cout << "\n\nX must be (-25;25), try again...\n\n";
            }
            while(x>25 || x<-25);
 
            do
            {
                cout << "Input epselent (0<EPS<=1]: ";
                cin >> eps;
 
                if (eps<=0 || eps>1)
                    cout << "\n\nEpselent (0;1], try again...\n\n";
            }
            while(eps<=0 || eps>1);
 
            cout << "\n\nMenu" << "\nfor-press 1" << "\nwhile-press 2" << "\ndo_while-press 3" << "\nquit-press 0\n";
            int number;
            cin >> number;
            switch (number)
            {
                case 1: calculate_for(x, eps, numbers_of_summands, summand); break;
                case 2: calculate_while(x, eps, numbers_of_summands, summand); break;
                case 3: calculate_do_while(x, eps, numbers_of_summands, summand); break;
                case 0: exit(0);
            }
            if (number=1)
                result=calculate_for(x, eps, numbers_of_summands, summand);
            if (number=2)
                result=calculate_while(x, eps, numbers_of_summands, summand);
            if (number=3)
                result=calculate_do_while(x, eps, numbers_of_summands, summand);
            
            cout << "Result: " << result << "\nNumber of summands: " << numbers_of_summands << "\nLast summand: " << summand;
        }
        while(repeat());
}
 
bool repeat (void)
{
        char symbol;
 
        cout << "\n\nTry again? Yes/No: ";
        cin >> symbol;
 
        if ((char)tolower(symbol)=='y')
        return 1;
        else
        return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <math.h>
double calculate_for(const double x, const double eps, int& numbers_of_summands, double& summand)
{
    numbers_of_summands=1;
    double a=-4*x-x*x;
    double b=2;
    summand=-x*(4+x)/2;
    double result=summand;
    int i, p=1;
    for (i=2;fabs(summand)>=eps;i++)
    {
        a+=powf(-1, p)*2*i*x;
        b*=2*i;
        summand=a/b;
        if(i%2==0)
            p++;
                
        result+=summand;
        numbers_of_summands=i;
    }
    return result;
}
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
#include <math.h>
double calculate_while(const double x, const double eps, int& numbers_of_summands, double& summand)
{
    numbers_of_summands=1;
    double a=-4*x-x*x;
    double b=2;
    summand=a/b;
    double result=summand;
    int i=2, p=1;
    do
    {
        a+=powf(-1, p)*2*i*x;
        b*=2*i;
        summand=a/b;
        if(i%2==0)
            p++;
                
        result+=summand;
        numbers_of_summands=i;
        i++;
    }
    while (fabs(summand)>=eps);
    return result;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <math.h>
double calculate_do_while(const double x, const double eps, int& numbers_of_summands, double& summand)
{
    numbers_of_summands=1;
    double a=-4*x-x*x;
    double b=2;
    summand=a/b;
    double result=summand;
    int i=2, p=1;
    while (fabs(summand)>=eps)
    {
        a+=powf(-1, p)*2*i*x;
        b*=2*i;
        summand=a/b;
        if(i%2==0)
            p++;
                
        result+=summand;
        numbers_of_summands=i;
        i++;
    }
    return result;
}
Добавлено через 1 час 35 минут
Вот изображение
Миниатюры
Сумма ряда с заданной точностью  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.10.2010, 21:59     Сумма ряда с заданной точностью #2
Ваш код не смотрел.
Проверяйте.

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <math.h>
 
double series(double x, double epsilon, int *n, double *last);
 
int main()
{
    double x;
    double epsilon;
    double last;
    int n;
 
    while (1)
    {
        printf("Enter x (-25 < x < 25): ");
        scanf("%lf", &x);
 
        if (x < -25.0 || x > 25.0)
            printf("x must be in range of -25 to 25");
        else
            break;
    }
 
    while (1)
    {
        printf("Enter epsilon (0 < epsilon <= 1): ");
        scanf("%lf", &epsilon);
 
        if (epsilon <= 0.0 || epsilon > 1.0)
            printf("epsilon must be in range of 0 to 1");
        else
            break;
    }
 
    printf("Sum of series: %lf", series(x, epsilon, &n, &last));
    printf("\nNumber of terms: %d", n);
    printf("\nLast term: %lf", last);
 
    getch();
    return 0;
}
 
double series(double x, double epsilon, int *n, double *last)
{
    double sum;
    double an;
    int den;
    int k;
    int sign;
 
    sum = 0.0;
    k = 4;
    den = 1;
    sign = -1;
 
    do
    {
        an = sign * x * (k + x);
        an /= 2 * den;
        k += 4;
        den *= k / 4;
 
        if ((k / 4) % 2 == 0)
            sign *= -1;
 
        sum += an;
    }
    while (fabs(an) >= epsilon);
 
    *n = k / 4;
    *last = an;
 
    return sum;
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
11.10.2010, 23:08  [ТС]     Сумма ряда с заданной точностью #3
так тоже неправильно считает =(
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.10.2010, 23:31     Сумма ряда с заданной точностью #4
А как должно быть? Приведите пример правильных входных и выходных данных.

Добавлено через 3 минуты
А, точняк. Ща поправим.

Добавлено через 11 минут
Проверьте так:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <math.h>
#include <conio.h>
 
double series(double x, double epsilon, int *n, double *last);
 
int main()
{
    double x;
    double epsilon;
    double last;
    int n;
 
    while (1)
    {
        printf("Enter x (-25 < x < 25): ");
        scanf("%lf", &x);
 
        if (x < -25.0 || x > 25.0)
            printf("x must be in range of -25 to 25\n");
        else
            break;
    }
 
    while (1)
    {
        printf("Enter epsilon (0 < epsilon <= 1): ");
        scanf("%lf", &epsilon);
 
        if (epsilon <= 0.0 || epsilon > 1.0)
            printf("epsilon must be in range of 0 to 1\n");
        else
            break;
    }
 
    printf("Sum of series: %lf", series(x, epsilon, &n, &last));
    printf("\nNumber of terms: %d", n);
    printf("\nLast term: %lf", last);
 
    getch();
    return 0;
}
 
double series(double x, double epsilon, int *n, double *last)
{
    double sum;
    double an;
    int den;
    int k;
    int sign;
 
    sum = 0.0;
    an = 2.0;
    k = 4;
    den = 2;
    sign = -1;
 
    while (1)
    {
        an = sign * x * (k + x) / den;
        sum += an;
 
        if (fabs(an) < epsilon)
            break;
 
        k += 4;
        den *= k / 2;
 
        if ((k / 4) % 2 == 1)
            sign *= -1;
    }
 
    *n = k / 4;
    *last = an;
 
    return sum;
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
12.10.2010, 08:37  [ТС]     Сумма ряда с заданной точностью #5
результат неверный выводит
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2010, 08:39     Сумма ряда с заданной точностью #6
Дайте верные входные и выходные данные. А то у меня совсем нету желания считать на бумажке. Хотя то, что я посчитал ручками, совпадает с тем, что считает программа.
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
12.10.2010, 08:58  [ТС]     Сумма ряда с заданной точностью #7
попробуйте ввести x=2, eps=1
ответ должен быть -9.91, а показывает -7.91
А последнее слагаемое и количество правильно выводит.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2010, 09:54     Сумма ряда с заданной точностью #8
Ага. А теперь считаем на бумажке:
x = 2; eps = 1
t1 = -2 * (4 + 2) / 2 = -6; |t1| = 6 > 1;
t2 = -2 * (8 + 2) / (2 * 4) = -2.5; |t2| = 2.5 > 1;
t3 = 2 * (12 + 2) / (2 * 4 * 6) = 0.58(3); |t3| = 0.58(3) < 1 -> Конец
sum = -6 -2.5 + 0.58(3) = 7.91(6)
last = 0.58(3)
n = 3
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
12.10.2010, 19:54  [ТС]     Сумма ряда с заданной точностью #9
Ой, извините за мою невнимательность, я тока изменил немного вашу прогу, там где программа меняет знаки, иначе, как мне кажется, программа всего один раз поменяет знак
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2010, 02:28     Сумма ряда с заданной точностью
Еще ссылки по теме:

C++ Сумма ряда с определенной точностью
Сумма ряда с точностью 0,001 C++
Сумма ряда с точностью C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.10.2010, 02:28     Сумма ряда с заданной точностью #10
Ну так вы выведите каждое слагаемое и посмотрите, как она меняет знак... Знаки она меняет через каждые два слагаемых, как и надо.
Yandex
Объявления
13.10.2010, 02:28     Сумма ряда с заданной точностью
Ответ Создать тему
Опции темы

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