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

Прога проскакивет условие выхода, не могу найти ошибку в коде - C++

Восстановить пароль Регистрация
 
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
15.03.2012, 14:54     Прога проскакивет условие выхода, не могу найти ошибку в коде #1
Задание поделить многочлен на его производную, все делиться хорошо, но при условии когда мы находим НОД т е при деление в остатке 0 прога должна вывести нод, есть усл что при 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "stdafx.h"
#include <conio.h>
#include <math.h>
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    double e1[10], e2[10], cop1[10], cop2[10], otv[10], cop22[10], otv1[10], ee2[10];
    int d1, d2;
    cout<<"Введите многочлен"<<endl;
    A:  cout<<"Введите значениe старшей степени многочлена:"; cin>>d1;
            if(!cin.good())
            {
                cout<<"Ошибка! Введите значениe старшей степени многочлена, заново!"<<endl;
                _flushall();
                cin.clear();
                _getch();
                goto A;
            }
 
            for(int i=0; i<d1+1; i++)
            {
    A1:      cout<<"Введите коэффициент x^"<<i<<"=";
             cin>>e1[i];
             if(!cin.good()&&(e1[d1]!=3)||(e1[i]==0))
                {
                    cout<<"Ошибка"<<endl;
                    _flushall();
                    cin.clear();
                    goto A1;
                }
            }
            cout<<e1[d1]<<"(x^"<<d1<<")";
            for(int i=d1-1; i>=0; i--)
            {   
                if(e1[i]>0) cout<<"+"<<e1[i]<<"(x^"<<i<<")";
                else cout<<e1[i]<<"(x^"<<i<<")";
            }
        for(int i=d1; i>=0; i--)
        {
            e2[i]=e1[i];
            cop1[i]=e1[i];//копия 1
        }
    cout<<" "<<endl;
 
    cout<<"Производная многочлена:";
    for(int i=d1; i>=1; i--)
    {
        e2[i-1]=e1[i]*i;
    }
    d2=d1-1;
    cout<<e2[d2]<<"(x^"<<d1-1<<")";
    for(int i=d2-1; i>=0; i--)
            {   
                if(e2[i]>0) cout<<"+"<<e2[i]<<"(x^"<<i<<")";
                else cout<<e2[i]<<"(x^"<<i-1<<")";
                ee2[i]=e2[i];
            }
    cout<<" "<<endl;
