Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 15.05.2016
Сообщений: 5

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

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

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

Помогите, пожалуйста, отладить программу вычисления определителя на 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2016, 11:19
Ответы с готовыми решениями:

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

Вычисление следа матрицы и определителя
воббщем надо реализовать вычисление следа матрицы и определителя алгоритм для следа : #include &lt;stdio.h&gt; typedef int *pInt; ...

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

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

Кликните здесь для просмотра всего текста
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
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.05.2016, 13:38
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru