Показать сообщение отдельно

  #8  
Старый 07.11.2007, 17:17
Ky3bMu4
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме:
1777536

Репутация: 932


По умолчанию

Большое спасибо за критику. Учёл.
Улучшил Гаусса, добавил обработку нулевых элементов на главной диагонале.

Вот, ещё написал метод Крамера с рекурсивным вычислением определителя.
Код:
#include <tchar.h>
#include <iostream>

using namespace std;

/*функция возведения в определённую степень числа -1*/
int mypow(int x){ 
	int y=1;
	for(int z=1;z<=x;z++){
  y*=-1;
	}
	return y;
}

/*класс матрица*/
class matrix{
public:

/*Конструктор: все элементы 0, размерность 0 */
 matrix(){
  size=0;
  
  for(int x=0;x<=100;x++)
  	for(int y=0;y<=100;y++)
    m[x][y];
 }
/*Рекурсивная функция вычисления определителя */
 int GetDet(){
	int result=0;
  if(size==1){ //Если у матрицы размерность 2(математическая, С`шная 1), то вычисляем определитель
return m[0][0]*m[1][1]-m[0][1]*m[1][0];
  }
  else{
/*Вычисляем определитель путём вычёркивания строк и столбцов. Берём элементы из первой строки. */   
   for(int x=0;x<=size;x++){
result+= mypow(x+2)*m[0][x]*(GetNew(x)).GetDet(); //рекурсия...
   }
  return result;
  }
	}

 /*Функия получения новой матрицы из старой, путём вычёркивания первой(нулевой) строки и х`овой колонки*/
 matrix GetNew(int st){
  matrix result;
  int z=0;
  result.size=size-1;

  for(int x=1;x<=size;x++){
   for(int y=0;y<=size;y++){
  if(y!=st){
   result.m[x-1][z]=m[x][y];
   z++;
  }
  
   }
   z=0;
  }
  return result;
 }

/*Функция вывода на экран квадратной матрицы*/
  void echo(void){
   for(int x=0;x<=size;x++){
    for(int y=0; y<=size;y++){
     cout<<m[x][y]<<" ";
    }
    cout<<"\r\n";
   }
  }
/*Функция вывода на экран матрицы-столбца */
  void echoEx(void){
    for(int x=0;x<=size;x++){
     cout<<m[x][0]<<"\r\n";
    }
   }

/*Функция установки размерности матрицы*/
   inline void SetSize(int r){
    size=r;
   }

/*Функция установки значения элемента*/
   inline void SetValue(int value, int x , int y){
    m[x][y]=value;
   }

   /*Функция замены колонки на матриуц-столбец*/
   inline void SetColumn(int column , matrix source){    
    for(int x=0;x<=size;x++){
     m[x][column]=source.m[x][0];
    }
   }
 
private:
	int m[100][100]; //сама матрица
	int size; //размерность
	
};
int _tmain(int argc, _TCHAR* argv[])
{
matrix first,second,temp; //наши матрицы
int element,size,maindet; //необходимые переменные
bool c=1; //для цикла
cout<<"The Kramer method for the system of linear equations. By Ky3bMu4 (c) 2007.\r\n\r\n";
while(c){
cout<<"\r\nInsert size of matrix:"; 
/*тут небольшая неровность: в математике матрица начинается с 1 столбцы, а в С - с 0-го   */
cin>>size;
first.SetSize(size);
second.SetSize(size);


/* вводим основную матрицу */
for(int x =0; x<=size; x++){
	for( int y=0; y<=size;y++){
  cout<<"\r\nInsert ["<<x<<";"<<y<<"] element of first matrix:";
  cin>>element;
  first.SetValue(element,x,y);
  }
}

/* вводим матрицу-столбец с числами*/
for(int x=0; x<=size; x++){
	cout<<"\r\nInsert "<<x<<" element of second matrix:";
	cin>>element;
	second.SetValue(element,x,0);
}
maindet = first.GetDet(); //вычисляем основной определитель(на него будем делить)
if(maindet!=0){
for(int x=0;x<=size;x++){ //кол-во элементов(переменных в линейном уравнении) == размерности главной матрицы.
//Заменяем колонку, вычисляем определитель , делим на главный определитель, пробуем сократить и выводим 
temp = first;
temp.SetColumn(x,second); //заменянем колонку
cout<<"\r\nElement "<<x<<" = "<<temp.GetDet()<<"/"<<maindet; // выводим на экран	
}
}else{ //облом, главный определитель == 0, Крамер не прокатит :(((
	cout<<"\r\nSorry, but the main determinat of first matrix is 0.Stop.";
}

// The End
cout<<"\r\n\r\nFinish!";
cout<<"\r\nDo you want to again calculate new matrix(1/0)?:";
cin>>c;
}

	return 0;
}

Ссылка на откомпиленную прогу в первом посте.
 
Ответить с цитированием