Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
1

Ограничения для рекуррентнной формулы с двумя вариантами циклов

08.10.2015, 20:52. Просмотров 649. Ответов 16
Метки нет (Все метки)

Здравствуйте. Написала программу по заданию:
Вычислить приближенное значение функции, вычислив сумму конечного числа
элементов ряда двумя способами, используя разные типы циклов:
1) с заданной точностью;
2) для заданного количества членов ряда.
Переход к способу вычисления реализовать с помощью оператора выбора.
(картинка прикреплена ниже), но не знаю как поставить ограничение на х (-1<=x<=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
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
78
#include <stdio.h>
#include <math.h>
#include <locale.h>
 
double chislo(double x, double n);
double tochka(double x, double k);
 
double main()
{
    int n;
 
    setlocale(LC_ALL, "rus");
    setlocale(LC_NUMERIC, "eng");
 
    printf("Вариант расчета\n");
    printf("1 (Цикл с заданной точностью)\n");
    printf("2 (Цикл для заданного количества членов ряда)\n");
    printf("Ваш выбор: ");
    int input;
    scanf("%d", &input);
    printf("Введите число \nn =");
    scanf("%d", &n);
 
    switch (input)
    {
    case 1:
 
        printf("%lf\n", tochka(2.0, 1e-10));
        break;
 
    case 2:
 
        printf("%lf\n", chislo(2.0, 100));
        break;
 
    default:
        printf("Неправильный ввод\n");
    }
 
    getchar();
    return 0;
}
 
 
double tochka(double x, double k)
 
{
    double sum, p;
    double i = 0;
 
    sum = p = 1.0;
    
 
    while ((p >= k) && (x >= -1.0) && (x <= 1.0))
    {
        i++;
        p *= (pow(-1.0, i - 1))*(pow(x, i) / i);
        sum += p;
    }
 
    return sum;
}
 
 
double chislo(double x, double n)
{
    double sum2, p, i;
 
    sum2 = p = 1.0;
 
    for (i = 1; i <= n; i++) 
    {
        p *= pow(-1.0, i - 1)*(pow(x, i) / i);;
        sum2 += p;
    }
 
    return sum2;
}
0
Миниатюры
Ограничения для рекуррентнной формулы с двумя вариантами циклов  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2015, 20:52
Ответы с готовыми решениями:

Выбор между двумя Б/У вариантами.
добрый вечер уважаемому сообществу! помогите, пожалуйста, определиться с выбором. средств на...

Разница между двумя вариантами написания запроса
Добрый день. Интересует разница между двумя вариантами написания запроса. По замерам...

Выбор оперативной памяти между двумя вариантами
Здравствуйте! Есть материнская плата с шиной 2400мГц и процессор, поддерживающий оперативную...

Работа с массивами. Реализовать заполнение массива двумя вариантами
Не получается реализовать заполнение массива двумя вариантами, да и понимаю, что у самой в целом...

16
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
09.10.2015, 10:29 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
printf("Вариант расчета\n1 (Цикл с заданной точностью)\n2 (Цикл для заданного количества членов ряда)\n");
printf("Ваш выбор: ");
int input;
scanf("%d", &input);
 
double x, e;
 
switch (input)
{
case 1:
  printf("Введите x и точность: ");
  scanf("%lf%lf", &x, &e);
 
  if (x < -1.0 || x > 1.0) printf("x вне диапазона\n");
  else printf("%f\n", tochka(x, e));
break;
 
case 2:
 
  printf("Введите x и n: ");
  scanf("%lf%d", &x, &n);
 
  if (x < -1.0 || x > 1.0) printf("x вне диапазона\n");
  else printf("%f\n", chislo(x, n));
break;
 
default:
printf("Неправильный ввод\n");
}
1
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
09.10.2015, 14:14  [ТС] 3
Оо все оказалось проще, чем можно было подумать... Спасибо)

Теперь, единственное, что не работает, это функция tochka (double x, double k) (k=e, если что). Почему все время выдает 0? (вторая функция работает)

полный код
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <math.h>
#include <locale.h>
 
double chislo(double x, double n);
double tochka(double x, double k);
 
double main()
{
    int n, k, x;
 
    setlocale(LC_ALL, "rus");
    setlocale(LC_NUMERIC, "eng");
 
    printf("Вариант расчета\n");
    printf("1 Цикл с заданной точностью\n");
    printf("2 Цикл для заданного количества членов ряда\n");
    printf("Ваш выбор: ");
    int input;
    scanf("%d", &input);
 
    switch (input)
    {
    case 1:
 
        printf("Введите x и точность k\nx= ");
        scanf("%d", &x);
        printf("k = ");
        scanf("%d", &k);
 
        if (x < -1.0 || x > 1.0)
        {
            printf("x вне диапазона\n");
        }
 
        else
            printf("%f\n", tochka(x, k));
        break;
 
    case 2:
 
        printf("Введите x и колличество членов ряда n\nx= ");
        scanf("%d", &x);
        printf("n = ");
        scanf("%d", &n);
 
        if (x < -1.0 || x > 1.0)
 
        {
            printf("x вне диапазона\n");
        }
 
        else
            printf("%f\n", chislo(x, n));
        break;
 
    default:
        printf("Неправильный ввод\n");
    }
 
    getchar();
    return 0;
}
 
 
double tochka(double x, double k)
 
