0 / 0 / 0
Регистрация: 15.05.2016
Сообщений: 5
1

Вычисление определителя

15.05.2016, 11:19. Показов 2274. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, дорогие форумчане!

Помогите, пожалуйста, отладить программу вычисления определителя на Cи++

Текст программы:

#include "stdafx.h"
#include <stdlib.h>
#include <ctime>
#include <iostream>
#include <stdio.h> //Здесь находится объявление функции fopen и объявлен тип структуры FILE
#include <time.h>
using namespace std;

#define N 20


int main()
{
FILE *f1;
f1 = fopen("tests.txt", "r");

setlocale(LC_CTYPE, "rus");


int A [N][N]; // В массив A записываем матрицу

int n;
fscanf (f1, "%d", &n);
cout <<n << endl;;
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{

fscanf (f1, "%d", &A[i][j]);
printf ("%3d", A[i][j]);
//cout << A[i][j] << " ";
}
cout << endl;
}

// Теперь в массиве A[][] записана матрица из файла

// ВЫЧИСЛЕНИЕ ОПРЕДЕЛИТЕЛЯ

int i = 1; int r; int p = 1; double eps; int X; //X - значение определителя
r = n;
eps = 0.00001;

while (i<=r)
{//Выбор ведущего элемента A[v][i]
int v=i;
for (int j = i+1; j <= n; j++)
if (abs (A[j][i])>abs(A[v][i])) v = j;
if (abs (A[v][i]) < eps) r = i-1; //ОШИБКА????? д.б (n-1)???
else
{//перестановка строк
if (v!=i)
{p = -p;
for (int j = i; j<=n; j++)
{int z = A[i][j]; A[i][j] = A [v][j]; A[v][j] = z;}
}
//вычитание строк матрицы //Здесь нет ошибки? Получается, что элемент делится на диагональный, равный 0
for (int k = i+1; k<=n; k++)
{int c = A[k][i]/A[i][i];
for (int j = i; j<=n; j++)
A[k][j] = A[k][j] - c*A[i][j];
}
i++;
}
}
// вычисление определителя
if (r<n) X = 0; //Если ранг r меньше количества строк, то система имеет бесконечно много решений
else {X = p*A[1][1];
for (int i = 2; i<=n; i++) X*=A[i][i]; //Определитель = произведению элементов, стоящих на диагонали в матрице A
}

//Вывод определителя
cout << "Определитель равен = " << X << endl;


fclose(f1);

return 0;
}

Конец программы.

При введении матрицы
4 (это размерность)
1 1 1 1
0 2 2 2
0 0 3 3
7 7 7 11

определитель должен получаться 24, а меня программа выдает совершенно дикое число - 1546188240

Также пробовала протестировать программу вручную (с бумагой и ручкой). Во-первых, получаются нули на диагонали (но такого не должно быть), т.к. определитель автоматически равен 0 в этом случае.
И во-вторых, в предпоследнем цикле получается c =2/0. Но как получилось деление на 0?

Буду рада за оказание любой помощи!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2016, 11:19
Ответы с готовыми решениями:

Вычисление определителя матрицы N*N
Дорогие форумчане, никто не подскажет как вычислить определитель квадратной матрицы, сам код не...

Вычисление следа матрицы и определителя
воббщем надо реализовать вычисление следа матрицы и определителя алгоритм для следа : #include...

Вычисление определителя Методом Гаусса
Как сделать обмен строк в этом методе? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt;...

Функция класса(вычисление определителя произвольной матрицы) работает не правильно(постоянно определитель 0)
void deterMatr(matr matrx) { if (matrx.rows == matrx.columns){ //приведение матрицы к...

5
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
15.05.2016, 11:50 2
lena-emrikh, у тебя жуткие проблемы с индексацией в твоей матрице.
Матрица "n на n", индексация начинает с нуля, но у тебя повсеместно в циклах индекс топает до n включительно.
1
0 / 0 / 0
Регистрация: 15.05.2016
Сообщений: 5
15.05.2016, 12:03  [ТС] 3
Спасибо, исправила при сканировании индексацию в цикле (i<=n и j<=n).
Теперь лучше, но все равно неверно считает определитель. Так он получается равным -42, а не 24
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
15.05.2016, 13:04 4
lena-emrikh, а как исправила?
Код, заключенный в теги C++, пожалуйста.
1
0 / 0 / 0
Регистрация: 15.05.2016
Сообщений: 5
15.05.2016, 13:08  [ТС] 5
Вот так!

Кликните здесь для просмотра всего текста
int n;
fscanf (f1, "%d", &n);
cout <<n << endl;;
for (int i = 1; i<=n; i++)
{
for (int j = 1; j<=n; j++)
{
fscanf (f1, "%d", &A[i][j]);
printf ("%3d", A[i][j]);
}
cout << endl;
}




Простите, я новичок, не знаю еще, как управлять сайтом. Но очень постараюсь сделать, если Вы объясните, как сделать текст, заключенный в теги
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
15.05.2016, 13:38 6
Лучший ответ Сообщение было отмечено lena-emrikh как решение

Решение

Цитата Сообщение от lena-emrikh Посмотреть сообщение
как сделать текст, заключенный в теги
Около левого угла редактора есть кнопка "С++", которая вставляет два тега в текстовое поле.
Все, что будет находиться между ними будет трактоваться как код C++.

C++
1
2
3
4
5
6
7
8
9
10
11
12
int n;
fscanf (f1, "%d", &n);
cout <<n << endl;;
for (int i = 1; i<=n; i++)
{
    for (int j = 1; j<=n; j++)
    {
        fscanf (f1, "%d", &A[i][j]);
        printf ("%3d", A[i][j]);
    }
    cout << endl;
}
Еще раз напомню, индексация массивов в C++ идет с нуля, т.е. у массива длины N, первый элемент имеет индекс 0, а последний N-1. Так что не советую делать иначе, пока точно не будешь понимать зачем тебе это надо в данном конкретном случае.
Миниатюры
Вычисление определителя  
1
15.05.2016, 13:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2016, 13:38
Помогаю со студенческими работами здесь

Нахождение определителя
Условие: Вот мой вариант(немного исправил условие под себя): #include &lt;cstdio&gt; #include...

Подстроение алгоритма определителя
Доброго времени суток уважаемые форумчане! Мне уже надоело искать нормальный и рабочий алгоритм для...

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

Нахождение определителя матрицы
Здравствуйте! Функция det правильно находит определитель для матрицы temp1, но неправильно для...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru