Advertisement
jacknpoe

Resolve conjunto de inequações (2) (matriz)

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