{
    double sum, p;
    int i;
 
    i = 0;
    sum = 0;
    p = 1.0;
 
    while (p >= k)
    {
        i++;
        p *= pow(-1.0, i - 1)*(pow(x, i) / i);
        sum += p;
    }
 
    return sum;
}
 
 
double chislo(double x, double n)
{
    double sum2, p, i;
 
    sum2 = p = 1.0;
 
    for (i = 1; i <= n; i++)
    {
        p *= pow(-1.0, i - 1)*(pow(x, i) / i);
        sum2 += p;
    }
 
    return sum2;
}
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
09.10.2015, 15:52 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double tochka(double x, double e)
{
    double sum = 0.0, p = x;
    int i = 1;
 
    while (fabs(p / i) >= e)
    {
        if (i % 2 == 0) sum -= p / i; else sum += p / i;
        ++i;
        p *= x;
    }
 
    return sum;
}
-1 не входит в диапазон, надо подправить условие.
C++
1
if (x <= -1.0 || x > 1.0)
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
09.10.2015, 17:01  [ТС] 5
При выборе первого условия программа при любых данных выводит 0.
Цитата Сообщение от nmcf Посмотреть сообщение
if (i % 2 == 0) sum -= p / i; else sum += p / i;
вот это вообще не понятно...
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
09.10.2015, 17:19 6
Почему у тебя x целое? Оно должно быть вещественное, как и точность. Смотри мой пример.
Цитата Сообщение от Mon4ik Посмотреть сообщение
вот это вообще не понятно
Ну для чётных минус, для нечётных плюс.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
09.10.2015, 21:58  [ТС] 7
Все, ура! Работает. Спасибо)
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,738
09.10.2015, 22:53 8
Mon4ik, Что-то я не верю, что работает!
https://www.cyberforum.ru/cgi-bin/latex.cgi?ln(1+x)=\sum_{n=1}^{\propto }\frac{{(-1)}^{n+1}{x}^{n}}{n}
т.е. i начинаем с единицы, а не с нуля
начальное значение a1=x
an+1=-an*x*n/(n+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
double tochka(double x, double eps)
{
    double sum, p;
    double i = 1;
    sum = 0;
    p = x;
    if( x <= -1.0 || x >= 1.0)
       return 0;
 
    while ( p >= eps )
    {
       sum += p;
       p *=-x *i/ (i+1.);
        i++;
    }
    return sum;
}
 
 
double chislo(double x, int n)
{
    double sum, p;
    int i = 1;
    sum = 0;
    p = x;
    if( x <= -1.0 || x >= 1.0)
       return 0;
 
    while ( i <=n )
    {
       sum += p;
       p *=-x *i/ (i+1.);
        i++;
    }
    return sum;
}
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
09.10.2015, 23:05  [ТС] 9
zss, ну если кто-то написал код, то я же его не весь беру. Я свой собрала. А по поводу i, он как только заходит в условие, прибавляет единицу(i++), так что первый член единица.
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,738
09.10.2015, 23:10 10
первый член x, а не единица!!!!
И нельзя использовать pow!
Проверьте, сравнив Ваш результат и библиотечный log(1+x)
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
09.10.2015, 23:16  [ТС] 11
zss, а почему нельзя использовать pow?
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,738
10.10.2015, 11:08 12
Mon4ik, pow тоже вычисляется разложением через pow(x,y)=exp(log(x)*y).
В итоге - получается, что логарифм вы считаете используя логарифм.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
10.10.2015, 18:47  [ТС] 13
zss, я попробовала использовать тот код, который вы предложили...он не работает...вообще...
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.10.2015, 19:10 14
Но мой вариант работает. И pow() там нет.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 37
10.10.2015, 20:07  [ТС] 15
nmcf, да, ваш вариант работает, спасибо)

Добавлено через 48 минут
nmcf, можете, пожалуйста, написать функцию chislo (через for)
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.10.2015, 20:10 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
double chislo(double x, int n)
{
    double sum = 0.0, p = x;
 
    for (int i = 1; i <= n; ++i)
    {
        if (i % 2 == 0) sum -= p / i; else sum += p / i;
        p *= x;
    }
 
    return sum;
}
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,738
10.10.2015, 20:14 17
Mon4ik,
Цитата Сообщение от Mon4ik Посмотреть сообщение
который вы предложили...он не работает.
Вот тест:
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
#include <cmath>
#include <iostream>
 using namespace std;
double tochka(double x, double eps)
{
    double sum, p;
    double i = 1;
    sum = 0;
    p = x;
    if( x <= -1.0 || x >= 1.0)
       return 0;
 
    while ( fabs(p) >= eps )
    {
       sum += p;
       p *=-x *i/ (i+1.);
        i++;
    }
    return sum;
}
 
 
double chislo(double x, int n)
{
    double sum, p;
    int i = 1;
    sum = 0;
    p = x;
    if( x <= -1.0 || x >= 1.0)
       return 0;
 
    while ( i <=n )
    {
       sum += p;
       p *=-x *i/ (i+1.);
        i++;
    }
    return sum;
}
 
int main()
{
    double x=0.9;
    cout<<tochka(x, 1e-10)<<" "<<chislo(x, 20)<<" "<<log(1.0+x)<<endl;
    system("pause");
    return 0;
}
Вывод
0.641854 0.641806 0.641854
p.s. пользуйтесь отладчиком:
https://www.cyberforum.ru/cpp-... 62479.html
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2015, 20:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Prototype Какая разница между двумя вариантами наследования?
Есть два варианта прототипного наследования. Интересует, какая между ними разница(типа плюсы и...

Рекурсия, какая разница между двумя вариантами кода?
Здравствуйте, объясните разницу между приведенными ниже вариантами кода. Первый вариант...

Есть ли у циклов лимиты и ограничения?
Насколько масштабным и сложным может быть цикл? Может ли он вмещать и выполнять несколько других...

напишите 2 программы (с использованием циклов с параметром и циклов с условием) для вычисления и вывода на экран в виде


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.