w:  if(d1<0) {cout<<"ОШИБКА";}
    else{
    int e = d1 - d2;
    cout<<"делимое:";
    cout<<cop1[d1]<<"(x^"<<d1<<")";
            for(int i=d1-1; i>=0; i--)
            {   
                if(cop1[i]>0) cout<<"+"<<cop1[i]<<"(x^"<<i<<")";
                else cout<<cop1[i]<<"(x^"<<i<<")";
            }
    cout<<"делитель:";
    cout<<e2[d2]<<"(x^"<<d1-1<<")";
    for(int i=d2-1; i>=0; i--)
            {   
                if(e2[i]>0) cout<<"+"<<e2[i]<<"(x^"<<i<<")";
                else cout<<e2[i]<<"(x^"<<i-1<<")";
            }
    for(int i=0; i<d1+1; i++)
        {
            if(i==0) cop2[i]=0;
            else cop2[i]=e2[i-1];
        }
                do//деление многочлена на производную
                    {
        
                        double u = cop1[d1]/cop2[d1];
                        cout<<"Коэф:";
                        for(int i=0; i<d1+1; i++)
                        {
                            cop22[i] = cop2[i] * u;
                            cout<<"   "<<cop22[i];
                        }
                        cout<<" "<<endl;
                        cout<<cop22[d1]<<"(x^"<<d1<<")";
                        for(int i=d1-1; i>=0; i--)
                        {
                            if(cop22[i]>0) cout<<"+"<<cop22[i]<<"(x^"<<i<<")";
                            else cout<<cop22[i]<<"(x^"<<i<<")";
                        }
                        cout<<" "<<endl;
                        for(int i=0; i<d1+1; i++)
                        {
                            otv[i]=cop1[i]-cop22[i];
                        }
                        cout<<"Промежуточн отв"<<endl;
                        cout<<otv[d1]<<"(x^"<<d1<<")";
                        for(int i=d1-1; i>=0; i--)
                        {
                            if(otv[i]>0) cout<<"+"<<otv[i]<<"(x^"<<i<<")";
                            else cout<<otv[i]<<"(x^"<<i<<")";
                        }
                        cout<<""<<endl; 
                        d1 = d1 - 1;
                        for(int i=0; i<d1+1; i++)
                        {
                            cop1[i] = otv[i];
                            cop2[i] = e2[i];
                        }
                    }
                while(d1>=d2);
                if(otv[d1]==0){     cout<<"НОД"<<endl;
                                    cout<<cop2[d2]<<"(x^"<<d2<<")";
                                    for(int i=d2-1; i>=0; i--)
                                    {
                                        if(cop2[i]>0) cout<<"+"<<cop2[i]<<"(x^"<<i<<")";
                                        else cout<<cop2[i]<<"(x^"<<i<<")";
                                    }
                                }
                
                else{
                    d1=d2;
                    d2=d1-1;
                        for(int i=0; i<d1+1; i++)
                        {
                            cop1[i]=e2[i];
                            e2[i]=otv[i];
                            
                        }
                        goto w;
                    }
    }
 
    system("pause");
    return 0;
}
 
[ATTACH]134485[/ATTACH]
Миниатюры
Прога проскакивет условие выхода, не могу найти ошибку в коде  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 14:54     Прога проскакивет условие выхода, не могу найти ошибку в коде
Посмотрите здесь:

Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде :(
C++ Не могу найти ошибку в коде
Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.03.2012, 15:25     Прога проскакивет условие выхода, не могу найти ошибку в коде #2
Цитата Сообщение от White Luna Посмотреть сообщение
но при условии когда мы находим НОД т е при деление в остатке 0 прога должна вывести нод, есть усл что при 0 коэф вывод нода, но прог проскакивает это усл
А в какой строке это условие?
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
15.03.2012, 15:30  [ТС]     Прога проскакивет условие выхода, не могу найти ошибку в коде #3
124 строка

Добавлено через 2 минуты
ой, нашла еще одну проблему он не доходит до усл 0, у меня зацикливается цикл в 123 строке, непонятно почему
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.03.2012, 15:50     Прога проскакивет условие выхода, не могу найти ошибку в коде #4
Цитата Сообщение от White Luna Посмотреть сообщение
124 строка
На ум приходит две из возможных причин:
1. Никогда не сравнивайте числа с плавающей запятой с точными числами. Лучше напишите, что-нибудь в духе
if (otv[d1] < 0.0005 && otv[d1] > -0.0005)

Такие числа сравнивать надо с погрешностью. Они почти никогда не бывают равны именно 0.

2. Проверить на корректность d1. Может индекс расчитывается неправильно и обращение происходит к другому элементу.

Добавлено через 13 минут
Цитата Сообщение от White Luna Посмотреть сообщение
ой, нашла еще одну проблему он не доходит до усл 0, у меня зацикливается цикл в 123 строке, непонятно почему
На каких данных зацикливается? Вроде не должен. Уверены, что это не после goto на 142 строке?

Добавлено через 5 минут
White Luna, и все таки перепишите строку сравнения вот так:
C++
1
if(otv[d1] > -0.001 && otv[d1] < 0.001)
Подберите нужную Вам точность. Я проверил у себя - так работает, как Вы и ожидаете. То есть печатает НОД.
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
15.03.2012, 17:44  [ТС]     Прога проскакивет условие выхода, не могу найти ошибку в коде #5
странно у меня даже после вставки условия выдает ошибку
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
15.03.2012, 17:54  [ТС]     Прога проскакивет условие выхода, не могу найти ошибку в коде #6
ну вот, если при таких условиях, то даже ха пределы деления не выходит, и ошибка сама всетаки в условии 123 строки, тут Razmer первое d1, а второе d2, и деже при том что после 0 0, идет -1 0, что явно протеворечит условию окончания цикла. Вот ошибка. немогу понять из-за чего.

Прога проскакивет условие выхода, не могу найти ошибку в коде
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 20:14     Прога проскакивет условие выхода, не могу найти ошибку в коде
Еще ссылки по теме:

C++ прога, не могу найти ошибку C++
Не могу найти ошибку в коде C++
C++ Не могу найти ошибку в коде

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

Или воспользуйтесь поиском по форуму:
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
15.03.2012, 20:14  [ТС]     Прога проскакивет условие выхода, не могу найти ошибку в коде #7
C++
1
while(d1>=d2);
хотя условие четкое, но почему то не срабатвает, или может ли интерпритатор его игнорить?

Добавлено через 1 час 27 минут
к данному коду еще добавляет деление многочлена на нод, который находиться в первом коде
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "stdafx.h"
#include <conio.h>
#include <math.h>
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    double e1[10], e2[10], cop1[10], cop2[10], otv[10], cop22[10], ee2[10];
    int d1, d2;
    cout<<"Введите многочлен"<<endl;
    A:  cout<<"Введите значениe старшей степени многочлена:"; cin>>d1;
            if(!cin.good())
            {
                cout<<"Ошибка! Введите значениe старшей степени многочлена, заново!"<<endl;
                _flushall();
                cin.clear();
                _getch();
                goto A;
            }
 
            for(int i=0; i<d1+1; i++)
            {
    A1:      cout<<"Введите коэффициент x^"<<i<<"=";
             cin>>e1[i];
             if(!cin.good()&&(e1[d1]!=3)||(e1[i]==0))
                {
                    cout<<"Ошибка"<<endl;
                    _flushall();
                    cin.clear();
                    goto A1;
                }
            }
            int rez=d1;
            cout<<e1[d1]<<"(x^"<<d1<<")";
            for(int i=d1-1; i>=0; i--)
            {   
                if(e1[i]>0) cout<<"+"<<e1[i]<<"(x^"<<i<<")";
                else cout<<e1[i]<<"(x^"<<i<<")";
            }
        for(int i=d1; i>=0; i--)
        {
            e2[i]=e1[i];
            cop1[i]=e1[i];//копия 1
        }
    cout<<" "<<endl;
 
    cout<<"Производная многочлена:";
    for(int i=d1; i>=1; i--)
    {
        e2[i-1]=e1[i]*i;
    }
    d2=d1-1;
    cout<<e2[d2]<<"(x^"<<d1-1<<")";
    for(int i=d2-1; i>=0; i--)
            {   
                if(e2[i]>0) cout<<"+"<<e2[i]<<"(x^"<<i<<")";
                else cout<<e2[i]<<"(x^"<<i-1<<")";
                ee2[i]=e2[i];
            }
    cout<<" "<<endl;
w:  if(d1<0) {cout<<"ОШИБКА";}
    else{
    int e = d1 - d2;
    cout<<"делимое:";
    cout<<cop1[d1]<<"(x^"<<d1<<")";
            for(int i=d1-1; i>=0; i--)
            {   
                if(cop1[i]>0) cout<<"+"<<cop1[i]<<"(x^"<<i<<")";
                else cout<<cop1[i]<<"(x^"<<i<<")";
            }
    cout<<"делитель:";
    cout<<e2[d2]<<"(x^"<<d1-1<<")";
    for(int i=d2-1; i>=0; i--)
            {   
                if(e2[i]>0) cout<<"+"<<e2[i]<<"(x^"<<i<<")";
                else cout<<e2[i]<<"(x^"<<i-1<<")";
            }
    for(int i=0; i<d1+1; i++)
        {
            if(i==0) cop2[i]=0;
            else cop2[i]=e2[i-1];
        }
                //деление многочлена на производную
            do
            {
                        double u = cop1[d1]/cop2[d1];
                        cout<<"Коэф:";
                        for(int i=0; i<d1+1; i++)
                        {
                            cop22[i] = cop2[i] * u;
                            cout<<"   "<<cop22[i];
                        }
                        cout<<" "<<endl;
                        cout<<cop22[d1]<<"(x^"<<d1<<")";
                        for(int i=d1-1; i>=0; i--)
                        {
                            if(cop22[i]>0) cout<<"+"<<cop22[i]<<"(x^"<<i<<")";
                            else cout<<cop22[i]<<"(x^"<<i<<")";
                        }
                        cout<<" "<<endl;
                        for(int i=0; i<d1+1; i++)
                        {
                            otv[i]=cop1[i]-cop22[i];
                        }
                        cout<<"Промежуточн отв"<<endl;
                        cout<<otv[d1]<<"(x^"<<d1<<")";
                        for(int i=d1-1; i>=0; i--)
                        {
                            if(otv[i]>0) cout<<"+"<<otv[i]<<"(x^"<<i<<")";
                            else cout<<otv[i]<<"(x^"<<i<<")";
                        }
                        cout<<""<<endl; 
                        d1 = d1 - 1;
                        cout<<"Razmer"<<endl;
                        cout<<d1<<endl;
                        cout<<d2<<endl;
                        for(int i=0; i<d1+1; i++)
                        {
                            cop1[i] = otv[i];
                            cop2[i] = e2[i];
                        }
                    
            }while(d1>=d2);
                if(otv[d1] > -0.001 && otv[d1] < 0.001)
                                {       cout<<"НОД"<<endl;
                                    cout<<cop2[d2]<<"(x^"<<d2<<")";
                                    for(int i=d2-1; i>=0; i--)
                                    {
                                        if(cop2[i]>0) cout<<"+"<<cop2[i]<<"(x^"<<i<<")";
                                        else cout<<cop2[i]<<"(x^"<<i<<")";
                                    }
                                }
                else{
                    d1=d2;
                    d2=d1-1;
                        for(int i=0; i<d1+1; i++)
                        {
                            cop1[i]=e2[i];
                            e2[i]=otv[i];
                        }
                        goto w;
                    }
    }
/////////////////////////рез деление многочлена на нод
    double w[10], w2[10], posl[10], zam[10];
    int y=rez-d2;
    for(int i=0; i<d2; i++){zam[i]=cop2[i];}
    for(int i=rez; i>=0; i++)
    {
        if((i-y)<0) w[i]=0;
        else w[i]=cop2[i-y];
    }
    do{
 
        double q=e1[rez]/w[rez];
        for(int i=0; i<rez+1; i++)
        {
            w2[i]=w[i]*q;
        }
        for(int i=0; i<rez+1; i++)
        {
            posl[i]=e1[i]-w2[i];
        }
        cout<<"Ответ деления"<<endl;
        cout<<posl[rez]<<"(x^"<<d1<<")";
        for(int i=rez-1; i>=0; i--)
        {
            if(posl[i]>0) cout<<"+"<<posl[i]<<"(x^"<<i<<")";
            else cout<<posl[i]<<"(x^"<<i<<")";
        }
        cout<<""<<endl;
        rez=rez-1;
        for(int i=0; i<rez+1; i++)
        {
            e1[i]=posl[i];
            w[i]=zam[i];
        }
 
      }while(rez>=d2);
 
    system("pause");
    return 0;
}
и все равно та же ошибка с d1 и d2 где не срабатывает условие
Yandex
Объявления
15.03.2012, 20:14     Прога проскакивет условие выхода, не могу найти ошибку в коде
Ответ Создать тему
Опции темы

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