Advertisement
jacknpoe

Resolve conjunto de equações (matriz)

Oct 8th, 2013
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.47 KB | None | 0 0
  1. /*
  2.  
  3. Resolve conjunto de equações (matriz)
  4.  
  5. Para entender, entre com os seguintes dados:
  6.  
  7. Exemplo 1:
  8. 2 (quantidade de variáveis)
  9. 1, 1, 2, 1, 3, 1  (primeira linha, equivale a  x + 2y = 3
  10. 4, 1, 5, 1, 9, 1   (segunda linha, equivale a 4x + 5y = 9
  11. Os resultados serão x=1 e y=1
  12.  
  13. Exemplo 2:
  14. 3 (quantidade de variáveis)
  15. 1, 1, 2, 1, 3, 1, 14, 1  (primeira linha, equivale a  x + 2y + 3z = 14
  16. 4, 1, 5, 1, 9, 1, 41, 1   (segunda linha, equivale a 4x + 5y + 9z = 41
  17. 4, 1, 1, 1, 2, 1, 12, 1  (terceira linha, equivale a 4x +  y + 2z = 12
  18. Os resultados serão x=1, y=2 e z=3
  19.  
  20. Exemplo 3:
  21. 3 (quantidade de variáveis)
  22. 1, 1, 2, 1, 3, 1, 14, 1  (primeira linha, equivale a    x + 2y + 3z = 14
  23. 4, 1, 5, 1, 9, 1, 41, 1   (segunda linha, equivale a   4x + 5y + 9z = 41
  24. 1, 4,-1, 1, 2, 1, 17, 4  (terceira linha, equivale a 1/4x -  y + 2z = 17/4 (4 1/4)
  25. Os resultados serão x=1, y=2 e z=3
  26.  
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <iostream>
  32. #include <locale.h>
  33. #include <string.h>
  34.  
  35. #define MAXEXTENSO 100
  36.  
  37. using namespace std;
  38.  
  39. class TFracao {
  40.     long Divisor, Dividendo;
  41.     string Extenso;
  42. public:
  43.     TFracao( void);
  44.     TFracao( long num);
  45.     TFracao( long mul, long div);
  46.     void copie( TFracao Fracao);
  47.     void multiplique( long mul);
  48.     void divida( long div);
  49.     void some( long num);
  50.     void diminua( long num);
  51.     void copie( long num);
  52.     void multiplique( TFracao Fracao);
  53.     void divida( TFracao Fracao);
  54.     void some( TFracao Fracao);
  55.     void diminua( TFracao Fracao);
  56.     void normalize( void);
  57.     long double valor( void);
  58.     long divisor( void);
  59.     long dividendo( void);
  60.     string extenso( void);
  61. };
  62.  
  63.  
  64. class TMatriz {
  65.     TFracao *Matriz, *Resultado;
  66.     long Tamanho; bool Prolixo;
  67. public:
  68.     TMatriz( long tam, bool pro);
  69.     TMatriz( long tam);
  70.     TMatriz( bool pro);
  71.     TMatriz( void);
  72.     ~TMatriz( void);
  73.     TFracao *matriz( long lin, long col);
  74.     TFracao *resultado( long col);
  75.     long tamanho( void);
  76.     bool resolva( void);
  77.     bool trocaiterativa( long lin);
  78.     void calcula( long lin1, long lin2);   
  79. };
  80.  
  81. // * Implementação das Classes
  82.  
  83. // Classe TFracao
  84.  
  85. TFracao::TFracao( void) {
  86.     Dividendo = 1;
  87.     Divisor = 1;
  88. }
  89.  
  90. TFracao::TFracao( long num) {
  91.     Dividendo = num;
  92.     Divisor = 1;
  93. }
  94.  
  95. TFracao::TFracao( long mul, long div) {
  96.     Dividendo = mul;
  97.     Divisor = div;
  98.     normalize();
  99. }
  100.  
  101. void TFracao::copie( TFracao Fracao) {
  102.     Dividendo = Fracao.Dividendo;
  103.     Divisor = Fracao.Divisor;
  104.     normalize();
  105. }
  106.  
  107. void TFracao::multiplique( long mul) {
  108.     Dividendo *= mul;
  109.     normalize();
  110. }
  111.  
  112. void TFracao::divida( long div) {
  113.     Divisor *= div;
  114.     normalize();
  115. }
  116.  
  117. void TFracao::some( long num) {
  118.     normalize();
  119.     Dividendo += num * Divisor;
  120.     normalize();
  121. }
  122.  
  123. void TFracao::diminua( long num) {
  124.     normalize();
  125.     Dividendo -= num * Divisor;
  126.     normalize();
  127. }
  128.  
  129. void TFracao::copie( long num) {
  130.     Dividendo = num;
  131.     Divisor = 1;
  132. }
  133.  
  134. void TFracao::multiplique( TFracao Fracao) {
  135.     Dividendo *= Fracao.Dividendo;
  136.     Divisor *= Fracao.Divisor;
  137.     normalize();
  138. }
  139.  
  140. void TFracao::divida( TFracao Fracao) {
  141.     Dividendo *= Fracao.Divisor;
  142.     Divisor *= Fracao.Dividendo;
  143.     normalize();
  144. }
  145.  
  146. void TFracao::some( TFracao Fracao) {
  147.     Fracao.normalize();
  148.     normalize();
  149.     Dividendo = Dividendo * Fracao.Divisor + Fracao.Dividendo * Divisor;
  150.     Divisor *= Fracao.Divisor;
  151.     normalize();
  152. }
  153.  
  154. void TFracao::diminua( TFracao Fracao) {
  155.     Fracao.normalize();
  156.     normalize();
  157.     Dividendo = Dividendo * Fracao.Divisor - Fracao.Dividendo * Divisor;
  158.     Divisor *= Fracao.Divisor;
  159.     normalize();
  160. }
  161.  
  162. void TFracao::normalize( void) {
  163.     long menor; char sinal;
  164.  
  165.     if( Divisor < 0) { Divisor *= -1; Dividendo *= -1; }
  166.     if( Dividendo < 0) { Dividendo *= -1; sinal = -1; } else sinal = 1;
  167.     menor = ( Divisor < Dividendo) ? Divisor : Dividendo;
  168.  
  169.     for( int cont = 2; cont <= menor; cont++)   {
  170.         if( ( ( Divisor % cont) == 0) && ( ( Dividendo % cont) == 0) )      {
  171.             Divisor /= cont;
  172.             Dividendo /= cont;
  173.             menor /= cont;
  174.             cont--;
  175.         }
  176.     }
  177.  
  178.     Dividendo *= sinal;
  179. }
  180.  
  181. long double TFracao::valor( void) { return( ((long double) Dividendo) / ((long double) Divisor) ); }
  182.  
  183. long TFracao::divisor( void) { return( Divisor); }
  184.  
  185. long TFracao::dividendo( void) { return( Dividendo); }
  186.  
  187. string TFracao::extenso( void) {
  188.     char chartemp[ MAXEXTENSO];
  189.     if( Dividendo)
  190.     {
  191.         if( Divisor == 1)
  192.             sprintf( chartemp, "%d", Dividendo);
  193.         else
  194.             if( Divisor > Dividendo)
  195.                 sprintf( chartemp, "%d/%d", Dividendo, Divisor);
  196.             else
  197.                 sprintf( chartemp, "%d %d/%d", Dividendo / Divisor, Dividendo % Divisor, Divisor);
  198.         Extenso = chartemp;
  199.     } else Extenso = "0";
  200.     return Extenso;
  201. }
  202.  
  203.  
  204. // Classe TMatriz
  205.  
  206. TMatriz::TMatriz( long tam, bool pro) {
  207.     Prolixo = pro;
  208.     Tamanho = tam;
  209.     Matriz = new TFracao[ tam * tam + tam];
  210.     Resultado = new TFracao[ tam + 1];
  211. }
  212.  
  213. TMatriz::TMatriz( long tam){ TMatriz( tam, false); }
  214.  
  215. TMatriz::TMatriz( bool pro){ TMatriz( 2, pro); }
  216.  
  217. TMatriz::TMatriz( void){ TMatriz( 2, false); }
  218.  
  219. TMatriz::~TMatriz( void)
  220. {
  221.     delete Matriz;
  222.     delete Resultado;
  223. }
  224.  
  225. TFracao *TMatriz::matriz( long lin, long col) { return( &Matriz[ (lin-1) + (col-1) * Tamanho] ); }
  226.  
  227. TFracao *TMatriz::resultado( long col) { return( &Resultado[ col-1] ); }
  228.  
  229. long TMatriz::tamanho( void) { return( Tamanho); }
  230.  
  231. bool TMatriz::resolva( void) {
  232.     long divisor, dividendo;
  233.     TFracao acumulador, temporario;
  234.  
  235.     for( long itera = 1; itera < Tamanho; itera++) {        // zerar abaixo da diagonal principal
  236.         if( (*matriz( itera, itera)).dividendo() == 0)
  237.             if( ! trocaiterativa( itera)) return false;
  238.  
  239.         for( long linha = itera + 1; linha <= Tamanho; linha++)
  240.             if( (*matriz( linha, itera)).dividendo() != 0)
  241.                 calcula( linha, itera);
  242.     }
  243.  
  244.     for( long linha = 1; linha <= Tamanho; linha++) {       // tornar a diagonal principal {1,...,1}
  245.         temporario.copie( (*matriz( linha, linha)) );
  246.         for( long coluna = linha; coluna <= (Tamanho+1); coluna++)
  247.             (*matriz( linha, coluna)).divida( temporario);
  248.     }
  249.  
  250.     (*resultado( Tamanho+1)).copie( -1);                        // encontrar os resultados
  251.     for( long linha = Tamanho; linha > 0; linha--) {
  252.         acumulador.copie( 0);
  253.         for( long coluna = linha + 1; coluna <= Tamanho + 1; coluna++)      {
  254.             temporario.copie( (*resultado( coluna)));
  255.             temporario.multiplique( (*matriz( linha, coluna)));
  256.             acumulador.diminua( temporario);
  257.         }
  258.         (*resultado( linha)).copie( acumulador);
  259.     }
  260.     return true;
  261. }
  262.  
  263. bool TMatriz::trocaiterativa( long lin) {
  264.     TFracao temp;
  265.  
  266.     for( long cont = lin+1; cont <= Tamanho; cont++)
  267.         if( (*matriz( cont, lin)).dividendo() != 0) {
  268.             if( Prolixo) cout << "Trocada iterativamente linha " << lin << " com linha " << cont << "...\n";
  269.             for( long coluna = lin; coluna <= (Tamanho+1); coluna++) {
  270.                 temp.copie( (*matriz( lin, coluna)));
  271.                 (*matriz( lin, coluna)).copie( (*matriz( cont, coluna)));
  272.                 (*matriz( cont, coluna)).copie( temp);
  273.             }
  274.             return true;
  275.         }
  276.     return false;
  277. }
  278.  
  279. void TMatriz::calcula( long lin1, long lin2) {
  280.     TFracao mul1;
  281.  
  282.     if( Prolixo) cout << "Calculada linha " << lin1 << " - linha " << lin2 << "...\n";
  283.  
  284.     mul1.copie( (*matriz( lin2, lin2)));
  285.     mul1.divida( (*matriz( lin1, lin2)));
  286.  
  287.     for( long coluna = lin2; coluna <= (Tamanho+1); coluna++) {
  288.         (*matriz( lin1, coluna)).multiplique( mul1);
  289.         (*matriz( lin1, coluna)).diminua( (*matriz( lin2, coluna)));
  290.     }
  291. }
  292.  
  293. // Corpo do Programa
  294.  
  295. int main( void)
  296. {
  297.     TMatriz *matriz;
  298.     TFracao temporario;
  299.     long temp1, temp2, tam;
  300.     long lin, col;
  301.  
  302.     setlocale( LC_ALL, "");     // equal caracters in prompt
  303.  
  304.     cout <<  "\n\nDigite o número de linhas (variáveis): ";
  305.     cin >> tam;
  306.     if( tam < 2) {
  307.         cout << "\nVocê precisa digitar um número maior ou igual a 2!\n\n";
  308.         return 1;
  309.     }
  310.  
  311.     matriz = new TMatriz( tam, true);
  312.  
  313.     cout << "\n\n\n";
  314.     for( lin = 1; lin <= tam; lin++)    {
  315.         cout << "\nLINHA " << lin << ":\n";
  316.         for( col = 1; col <= (tam+1); col++) {
  317.             cout << "\nDividendo da Coluna " << col << ": ";
  318.             cin >> temp1;
  319.             cout << "Divisor da Coluna " << col << ": ";
  320.             cin >> temp2;
  321.             (*(*matriz).matriz( lin, col)).multiplique( temp1);
  322.             (*(*matriz).matriz( lin, col)).divida( temp2);
  323.         }
  324.     }
  325.  
  326.     cout << "\n\n\n";
  327.  
  328.     if( ! ( (*matriz).resolva() )) {
  329.         cout << "\n\n\nNão foi possível encontrar um valor não nulo para a diagonal principal!\n\n";
  330.         return 2;
  331.     }
  332.  
  333.  
  334.     cout << "\nMATRIZ RESULTADO:\n\n";
  335.     for( lin = 1; lin <= tam; lin++)
  336.     {
  337.         for( col = 1; col <= (tam+1); col++)
  338.             cout << (*(*matriz).matriz( lin, col)).extenso() << "\t";
  339.         cout << "\n";
  340.     }
  341.  
  342.     cout << "\n\n\n";
  343.     cout << "\nRESULTADOS:\n\n";
  344.     for( lin = 1; lin <= tam; lin++)
  345.         cout <<  (*(*matriz).resultado( lin)).extenso() << "\t";
  346.  
  347.     cout << "\n";
  348.  
  349.     return 0;
  350. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement