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

Определитель матрицы используя рац.дроби (Гаусс) - C++

Восстановить пароль Регистрация
 
AlexStud
Сообщений: n/a
31.05.2013, 23:10     Определитель матрицы используя рац.дроби (Гаусс) #1
Здравствуйте уважаемые форумчане! Я-студент,новичок в программировании.
В своей программе-курсовике по подсчету определителя NxN методом Гаусса я столкнулся с проблемой.
Программа или считает правильно или совершенно нет.Я думаю,что при подсчете,в определенный момент может наступить переполнение типа int;
Вот как работает программа:
сначала вводится размер маттрицы,далее по нему создается динамич.массив веществ чисел,
этот массив копируется в другой массив рац.дробей(структура с int числит.,int знаменат.)
по второму массиву уже и считается определитель(ф-ия derivative);
Подскажите пожалуйста-как можно исправить ошибку подсчета?
вот часть моего кода:
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
96
97
98
99
100
101
102
103
104
...
int pogr=1E3;
double **massiv; Drob **mass; //+ф-ии на создан.динам.массивов
struct Drob
{
    int Chisl;
    int Znam;
};
 
int Evklid(int a, int b)
{
   int c;
   while (b!=0) 
   {
      c = a % b;
      a = b;
      b = c;        
   }
   return abs(a);
}
 
Drob der, ic, z, maxEl, element;
 
Drob Sokr(Drob &Sok)
{
    int z = Evklid(Sok.Chisl, Sok.Znam);
    Sok.Chisl /= z;
    Sok.Znam /= z;
    return Sok;
}
void Ymnozh(Drob A, Drob B, Drob &C) //другие арифметич.операции аналогичны
{
    C.Chisl = double(A.Chisl) * double(B.Chisl);
    C.Znam = double(A.Znam) * double(B.Znam);
    Sokr(C);
}
Drob Perevod(Drob &D, double R, int pogr)
{
    D.Chisl = pogr * R;
    D.Znam = pogr;
    Sokr(D);
    return D;
}
 
double ObrPerevod(Drob &D)
{
    double l;
    l = double (D.Chisl) / double (D.Znam); // делим используя явн. преобразов.
    return l;
};
double derivative(int N, Drob **mass) //функция для вычисления определителя
{
    double det=1; int perestanovki=0;
    Perevod(der,det,pogr);
 
for(int i=0; i < N-1; ++i) // перебираем все строки кроме последней
{                                           
    maxN = i;
    maxEl.Chisl = abs (mass[i][i].Chisl);
    maxEl.Znam = abs (mass[i][i].Znam);
    for(int j=i+1; j < N; ++j)  //цикл на выбор макс.элемента (из всех строчек)
    {
        element.Chisl = abs (mass[j][i].Chisl); //дробь element = mass[j][i]
        element.Znam = abs (mass[j][i].Znam);
            Razn(element,maxEl,element);//проверяем какая дробь больше: element или maxEl
 
            if ( element.Chisl > 0)
            { 
                maxN = j; 
                maxEl = element;
            } 
    }
                if( maxN > i ) // если макс. элемент не в i ой строке то
                {                                       //нужен обмен строк
                    for (int k = i; k < N; k++)    //цикл перестановки i-ой строки со строкой с макс элементом
                    {
                        Drob t = mass[i][k];
                        mass[i][k] = mass[maxN][k];
                        mass[maxN][k] = t;
                    }
                    ++perestanovki; //поменяли
                } 
                else 
                { //если обмен не нужен, нужна проверка на ноль
                    if( maxEl.Chisl == 0 ) return 0;
                }
                Ymnozh(der,mass[i][i],der); // потихоньку начинаем считать определитель
    
              for(int j=i+1; j < N; ++j)    //теперь нужно вычитать строку i из всех последующих 
    {
        Delenie(mass[j][i],mass[i][i],z);   // ji / ii = z
            for (int c=i; c < N; ++c)
            {
                Ymnozh(mass[i][c],z,ic); 
                Razn(mass[j][c],ic,mass[j][c]);
            }
    }
}
Ymnozh(der,mass[N-1][N-1],der);
det=ObrPerevod(der);
if (perestanovki %2 ) return -det; // определяемся со знаком определителя
else return det;
}
int main()..
Сердечное спасибо откликнувшимся!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2013, 23:10     Определитель матрицы используя рац.дроби (Гаусс)
Посмотрите здесь:

Определитель Матрицы C++
Определитель матрицы C++
C++ определитель матрицы
C++ Определитель матрицы
определитель матрицы 5*5 C++
C++ Матрицы: найти определитель заданной матрицы n-го порядка методом Гаусса (и ещё 6 задач)
C++ Определитель матрицы
C++ Определитель матрицы, ранг матрицы, обратная матрица

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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