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

Поправьте код... - C++

Восстановить пароль Регистрация
 
Johni
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 21
27.01.2010, 21:07     Поправьте код... #1
Помогите поправить код...не пойму в чем ошибка....программы разложения в ряд ln(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
79
80
81
82
83
84
85
86
87
88
89
90
#include "iostream"
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <math.h> 
 
//using CharToOemA func to convert ANSI to OEM
char bufRus[256];
char* Rus(const char* text)
    {
        CharToOemA(LPCSTR(text), bufRus);
        return bufRus;
    }
 
char* Rus(const char* text);
 
int _tmain(int argc, _TCHAR* argv[])
{
        double dXbegin, dXend, dXstep, N, E;//, N1=1, i=1.0;
        printf(Rus("Программа вычисления функции ln(x+1), заданной рядами Тейлора\n"));
        printf(Rus("и вывода в столбец значений ф-ии на интервале [x1;x2]\n"));
        printf(Rus("с шагом dx и заданной точностью E.\n"));
        printf(Rus("x лежит в диапазоне (-1;1]\n"));
        printf(Rus("Введите начало интервала, конец интервала, число шагов(N), точность вычислений.\n"));
        printf("x1, x2, N, E = ?\n");
        scanf("%lf%lf%lf%lf", &dXbegin, &dXend, &N, &E);
        
        if (    dXbegin < -1e300        // Проверка на диапазон значений вводимых чисел
                ||      dXbegin > 1e300
                ||      dXend < -1e300
                ||      dXend > 1e300
                ||      N < 1
                ||      N > 1e300
                ||      E < 0
                ||      E > 1e300)
        {
                printf(Rus("Вне диапазона\n"));
                getch();
                return 0;
        }
        if ( dXbegin > dXend )
        {
                printf(Rus("Начало интервала больше чем его конец, корректирую...\n"));
                //обойдемся без дополнительного ввода новой переменной
                dXbegin = dXbegin + dXend;      // {a = a0 + b0, b = b0}
                dXend   = dXbegin - dXend;      // {a = a0 + b0, b = a0}
                dXbegin = dXbegin - dXend;      // {a = b0, b = a0}
 
        }
        dXstep=fabs(dXend-dXbegin)/N;
        for (double x=dXbegin, i, y; x <= dXend; x+=dXstep)
        {
                if ( x <= -1 || x > 1)
                {
                        printf(Rus("Значение функции в точке x=(%lf) не существует(задано условием)\n"), x);
                        continue;
                }
 
                for (double i=1, minus=-1, y=0, N=1; E < fabs(N/i); i++)
                {
                                if (i == 1)                     //т.к. знакочередующаяся последовательность, пришлось пропустить
                                        {                       //программу через последовательное выполнение
                                                N*=x;           //чтобы понять причину некорректного результата ...
                                                y+=(N/i);       //итог: проверка условия в случае i == 1
                                                continue;       //далее знак меняется нормально
                                        }
                                else
                                        {
                                        //minus*=-1.0;          //после первой итерации становится +, потом -...
                                        N*=minus*x;             //следующий член ряда
                                        y+=(N/i);               //сумма
                                        if (E > fabs(N/i))
                                                {
                                                        printf("i=%lf\n", i);
                                                        printf(Rus("В точке x=[%.10lf]\ty=[%.10lf]\n"), x, y);
                                                }
                                        if (i > 10000000)
                                                {
                                                        printf(Rus("Количество итераций превысило 10,000,000 - прерываем цикл\n"));
                                                        printf(Rus("В точке x=[%.10lf]\ty=[%.10lf]\n"), x, y);
                                                        break;
                                                }
                                        }
                }
        }
        printf("E=[%e]\nN=[%lf]\ndXbegin=[%lf]\ndXend=[%lf]\n", E, N, dXbegin, dXend);
        getch();
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2010, 21:07     Поправьте код...
Посмотрите здесь:

Поправьте пожалуйста код ... C++
Поправьте код!!! C++
Поправьте пожалуйста код C++
Поправьте пожалуйста код. C++
C++ Поправьте код.
Поправьте код C++
Поправьте код C++
Поправьте Код C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ggmann
 Аватар для ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
27.01.2010, 22:55     Поправьте код... #2
а можна уточнить что именно здесь не работает ?
Johni
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 21
27.01.2010, 22:59  [ТС]     Поправьте код... #3
Вот рабочий код...поправил сам,может кто поможет вывести сумму ряда на экран....
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
#include "iostream"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <math.h> 
 
//using CharToOemA func to convert ANSI to OEM
 
 
 
 
int main(int argc)
{
        double dXbegin, dXend, dXstep, N, E;//, N1=1, i=1.0;
        
        printf("x lejit v diapozone (-1;1]\n");
        printf("vvedite nachalo intervala,konec intervala,chhhislo shagof(N),tochnost vichisliniy.\n");
        printf("x1, x2, N, E = ?\n");
        scanf("%lf%lf%lf%lf",&dXbegin,&dXend,&N,&E);
        
        if (    dXbegin < -1e300        // Проверка на диапазон значений вводимых чисел
                ||      dXbegin > 1e300
                ||      dXend < -1e300
                ||      dXend > 1e300
                ||      N < 1
                ||      N > 1e300
                ||      E < 0
                ||      E > 1e300)
        {
                printf("vne diapazona\n");
                getch();
                return 0;
        }
        if ( dXbegin > dXend )
        {
                printf("vne diapazona...\n");
                //обойдемся без дополнительного ввода новой переменной
                dXbegin = dXbegin + dXend;      // {a = a0 + b0, b = b0}
                dXend   = dXbegin - dXend;      // {a = a0 + b0, b = a0}
                dXbegin = dXbegin - dXend;      // {a = b0, b = a0}
 
        }
        dXstep=fabs(dXend-dXbegin)/N;
        for (double x=dXbegin;x<=dXend;x+=dXstep)
        {
                if ( x <= -1 || x > 1)
                {
                        printf("znachenie funk v tochkece x=(%lf) ne sushestvuet(zadano usloviem)\n", x);
                        continue;
                }
 
                for (double i=1, y=0, N=1; E < fabs(N/i); i++)
                {
                                if (i == 1)                     //т.к. знакочередующаяся последовательность, пришлось пропустить
                                        {                       //программу через последовательное выполнение
                                                N*=x;           //чтобы понять причину некорректного результата ...
                                                y+=(N/i);       //итог: проверка условия в случае i == 1
                                                continue;       //далее знак меняется нормально
                                        }
                                else
                                        {
                                        
                                        N*=x;             //следующий член ряда
                                        y+=(N/i);               //сумма
                                        if (E > fabs(N/i))
                                                {
                                                        printf("i=%lf\n", i);
                                                        printf("v tochke x=[%.10lf]\ty=[%.10lf]\n", x, y);
                                                }
                                        if (i > 10000000)
                                                {
                                                        printf("kol-vo interacij previsilo 10,000,000 - prerivaem cikl\n");
                                                        printf("v tochke x=[%.10lf]\ty=[%.10lf]\n", x, y);
                                                        break;
                                                }
                                        }
                }
        }
        printf("E=[%e]\nN=[%lf]\ndXbegin=[%lf]\ndXend=[%lf]\n", E, N, dXbegin, dXend);
        getch();
        return 0;
}
Yandex
Объявления
27.01.2010, 22:59     Поправьте код...
Ответ Создать тему
Опции темы

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