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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ И последняя задачка, где нужно реализовать 3 класса. Надеюсь, что Вы справитесь:) http://www.cyberforum.ru/cpp-beginners/thread886852.html
В 1 текстовом файле у нас первая задачка на эллипс. Во 2 файле у нас одна задачка на параболу, другая - на гиперболу. Прошу помощи)
C++ Надеюсь Вам не сложно будет выполнить эту задачку Условие программы на картинке http://www.cyberforum.ru/cpp-beginners/thread886844.html
C++ Выполнить статистику текста: подсчитать количество букв, знаков препинания, слов, предложений, абзацев.
1. Дан текстовый файл. Выполнить статистику текста: подсчитать количество букв, знаков препинания, слов, предложений, абзацев. Реализовать желательно не очень сложно и мудрёно:) Где написано:"дан...
Сортировка массива по модулю C++
Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом — все остальные. Код находит сумму элементов массива, расположенных между первым...
C++ Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С http://www.cyberforum.ru/cpp-beginners/thread886822.html
Массив С действительных чисел имеет 5 строк и 11 столбцов. Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца -...
C++ не могу запустить программу Ребята помогите!!!! никак не могу запустить программу все время ругaется на "global.h" #include <stdio.h> #include <conio.h> #include <iostream> #include "locale.h"// для использования русской... подробнее

Показать сообщение отдельно
AlexStud
Сообщений: n/a

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

31.05.2013, 23:10. Просмотров 644. Ответов 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()..
Сердечное спасибо откликнувшимся!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru