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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
eisenheim
18 / 8 / 1
Регистрация: 06.06.2011
Сообщений: 268
#1

Зависает и закрывается консоль - C++

30.03.2013, 21:35. Просмотров 550. Ответов 12
Метки нет (Все метки)

Добрый день! Делаю лабораторную по ООП. Задание - разряженный полином, с динамической структурой, где хранятся не нулевые коэффициенты.
Вот часть кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct znach {
    int n;
    int step;
    znach *next;
};
 
class Pol {
    int razm;
    znach *first;
public:
    Pol(Pol& b) {
        razm = b.razm;
        znach *t = new znach;
        t = first;
        znach *tb = new znach;
        tb = b.first;
        while(tb!=NULL) {
            t->n = tb->n;
            t->step = tb->step;
            tb = tb->next;
        }
    }
Виснет при вызове копирующего конструктора, а именно виснут начинает, когда доходит до while
В чём может быть проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 21:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зависает и закрывается консоль (C++):

Закрывается консоль - C++
Здравствуйте! У меня такая проблема: делал программу по переводу галлонов в литры, но после ввода кол-ва галлонов и нажатия ENTER...

Закрывается консоль - C++
#include <iostream> using namespace std; int main() { double g, f; cout << "vvedit chislo galonov" << endl; cin >> g; ...

Консоль открывается и сразу закрывается - C++
консоль открывается и сразу закрывается. C++?? я решил эту проблему вот так #include "stdafx.h" #include <iostream> #include...

Консоль закрывается, не выдав результата - C++
У меня есть 2 кода, нужно сделать третий, из которого можно было бы открывать первые два. Что-то типо меню. Все открывается, но не вывев...

Консоль закрывается после выполнения программы - C++
Всем привет, такая проблема, после выполнения программы окно консоли закрывается. Как можно предотвратить это, не используя...

Консоль закрывается после перехода в функцию - C++
После выполнения функции main консоль закрывается, в чем ошибка? int _tmain(int argc, _TCHAR* argv) { cout << "Введите своё имя" <<...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
30.03.2013, 21:54 #2
C++
1
tb!=NULL
а tb в NULL обратиться может?
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
30.03.2013, 22:16 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Pol(Pol& b) 
    {
        razm = b.razm;
        znach* tb = b.first;
        znach *t = new znach; // создали новое значение в копии
        first=t; // запомнили адрес первого
        while(tb!=NULL) 
        {
            t->n = tb->n; // скопировали данные
            t->step = tb->step;
            tb = tb->next;  // перешли к следующему в оригинале
            if(tb==NULL) // следующего нет
            {
                t->next=NULL; 
                break;
            }
            znach *t2 = new znach; // создали следующий в копии
            t->next=t2; // записали адрес следующего
            t=t2; // сделали его текущим
       }
    }
eisenheim
18 / 8 / 1
Регистрация: 06.06.2011
Сообщений: 268
01.04.2013, 14:34  [ТС] #4
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Pol(Pol& b) 
    {
        razm = b.razm;
        znach* tb = b.first;
        znach *t = new znach; // создали новое значение в копии
        first=t; // запомнили адрес первого
        while(tb!=NULL) 
        {
            t->n = tb->n; // скопировали данные
            t->step = tb->step;
            tb = tb->next;  // перешли к следующему в оригинале
            if(tb==NULL) // следующего нет
            {
                t->next=NULL; 
                break;
            }
            znach *t2 = new znach; // создали следующий в копии
            t->next=t2; // записали адрес следующего
            t=t2; // сделали его текущим
       }
    }
Всё равно крашится.
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
01.04.2013, 14:58 #5
eisenheim, кинь весь код.
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
01.04.2013, 18:56 #6
Цитата Сообщение от SERUYBKR Посмотреть сообщение
кинь весь код.
Это Вам нужно кинуть весь код.
Я лишь предложил правильный копиконструктор.
Иного кода у меня нет.
eisenheim
18 / 8 / 1
Регистрация: 06.06.2011
Сообщений: 268
01.04.2013, 20:14  [ТС] #7
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
// Polinom.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
struct znach {
    int n;
    int step;
    znach *next;
};
 
class Pol {
private:
    int razm;
    znach *first;
public:
    Pol() {
        razm = 0;
        znach *t = new znach;
        t->n = 0;
        t->step = 0;
        t->next = first;
        first = t;
    }
 
    Pol(int a) {
        razm = a;
        cout<<"Введите коэффициенты полинома:\n";
        int x;
        for(int i=0;i<razm;i++) {
            cout<<"Коэффициент x при степени "<<i<<": ";
            cin>>x;
            Add(x, i);
            cout<<"\n";
        }
    }
 
    Pol(Pol& b) {
        razm = b.razm;
        znach *t = new znach;
        first = t;
        znach *tb = new znach;
        tb = b.first;
        while(tb!=NULL) {
            t->n = tb->n;
            t->step = tb->step;
            tb = tb->next;
            if(tb == NULL) {
                t->next = NULL;
                break;
            }
            t = t->next;
        }
    }
 
/*сложение, вычитание, сравнение двух полиномов, умножение и сложение с 
полиномом целого числа, вычисление значения полинома для заданного значения переменной*/
    bool InStep(int a) {
        znach *temp = first;
        while(temp!=NULL) {
            if(temp->step == a) return true;
            temp = temp->next;
        }
        return false;
    }
 
    bool In(int ch, int st) {
        znach *temp = first;
        while(temp!=NULL) {
            if(temp->step == st && temp->n == ch) return true;
            else temp = temp->next;
        }
        return false;
    }
 
    void Add(int ch, int st) {
        if(!InStep(st) && ch != 0) {
            znach *temp = new znach;
            temp->n = ch;
            temp->step = st;
            temp->next = first;
            first = temp;
        } else return;
    }
 
 
    friend istream& operator>>(istream& input, Pol& b) {
        int x;
        cout<<"Введите размерность: \n";
        cin>>b.razm;
        cout<<"Введите коэффициенты полинома:\n";
        for(int i=0;i<b.razm;i++) {
            cout<<"Коэффициент x при степени "<<i<<": ";
            cin>>x;
            b.Add(x, i);
            cout<<"\n";
        }
        return input;
    }
    
    void Print() {
        znach *t = new znach;
        t = first;
        cout<<"\n";
        char* znak;
        while(t!=NULL)
        {
            if(t->next != NULL) znak = " + ";
            else znak = "";
            cout<<t->n<<"(x^"<<t->step<<")"<<znak;
            t = t->next;
        }
        cout<<"\n\n";
    }
 
    friend ostream& operator<<(ostream& output, Pol& b) {
        znach *t = new znach;
        t = b.first;
        cout<<"\n";
        char* znak;
        while(t!=NULL)
        {
            if(t->next != NULL) znak = " + ";
            else znak = "";
            cout<<t->n<<"(x^"<<t->step<<")"<<znak;
            t = t->next;
        }
        cout<<"\n\n";
        return output;
    }
 
    Pol& operator*(int a) {
        znach *t = new znach;
        t = first;
        while(t!=NULL) {
            t->n = t->n * a;
            t = t->next;
        }
 
        return *this;
    }
 
    bool operator==(Pol& b) {
        znach *t = new znach;
        t = first;
        while(t!=NULL) {
            if(!b.In(t->n, t->step)) return false;
            else t = t->next;
        }
        return true;
    }
 
};
 
 
int _tmain(int argc, _TCHAR *argv[])
{
    setlocale(LC_ALL, "Russian");
    Pol a;
    cin>>a;
    Pol b(a);
    //Pol b;
    //cin>>b;
    cout<<a;
    cout<<b;
    if(a==b) cout<<"Равны";
    else cout<<"Не равны";
    a*2;
    cout<<a<<"\n\n";
    return 0;
}
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
01.04.2013, 21:58 #8
C++
1
2
3
4
5
6
7
8
Pol() {
        razm = 0;
        znach *t = new znach;
        t->n = 0;
        t->step = 0;
        t->next = 0;
        first = t;
    }
А у Вас было написано
t->next = first;
т.е. следующий получался первый,
а первый - сдедующим.
Вот Вам и зацикливание.
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
01.04.2013, 23:45 #9
Цитата Сообщение от zss Посмотреть сообщение
Это Вам нужно кинуть весь код.
Я лишь предложил правильный копиконструктор.
Иного кода у меня нет.
лол. Я же не тебе писал. Ты чего?
eisenheim
18 / 8 / 1
Регистрация: 06.06.2011
Сообщений: 268
02.04.2013, 02:48  [ТС] #10
У меня крашится при вызове копирующего конструктора! С констр. по умолчанию всё нормально работает
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
02.04.2013, 07:49 #11
В функции Add() та же ошибка
temp->next = first;
Указатель адресует первый элемент.
т.е. следующий получался первый,
а первый - следующим.
Вот Вам и зацикливание.
eisenheim
18 / 8 / 1
Регистрация: 06.06.2011
Сообщений: 268
02.04.2013, 10:34  [ТС] #12
Цитата Сообщение от zss Посмотреть сообщение
В функции Add() та же ошибка
temp->next = first;
Указатель адресует первый элемент.
т.е. следующий получался первый,
а первый - следующим.
Вот Вам и зацикливание.
А помоему всё правильно!
Посмотрите вложенную картинку
Миниатюры
Зависает и закрывается консоль  
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
02.04.2013, 21:35 #13
Поставьте в режиме отладчика в это место останов и по шагам пройдитесь дальше.
Сразу увидите, что происходит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 21:35
Привет! Вот еще темы с ответами:

Закрывается консоль сразу после вывода результата - C++
вот такая проблема, считает всё верно, но сразу после результата консоль закрывается, и помогите пожалуйста так сделать что б не можно было...

Прoблемa с выводом в консоль. Почти сразу закрывается. - C++
У меня возникла проблема. Моя задача: Напечатать в порядке возрастания числа от 100 до 999 в которых нет одинаковых цыфр. Код написал ...

Почему при запуске программы консоль (среда Eclipse C++) сразу закрывается? - C++
Привет всем :P Раньше изучал С++ в Visual Studio , теперь в силу смены ПК на ноут( Asus eee pc 701 4g ) перешел на Eclipse C++. Подскажите...

Зависает консоль - C++
Непонимаю в чем проблема. help #include &lt;iostream.h&gt; #include &lt;windows.h&gt; using namespace std; char Metka; char* Sektor =...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.04.2013, 21:35
Ответ Создать тему
Опции темы

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