Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
#1

Неожиданное закрытие консольной программы

10.12.2014, 10:35. Просмотров 368. Ответов 13
Метки нет (Все метки)

Делаю лично для себя программку находящая целочисленные корни уравнения 6-ой степени. Все написал, запускается без ошибок, а после ввода коэффициентов не долго думая закрывается. Уже не знаю в чем проблема
Кликните здесь для просмотра всего текста
Осторожно, говн*код

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
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <clocale>
using namespace std;
int main(){
    int z = 0,x1 = 0,x2 = 0,x3 = 0,x4 = 0,x5 = 0,x6 = 0, a, b, c, d, e, f, zn, k=0, g, m=1, size = 7, *otv, otvet_value = 0;
    setlocale(LC_ALL, "russian");
    cout << "Введите коэффициенты:" << endl;
    cout << "x6  ";
    cin >> a;
    cout << "x5  ";
    cin >> b;
    cout << "x4  ";
    cin >> c;
    cout << "x3  ";
    cin >> d;
    cout << "x2  ";
    cin >> e;
    cout << "x1  ";
    cin >> f;
    cout << "    ";
    cin >> g;
    zn = 1;
    otv = new int[k];
    while (m <= g){
        if (g % m == 0){
            otv[k] = m;
            k++;
            otv[k] = -m;
            k++;
            m++;
        }
        else {  m++;  }
    }
    int **gorner;
    gorner = new int*[7];
    for (int i = 0; i < k; i++){
        gorner[i] = new int[k];
    }
    int n = 1;
    while (n <= k){
        gorner[1][n] = a;
        n++;
    }
    gorner[0][0] = NULL;
    gorner[0][1] = a;
    gorner[0][2] = b;
    gorner[0][3] = c;
    gorner[0][4] = d;
    gorner[0][5] = e;
    gorner[0][6] = f;
    gorner[0][7] = g;
    while (zn <= k + 1){
        gorner[zn][0] = otv[z];
        zn++;
        z++;
    }
    int *otvet = new int[6];
    otvet[0] = x1;
    otvet[1] = x2;
    otvet[2] = x3;
    otvet[3] = x4;
    otvet[4] = x5;
    otvet[5] = x6;
    int factor = 2, denominator = 1;
    while (denominator <= k){
        while (factor <= 7){
            gorner[factor][denominator] = gorner[factor - 1][denominator] * gorner[0][denominator] + gorner[factor][0];
            factor++;
            if ((factor == 7) && (denominator <= k)){
                if (gorner[7][denominator] == 0){
                    otvet[otvet_value] = gorner[0][denominator];
                    otvet_value++;
                }
                factor = 2;
                denominator++;
            }
        }
    }
    otvet_value = 0;
    while (otvet_value <= 5){
        cout << otvet[otvet_value] << endl;
        otvet_value++;
    }
    delete[]otvet;
    delete[]otv;
    for (int count = 0; count < k; count++) { delete[]gorner[count]; }
    system("pause");
    return 0;
}

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

0
Миниатюры
Неожиданное закрытие консольной программы  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2014, 10:35
Ответы с готовыми решениями:

"Неожиданное" закрытие окна при выводе результатов на консоль
Здраствуйте, Уважаемые программисты! Недавно начал учить язык...

Неожиданное завершение программы
простенькая программа, нужно ввести двумерный массив, после чего во втором...

Неожиданное завершение программы на Windows
Вообщем такая беда, решал задачку с одного сайта, решал ее в облаке от Cloud9,...

Неожиданное поведение программы: почему не работает цикл while?
Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни...

Неожиданное поведение программы: исправить ошибку в коде
извиняюсь за возможно глупый вопрос, но почему программа говорит,что в...

13
Ilot
Эксперт С++
1828 / 1186 / 342
Регистрация: 16.05.2013
Сообщений: 3,127
Записей в блоге: 5
Завершенные тесты: 1
10.12.2014, 10:59 #2
У вас проблемы при работе с памятью. Например здесь:
C++
1
otv = new int[k];
Выделение памяти нулевой длины так как k = 0. А дальше разобраться очень тяжело...
Может опишите как она работает?
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 13:11  [ТС] #3
Да, конечно.
1. Вводятся коэффициенты при каждом Х включая свободный делитель.
2. В массив otv неизвестной длинны K заносим все целочисленные делители свободного члена G. (K измеряется в цикле)
3. Создается двумерный массив в виде таблицы 8 * (k+1) (8 - коэффициенты, k+1 потому что нужна таблица 8 * 16 например, а в массиве OTV K = 15), кстати первая ошибочка которую я нашел, не 7, а 8 в массиве gorner .
4. Всему второму столбцу ([1]) присваивается значение A.
5. В самую верхнюю строчку начиная со 2-го столбца ([1]) заношу коэффициенты от A до G. ([0][0] мне не нужно значение по этому NULL)
6. Создается массив с 6 переменными x1, x2, ... , x6.
7. Начиная с 3 столбца, 2 строчки ([2][1]) начинается магия ...... ладно все просто:
0
Миниатюры
Неожиданное закрытие консольной программы  
Ilot
Эксперт С++
1828 / 1186 / 342
Регистрация: 16.05.2013
Сообщений: 3,127
Записей в блоге: 5
Завершенные тесты: 1
10.12.2014, 13:20 #4
STRIX, понятно схема Горнера. Но для otv нужно использовать динамический массив типа vector и следить за указателями. У вас аккурат ошибка обращение к нулевой памяти.
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 13:28  [ТС] #5
Честно говоря я пытался уже это делать все через вектор, но нигде нормального описания изменения его длины я не нашел. Не могли бы вы объяснить по проще как изменять длину вектора ? Я знаю команду otv.resize(n), но я не понимаю что писать в "n", увеличиваемая длина или на сколько увеличить.
0
Ilot
Эксперт С++
1828 / 1186 / 342
Регистрация: 16.05.2013
Сообщений: 3,127
Записей в блоге: 5
Завершенные тесты: 1
10.12.2014, 13:39 #6
А зачем вам изменять его длину если он специально написан для того, что бы это делать автоматически?
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 13:52  [ТС] #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
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <clocale>
using namespace std;
int main(){
    int z = 0,x1 = 0,x2 = 0,x3 = 0,x4 = 0,x5 = 0,x6 = 0, a, b, c, d, e, f, zn, k=0, g, m=1, size = 7, otvet_value = 0;
    setlocale(LC_ALL, "russian");
    cout << "Введите коэффициенты:" << endl;
    cout << "x6  ";
    cin >> a;
    cout << "x5  ";
    cin >> b;
    cout << "x4  ";
    cin >> c;
    cout << "x3  ";
    cin >> d;
    cout << "x2  ";
    cin >> e;
    cout << "x1  ";
    cin >> f;
    cout << "    ";
    cin >> g;
    zn = 1;
    vector<int> otv(k);
    while (m <= g){
        if (g % m == 0){
            otv[k] = m;
            k++;
            otv[k] = -m;
            k++;
            m++;
        }
        else {  m++;  }
    }
    int **gorner;
    gorner = new int*[8];
    for (int i = 0; i < k; i++){
        gorner[i] = new int[k];
    }
    int n = 1;
    while (n <= k){
        gorner[1][n] = a;
        n++;
    }
    gorner[0][0] = NULL;
    gorner[0][1] = a;
    gorner[0][2] = b;
    gorner[0][3] = c;
    gorner[0][4] = d;
    gorner[0][5] = e;
    gorner[0][6] = f;
    gorner[0][7] = g;
    while (zn <= k + 1){
        gorner[zn][0] = otv[z];
        zn++;
        z++;
    }
    int *otvet = new int[6];
    otvet[0] = x1;
    otvet[1] = x2;
    otvet[2] = x3;
    otvet[3] = x4;
    otvet[4] = x5;
    otvet[5] = x6;
    int factor = 2, denominator = 1;
    while (denominator <= k){
        while (factor <= 8){
            gorner[factor][denominator] = gorner[factor - 1][denominator] * gorner[0][denominator] + gorner[factor][0];
            factor++;
            if ((factor == 8) && (denominator <= k)){
                if (gorner[8][denominator] == 0){
                    otvet[otvet_value] = gorner[0][denominator];
                    otvet_value++;
                }
                factor = 2;
                denominator++;
            }
        }
    }
    otvet_value = 0;
    while (otvet_value <= 5){
        cout << otvet[otvet_value] << endl;
        otvet_value++;
    }
    delete[]otvet;
    for (int count = 0; count < k; count++) { delete[]gorner[count]; }
    system("pause");
    return 0;
}
0
Миниатюры
Неожиданное закрытие консольной программы  
Ilot
Эксперт С++
1828 / 1186 / 342
Регистрация: 16.05.2013
Сообщений: 3,127
Записей в блоге: 5
Завершенные тесты: 1
10.12.2014, 14:02 #8
C++
1
2
3
4
5
6
7
8
9
vector<int> otv;
while (m <= g){
    if (g % m == 0){
        otv.push_back(m);
        otv.push_back(-m);
    }
    ++m;
}
k = otv.size();
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 14:15  [ТС] #9
Эх, теперь первая ошибка вылетает, просто закрывается. Такое чувство что не судьба
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,360
10.12.2014, 14:31 #10
STRIX,
отладчиком пользоваться умеешь?
если нет, воспользуйся отладочной печатью
после каждого критического участка кода
напиши что то типа
C++
1
 cout<<"step1";
можешь вывести значения переменных, массива
тогда сможешь локализовать участок где падает

Добавлено через 4 минуты
Цитата Сообщение от STRIX Посмотреть сообщение
C++
1
2
3
4
gorner = new int*[8];
    for (int i = 0; i < k; i++){
        gorner[i] = new int[k];
    }
интересный участок
выделяем 8 ячеек
а создаем k указателей
а если k больше 8? куда запись пойдет
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 14:57  [ТС] #11
Я этот участок вообще делал по подобию, просто не мог понять как сделать двумерный динамический массив, а там было для квадратного массива, у меня же прямоугольный.
Участок в следствии команд system("pause") вывелся таким:
C++
1
2
3
4
5
while (zn <= k + 1){
        gorner[zn][0] = otv[z];
        zn++;
        z++;
    }
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,360
10.12.2014, 15:05 #12
Цитата Сообщение от STRIX Посмотреть сообщение
zn <= k + 1
выход за пределы
при последних итерациях будешь обращаться к ячейкам gorner[k][0] gorner[k+1][0]
0
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
10.12.2014, 15:50  [ТС] #13
Ну ничего в итоге не вышло, вот что я сделал: (но ошибка та же)
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
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <clocale>
using namespace std;
int main(){
    int z = 0,x1 = 0,x2 = 0,x3 = 0,x4 = 0,x5 = 0,x6 = 0, a, b, c, d, e, f, zn, k=0, g, m=1, size = 7, otvet_value = 0;
    setlocale(LC_ALL, "russian");
    cout << "Введите коэффициенты:" << endl;
    cout << "x6  ";
    cin >> a;
    cout << "x5  ";
    cin >> b;
    cout << "x4  ";
    cin >> c;
    cout << "x3  ";
    cin >> d;
    cout << "x2  ";
    cin >> e;
    cout << "x1  ";
    cin >> f;
    cout << "    ";
    cin >> g;
    zn = 1;
    int delta = 1;
    vector<int> otv;
    while (m <= g){
        if (g % m == 0){
            otv.push_back(m);
            otv.push_back(-m);
            cout << "step" << delta << " "; // Убрать
            delta++;                        // Убрать
        }
            ++m;
    }
    cout << "step2_1";
    k = otv.size();
    int **gorner;
    int delta2 = 1; // Убрать
    gorner = new int*[7];
    for (int i = 0; i < k; i++){
        gorner[i] = new int[k];
        cout << "step3_" << delta2; // убрать
        delta2++;                   // убрать
    }
    int n = 1;
    while (n <= k){
        gorner[1][n] = a;
        n++;
    }
        gorner[0][0] = NULL;
    gorner[1][0] = a;
    gorner[2][0] = b;
    gorner[3][0] = c;
    gorner[4][0] = d;
    gorner[5][0] = e;
    gorner[6][0] = f;
    gorner[7][0] = g;
    int *otvet = new int[6];
    otvet[0] = x1;
    otvet[1] = x2;
    otvet[2] = x3;
    otvet[3] = x4;
    otvet[4] = x5;
    otvet[5] = x6;
    int factor = 2, denominator = 1;
    while (denominator <= k){
        while (factor <= 7){
            gorner[factor][denominator] = gorner[factor - 1][denominator] * gorner[0][denominator] + gorner[factor][0];
            factor++;
            if ((factor == 7) && (denominator <= k)){
                if (gorner[8][denominator] == 0){
                    otvet[otvet_value] = gorner[0][denominator];
                    otvet_value++;
                }
                factor = 2;
                denominator++;
            }
        }
    }
    otvet_value = 0;
    while (otvet_value <= 5){
        cout << otvet[otvet_value] << endl;
        otvet_value++;
    }
    delete[]otvet;
    for (int count = 0; count < k; count++) { delete[]gorner[count]; }
    system("pause");
    return 0;
}
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,360
10.12.2014, 16:47 #14
Цитата Сообщение от STRIX Посмотреть сообщение
C++
1
2
gorner = new int*[7];
    for (int i = 0; i < k; i++){
может все таки
C++
1
2
gorner = new int*[7];
    for (int i = 0; i < 7; i++){
Добавлено через 1 минуту
Цитата Сообщение от STRIX Посмотреть сообщение
gorner[7][0] = g;
а это уже восьмая ячейка
выделили семь
0
10.12.2014, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 16:47

Неожиданное поведение программы: почему не работает цикл do while?
Здравствуйте,подскажите,пожалуйста,почему не работает цикл ... Условие корявое?...

Неожиданное поведение программы: найти ошибку в коде
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите...

Неожиданное поведение программы: почему программа внезапно завершает работу?
Писал в codeblocks с компилятором gnu gcc. После запуска и ввода данных...


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

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

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