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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
#1

Код вычисления определителя матрицы до 10-го порядка - C++

18.01.2014, 23:20. Просмотров 2325. Ответов 19
Метки нет (Все метки)

Мне очень нужен код программы для вычисления определителя матрицы до 10-го порядка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2014, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Код вычисления определителя матрицы до 10-го порядка (C++):

Улучшение алгоритма вычисления определителя матрицы, порядка n>3 - C++
Всем доброго времени суток, я достаточно долго искал шаблон кода для вычисления определителя квадратной матрицы, нашел на просторах рунета...

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

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

Рекурсивный метод вычисления определителя матрицы - C++
суть в том, что не получается реализовать рекурсивный метод Determinant в классе Matrix. #include <iostream> using namespace std; ...

Написать функцию для вычисления определителя матрицы - C++
Нужна функция для вычисления ОПРЕДЕЛИТЕЛЯ матрицы, аргументами которой будет количество строк в матрице N и сама матрица. п.с. или ссылку...

Создать функцию для вычисления определителя матрицы 2х2 - C++
Создать функцию для вычисления определителя матрицы 2х2. (в C++) HELP ME PLEASE

19
S_el
2106 / 1625 / 308
Регистрация: 15.12.2013
Сообщений: 6,483
18.01.2014, 23:23 #2
Что уже сделали?
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
18.01.2014, 23:34 #3
S_el, на форуме зарегистрировался же
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
18.01.2014, 23:58  [ТС] #4
Нашел такой код (извините за неправильное оформление - только осваиваюсь, обещаю исправиться):
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 <cmath>
#include <ctime>
 
using namespace std;
 
void Gauss(double *a, double *b, double *x,int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
{
 int i,j,k,t;
 double kof,s;
 double temp;
 for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
 {
  for (t=i, j=i-1; j>=0; --j) //Ищем строку с максимальным в i-том столбце коэффициентом.
  {
   if (fabs(a[i*n+t])<fabs(a[i*n+j]))
   {
    t=j;
   }
  }
  if (a[i*n+t]==0.0)
  {
   return;
  }
  if (t!=i) // Если она не i-тая
  {
   for (k=n-1; k>=0; --k) // Меняем её с i-той
   {
    temp=a[k*n+t];
    a[k*n+t]=a[k*n+i];
    a[k*n+i]=temp;
   }
  }
  for (j=i-1; j>=0; --j) // Цикл пo уравнениям-уменьшаемым
  {
   kof=a[i+j*n]/a[i*n+i]; // kof=a[j][i]/a[i][i];
   for (a[i+j*n]=0.0, b[j]-=b[i]*kof, k=i-1; k>=0; --k) // Цикл по столбцам
   {
    a[k+j*n]-=a[k+i*n]*kof; // a[k][j]-=a[k][i]*kof
   }
  }
 }
 x=new double [n];
 if (x)
 {
  for (i=0; i<n; ++i)
  {
   for (s=0.0, j=i-1; j>=0; --j)
   {
    s+=a[j+i*n]*x[j]; //s+=a[j][i]*x[j]
   }
   x[i]=(b[i]-s)/a[i*n+i]; // x[i]=(b[i]-s)/a[i][i];
   //cout << x[i] << "\n";
  }
 }
 cout << "\n";
 for (i=0; i<n; ++i)
cout << "x " << x[i] << endl;
}
 
 
main()
{
srand((unsigned)time(NULL));
      int n = 6;
     double gauss2[6] ={1,5,3,7,6,3};
      double M[36]={0, 0, 1,0, 0, 0,0, 0, 0, -1, 0, 0,0, 8, 0, 0, 0, 4,0, 0, 0, 0, 6,0, 0, 6, 0, 0, 0, 0,1, 0, 0, 0, 0, 0 };
        
      double *y = new double[n];
 
    /*  for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                {
                    //cin >> M[i+j*n];
                     M[i+j*n] = rand()/100;
//cout << "gauss1["<< i << "][" << j << "]=";
//cin >> gauss1[i][j];
                }
        }
*/
for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                {
                     cout << M[i*n+j] << "  ";
                }
                cout << gauss2[i] << endl;
        }   
      Gauss(M,gauss2,y,n);
       cin.get();
}
0
S_el
2106 / 1625 / 308
Регистрация: 15.12.2013
Сообщений: 6,483
19.01.2014, 00:14 #5
И что это за код?
Может все-таки сами попробуете?
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 00:27  [ТС] #6
Это код решения системы уравнений Методом Гаусса.
В программировании я новичок, осваиваю при помощи самоучителей и справочников (Лафоре, Страуструп, Андрианова А.А., Динман М.). Но освоить удалось пока не много, поэтому разбираю в основном на примерах.
0
palva
2745 / 1846 / 266
Регистрация: 08.06.2007
Сообщений: 7,027
Записей в блоге: 4
19.01.2014, 03:29 #7
Если вы изучаете самостоятельно, то советую взять книгу с упражнениями (Лафоре, например) и решать именно их.

Если вы взяли вашу задачу из какой-то книги, то посмотрите к какой главе она относится, чтобы понять, какой материал вам надо использовать и закреплять на этой задаче. Судя по условию n<=10 здесь имеется в виду использование рекурсии и разложение определителя по строке.

Если вы берете код для образца, то не берите его из сомнительных источников. Разбирайте его только после того, как поймете идею алгоритма. Понять идею по описанию проще, чем понять ее по коду.

Если вы хотите делать методом Гаусса, который вообще-то предназначен для решения систем, то можно не выполняь его до конца, а проводить только прямой ход, перемножая главные элементы. Произведение главных элементов и будет определителем с учетом того, что при каждой перестановке строк у определителя меняется знак.

Добавлено через 1 час 7 минут
Цитата Сообщение от palva Посмотреть сообщение
Судя по условию n<=10 здесь имеется в виду...
Хотя может быть, это намек, что матрицу следует хранить в массиве с двумя индексами размером 10х10.
В коде, который вы выложили, матрица хранится в массиве с одним индексом.
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 12:26  [ТС] #8
Задача взята из моей контрольной работы, я учусь заочно на 1-м курсе,
начитка была всего 1 пара, где показали как включать VS C++2010,
скомпилировали программу "Hello World", вручили контрольную работу, благословили
и пустили в вольное плавание. Поэтому если встречали похожие примеры задач или
литературу где встречалось похожее условие буду очень признателен.
0
palva
2745 / 1846 / 266
Регистрация: 08.06.2007
Сообщений: 7,027
Записей в блоге: 4
19.01.2014, 12:33 #9
А приводить матрицу к ступенчатому виду методом Гаусса вы умеете? Знаете, что происходит с определителем матрицы при элементарных преобразованиях?
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 13:04  [ТС] #10
Да, решать матрицы я умею, с математикой у меня порядок, а в программировании профан.
0
palva
2745 / 1846 / 266
Регистрация: 08.06.2007
Сообщений: 7,027
Записей в блоге: 4
19.01.2014, 13:36 #11
Ну если ваш метод это не писать свой код, а разбираться в чужом, тогда разбирайтесь в том, что вы выложили.
Математику вы понимаете, а по программированию задавайте вопросы, что непонятно.
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 23:45  [ТС] #12
Пока что это всё, до чего додумался.
Код предназначенный для заполнения матрицы пользователем, но скомпилировать не могу - появляется ошибка "Run-Time Check Failure #3 - The variable 'N' is being used without being initialized.
- Переменная 'N' используется без инициализации." Вроде бы все переменные объявлены.
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
#include <stdarg.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"RUS");
    int i,j,N,M;double *a;
 
    a = new double [N*M];
    for (i=0;i<N;i++)
    for (j=0;j<M;j++)
 
        cout<<"N="; cin>>N;
    
    if (N<=10)
    {
        cout<<"M="; cin>>M;
    }
    else
    {
        cout<<"число строк не должно превышать 10, введите другое число"; cin>>N;
    }
    
    cout<<"M="; cin>>M;
    if (M=N)
    {
        cout<<"введите матрицу А"<<endl;
    }
    else
    {
        cout<<"вы ввели не правильное число столбцов, оно должно равняться числу строк"; cin>>M;
    }
    {
        cin>>*(a+i*M+j);
    }
 
    delete []a;
    system("pause");
    return 0;
}
0
palva
2745 / 1846 / 266
Регистрация: 08.06.2007
Сообщений: 7,027
Записей в блоге: 4
20.01.2014, 00:42 #13
Цитата Сообщение от 19dmitry Посмотреть сообщение
Вроде бы все переменные объявлены.
А причем здесь объявлены? Им не присвоено значение, а они должны быть использованы. Это криминал.
Кроме того, они используются в вычислении размера статического массива, поэтому должны быть константами.
А почему вы используете две переменные? Для того, чтобы определитель мог быть вычислен, матрица должна быть квадратная, то есть M=N.
0
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:29  [ТС] #14
Совершенно верно, для вычисления определителя, матрица должна быть квадратная, но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу. Именно это я и хотел предотвратить используя условные операторы if/else.

P.s. Спасибо за замечания буду разбираться дальше.
0
palva
2745 / 1846 / 266
Регистрация: 08.06.2007
Сообщений: 7,027
Записей в блоге: 4
20.01.2014, 01:38 #15
Цитата Сообщение от 19dmitry Посмотреть сообщение
но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу
Странно, что мы до сих пор не увидели оригинального условия задачи.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 01:38
Привет! Вот еще темы с ответами:

Исправить код c++ ,нахождение определителя матрицы - C++
Необходимо найти определитель матрицы,выдает ошибку. Так же ,может кто предложит свой код нахождения определителя матрицы,нужно срочно. ...

Код для нахождения определителя матрицы N на N исключением строки и столбца - C++
Подскажите пожалуйста код для нахождения определителя матрицы N на N исключением строки и столбца

Вычисления матрицы любого порядка - C++
Есть какой либо алгоритм или формула для вычисления матрицы любого порядка? Или же для каждого порядка писать отдельный код?

Написать программу для поиска определителя до 10 порядка включительно - C++
Здравствуйте. Очень нужна помощь. Нужно написать программу для поиска определителя до 10 порядка включительно. На форуме есть множество...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.01.2014, 01:38
Ответ Создать тему
Опции темы

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