Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
STRIX
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 20
Завершенные тесты: 1
#1

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

10.12.2014, 10:35. Просмотров 354. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неожиданное закрытие консольной программы (C++):

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

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

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

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

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

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

13
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
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
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
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
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
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
Привет! Вот еще темы с ответами:

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

Вычислить значение функции (неожиданное поведение программы - как исправить?) - C++
Мне нужно вичислить значение функции у= (4*(x^3)-2*(x^2)+5);для значении x от -3 до 1.Написан такой код: #include&lt;stdio.h&gt; ...

Прохождение лабиринта: неожиданное поведение программы (найти и исправить ошибки) - C++
Всем доброго времени суток. В общем написал я программу для генерации лабиринта и программу для его прохождения. В первой генерирую...

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


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

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

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