Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
platinum133
4 / 4 / 1
Регистрация: 19.04.2017
Сообщений: 35
Завершенные тесты: 1
1

Ошибка при вызове функции

16.05.2017, 11:06. Просмотров 830. Ответов 9
Метки нет (Все метки)

Добрый день!
Есть функция по расчету детерминанта
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
int _det(int size,double **arr,double &det)
{
int i,j,k;
det=1;
double b;
for(i=0;i<size;i++)
{
    for(j=i+1;j<size;j++)
    {
    if(arr[i][i]==0)
    {
        if(arr[i][j]==0)
        b=0;
        else
        return 0;
    }
    else b=arr[j][i]/arr[i][i];
    for(k=i;k<size;k++)
    arr[j][k]=arr[j][k]-arr[i][k]*b;
    }
det*=arr[i][i];
}
return 1;
}
Работает правильно.
Ошибка при ее вызове в данном цикле, если кратко - в матрице заменяется столбец из другой матрицы и считается детерминант, далее заменяется уже второй столбец и так до конца.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double *z = new double[size];
       for (int j=0; j<size; j++)
       {
          for (int i=0; i<size; i++) {
          z[i] = arr_x[i][j];
          arr_x[i][j] = arr_y[i];
       }
        double det;
         if(_det(size,arr_x,det)==1)
           {
             cout << "Детерминанты матрицы Xi = " << det <<endl;
           }
            else
            {
              cout << "Ошибка! Детерминант невозможно рассчитать!" << endl;
             }
               cout <<endl;
          for (int i=0; i<size; i++)
          arr_x[i][j] = z[i];
      }
При том результат верный только для первой замены, после считает неправильно, как я понимаю переменной det присваивается значение предыдущего расчета и из-за этого происходит неверный расчет.
Как исправить?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2017, 11:06
Ответы с готовыми решениями:

Ошибка при вызове функции
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту...

Ошибка при вызове функции
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции,...

GCC ошибка при вызове функции
Здравствуйте. Проблема в следующем: при вызове функции sub из тела add...

Ошибка компиляции при вызове виртуальной функции
Здравствуйте. Сильно не плюйтесь, в С я не силен. Пишу на джаве, но попал в...

Ошибка при вызове шаблона функции в другом классе
цель моей функции- выводить значения переменной в любом формате. функция в...

9
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
16.05.2017, 14:07 2
Цитата Сообщение от platinum133 Посмотреть сообщение
Ошибка при ее вызове в данном цикле
Какая ошибка?
0
platinum133
4 / 4 / 1
Регистрация: 19.04.2017
Сообщений: 35
Завершенные тесты: 1
16.05.2017, 14:26  [ТС] 3
В расчетах, правильный детерминант получается только при первом вызове функции в цикле, дальше идут неверные расчеты, не могу понять почему
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
16.05.2017, 14:52 4
Цитата Сообщение от platinum133 Посмотреть сообщение
не могу понять почему
При каждой итерации цикла создаёшь новый det:
Цитата Сообщение от platinum133 Посмотреть сообщение
C++
1
double det;
Добавлено через 2 минуты
Я так и не понял: нужно сохранять значение det, изменённое в функции, или нет?

Добавлено через 4 минуты
Хотя, в любом случае, в функции, det задаётся начальное значение равное 1.

Добавлено через 2 минуты
Цитата Сообщение от platinum133 Посмотреть сообщение
как я понимаю переменной det присваивается значение предыдущего расчета
Нет.
0
platinum133
4 / 4 / 1
Регистрация: 19.04.2017
Сообщений: 35
Завершенные тесты: 1
16.05.2017, 14:53  [ТС] 5
Сейчас напишу максимально подробно и точно. Имеем матрицу X и Y ( см. приложение). Находим функцией детерминант det_x, далее циклом заменяются столбцы ( пример во вложении), и выполняется функция. Сам временный det_xi сохранять ну нужно, сохраняется только переменная C, формула которой во вложении.
0
Миниатюры
Ошибка при вызове функции  
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
16.05.2017, 14:54 6
Цитата Сообщение от platinum133 Посмотреть сообщение
как я понимаю переменной det присваивается значение предыдущего расчета
Нет. Если есть ошибка, то не от этого. На каждой итерации у тебя создаётся новый det, передаётся в функцию по ссылке, там задаётся начальное значение det равное 1, потом считается, после выхода из функции выводится подсчитанное в функции значение det. И так на каждой итерации цикла.
0
platinum133
4 / 4 / 1
Регистрация: 19.04.2017
Сообщений: 35
Завершенные тесты: 1
16.05.2017, 14:57  [ТС] 7
Я вот и не понимаю, почему последующие результаты неправильные, ведь в функции det всегда задается начальное значение 1.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
16.05.2017, 15:02 8
Цитата Сообщение от platinum133 Посмотреть сообщение
Я вот и не понимаю, почему последующие результаты неправильные, ведь в функции det всегда задается начальное значение 1.
Значит дело не в det.
Цитата Сообщение от nd2 Посмотреть сообщение
Если есть ошибка, то не от этого.
0
platinum133
4 / 4 / 1
Регистрация: 19.04.2017
Сообщений: 35
Завершенные тесты: 1
16.05.2017, 15:18  [ТС] 9
А в чем может быть?
Если выполнить функцию до цикла с заменой столбцов для матрицы Х, детерминант посчитается правильно.
C++
1
2
3
4
5
6
7
8
9
double det_x;
          if(_det(size,arr_x,det_x)==1)
           {
             cout << "Детерминанты матрицы X = " << det_x <<endl;
           }
            else
            {
              cout << "Ошибка! Детерминант невозможно рассчитать!" << endl;
             }
Но в цикле уже и первый результат будет неверным.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
16.05.2017, 17:20 10
Лучший ответ Сообщение было отмечено platinum133 как решение

Решение

Цитата Сообщение от platinum133 Посмотреть сообщение
Если выполнить функцию до цикла с заменой столбцов для матрицы Х, детерминант посчитается правильно.
Цитата Сообщение от platinum133 Посмотреть сообщение
Но в цикле уже и первый результат будет неверным.
Смотри, что в цикле, до вызова функции (и после), делается, а что не в цикле не делается (или не так делается).

Добавлено через 1 час 33 минуты
У тебя ошибка в том, что массив arr_x полностью не восстанавливается после вызова функции в цикле (в функции он меняется). Тебе нужно, перед циклом, сделать копию arr_x, в конце итерации цикла воостановить arr_x из копии.

Добавлено через 18 минут
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
int _det(int size, double **arr, double &det)
{
    int i , j, k;
    det = 1;
    double b;
    for (i = 0; i < size; i++)
    {
        for (j = i + 1; j < size; j++)
        {
            if (arr[i][i] == 0)
            {
                if (arr[i][j] == 0)
                    b = 0;
                else
                    return 0;
            }
            else 
                b = arr[j][i] / arr[i][i];
            for (k = i; k < size; k++)
                arr[j][k] = arr[j][k] - arr[i][k] * b;
        }
        det *= arr[i][i];
    }
    return 1;
}
 
void show(double** arr, int size)
{
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
           cout << arr[i][j] << ' ';
        cout << endl;
    }
    cout << endl;
}
 
int main()
{   
    setlocale(0, "");
    int size = 3;
    double** arr_x = new double*[size];
    for (int i = 0; i < size; ++i)
    {
        arr_x[i] = new double[size];
        for (int j = 0; j < size; ++j)
            arr_x[i][j] = 1;
 
    }
    arr_x[0][1] = 4;
    arr_x[1][1] = 5;
    arr_x[2][1] = 55;
    arr_x[0][2] = 3;
    arr_x[1][2] = 6;
    arr_x[2][2] = 1;
    
    show(arr_x, size);
    
    double* arr_y = new double[size];
    double n = 5;
    for (int j = 0; j < size; ++j)
            arr_y[j] = n++;
    
    double **z = new double*[size];
    for (int i = 0; i < size; ++i)
        z[i] = new double[size];
 
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size; j++) 
            z[i][j] = arr_x[i][j];
        
    for (int j = 0; j < size; j++)
    {
        for (int i = 0; i < size; i++) 
        {
            arr_x[i][j] = arr_y[i];
        }
        show(arr_x, size);
        double det;
        if(_det(size,arr_x,det) == 1)
        {
            cout << "Детерминанты матрицы Xi = " << det <<endl;
        }
        else
        {
            cout << "Ошибка! Детерминант невозможно рассчитать!" << endl;
            }
            cout <<endl;
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; ++j)
                    arr_x[i][j] = z[i][j];
            show(arr_x, size);
    }
    system("pause");
}
1
Миниатюры
Ошибка при вызове функции  
16.05.2017, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2017, 17:20

Ошибка при вызове виртуальной функции в производном классе
Здравствуйте, извините, если подобная тема появлялась, но либо у меня руки не...

Ошибка при вызове функции добавления нового элемента в массив
Описывается класс Datchik. Затем в классе Lists объявляется массив объектов...

Ошибка при вызове функции transform с функцией, в качестве аргумента
Здравствуйте! Хочу перевести строку в нижний\верхний регистр, используя...


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

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

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