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

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

Войти
Регистрация
Восстановить пароль
 
AlexStud
Сообщений: n/a
#1

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

31.05.2013, 23:10. Просмотров 641. Ответов 0
Метки нет (Все метки)

Здравствуйте уважаемые форумчане! Я-студент,новичок в программировании.
В своей программе-курсовике по подсчету определителя 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++
доброе время суток Напишите у кого есть код нахождения определителя матрицы мне надо 4х4 ну а nxn, соответственно тоже подойдёт !!!! ...

Определитель матрицы - C++
Всем добрый вечер=) Написал программу для вычисления определителя матрицы. Она запускается но функция не считает его, поправьте если что...

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

Найти определитель матрицы - C++
дана матрица второго порядка (a_b; c_d)найти определитель матрицы!

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 23:10
Привет! Вот еще темы с ответами:

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

Найти определитель матрицы - C++
Написать прогу на с++ : нахождение определителя матрицы методом квадратного корня. Кто сможет помогите пожалуйста((

Определитель трехмерной матрицы - C++
Как найти определитель трехмерной матрицы на C++

Найти определитель матрицы - C++
помогите пожалуйста написать программу на Visual С++. чего только не пробовала, не получается:(


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

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

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