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

Неизвестная ошибка(скорее всего с размером массива\памяти) - C++

Восстановить пароль Регистрация
 
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
09.03.2013, 02:33     Неизвестная ошибка(скорее всего с размером массива\памяти) #1
Программа должна решать СЛУ методом Гаусса, не нужно конкретных значений, а просто свести к треугольному виду, и упростить(с фундаментальной системой возиться считаю бредом)

Пример: К-ство неизвестных 2 К-ство строк 4
Вводим значения: 1 1 2 2 3 3 4 4
Получаем ответ:
1 = 1
0 = 0
0 = 0
0 = -inf

Раньше, алгоритм работал, но когда я начал "защищать" программу от нулевых столбцов и нулевых элементов на диагонали появилось это загадочное @-inf@. Всегда в последней строке, после первого элемента,
например:
1 2 3 = 6
0 2 3 = 5
3 -inf -inf = -inf
(числа взяты с головы, главное, показано как ведет себя -inf)
Деления на ноль вроде отсутствует, а потому я решил откинуть предположение с бесконечностью.
Я так понимаю, где то ошибка с размером цикла/массива.
Написано было в Xcode.

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
#include <iostream>
 
using namespace std;
 
int main() {
    
    setlocale(LC_ALL, "Russian");
    cin.precision(2);
    int heigth, length;
    cout << "Введите количество неизвестных: ";
    cin >> length;
    cout << "Введите количество строк: ";
    cin >> heigth;
    
    double **matrix = new double*[heigth]; // Выделение памяти для массива
    for (int i = 0; i < heigth; i++) {
        matrix[i] = new double[length+1];
    }
    
    double **new_matrix = new double*[heigth]; // Выделение памяти для массива
    for (int i = 0; i < heigth; i++) {
        new_matrix[i] = new double[length+1];
    }
    
    for ( int i = 0; i < heigth; i++) {            //заполнение матрицы
        for ( int j = 0; j < (length+1); j++) {
            if (j != (length)) {
                cout << "Введите коефициент " << i+1 << " строки " << j+1 << " столбца ";
                cin >> matrix[i][j];
            }
            else {
                cout << "Введите значение, которому равно " << i+1 << " уравнение ";
                cin >> matrix[i][j];
            }
        }
    }
    
    for (int h = 0; h < heigth; h++) {        //метод Гаусса
        int zero = 0;
        int count = 0;
        int count2 = 0;
        int border = heigth;
        for (int k = 0; k < length+1; k++) {
           while (matrix[h][k] == 0) {                //защита от нулевых столбцов
                zero++;
                if (zero == border) {
                    k++;
                    count2++;
                    break;
                }
                else {for (int g = 0; g < (length+1); g++) {    //смена строки, если на диагонали 0 элемент
                    swap(matrix[k][g], matrix[k+1][g]);
                    }
                }
            }
        
            for (int i = count; i < heigth-1; i++) {            //алгоритм
                for (int j = count2; j < (length+1); j++) {
                    new_matrix[h][j] = (matrix[h][j]/matrix[h][k]);
                    new_matrix[i+1][j] = (matrix[i+1][j] - new_matrix[h][j]*(matrix[i+1][k]/new_matrix[h][k]));
                }
            }
            k++;
            count++;
            count2++;
            border--;
            break;
        }
    }
 
   for ( int i = 0; i < heigth; i++) {     //вывод матрицы на экран
        for ( int j = 0; j < (length+1); j++) {
            if (j != length) {
                cout << new_matrix[i][j] << " ";
            }
            else {
                cout << "= " << new_matrix[i][j];
            }
        }
        cout << endl;
    }
    
    delete [] matrix;
    delete [] new_matrix;
    
    return 0;
}
PS За освобождение памяти не ругать, еще руки не дошли до этого куска кода и было сделано временно для моего удобства.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 02:33     Неизвестная ошибка(скорее всего с размером массива\памяти)
Посмотрите здесь:

Ошибка в цикле for(скорее туплю просто) C++
Вставлять тирэ после каждого второго символа строки? В коде скорее всего какое-то переполнение происходит C++
C++ Задача на динамическое программирование(скорее всего) (сколькими способами в сумме получить N, без подряд идущих одинаковых чисел)
C++ неизвестная ошибка
C++ Неизвестная ошибка с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
09.03.2013, 02:36     Неизвестная ошибка(скорее всего с размером массива\памяти) #2
Делите программу на функции(классы) тяжко читать такое.
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
09.03.2013, 13:45  [ТС]     Неизвестная ошибка(скорее всего с размером массива\памяти) #3
Я заранее прошу прощения за такой код, просто функции плохо знаю, а классы еще вообще не изучал.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
09.03.2013, 13:49     Неизвестная ошибка(скорее всего с размером массива\памяти) #4
Если не ошибаюсь, то для двумерного массива освобождение памяти нужно делать так:
C++
1
2
3
4
            for(int i=0; i < heigth; ++i)
                delete [] matrix [i];
 
            delete[] matrix ;
JuiK
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 3
09.03.2013, 17:48  [ТС]     Неизвестная ошибка(скорее всего с размером массива\памяти) #5
Afflicted, спасибо, с освобождение памяти проблем не будет, проблема в алгоритме... Не могу понять где ошибся в счетчике.
Yandex
Объявления
09.03.2013, 17:48     Неизвестная ошибка(скорее всего с размером массива\памяти)
Ответ Создать тему
Опции темы

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