domingo, 9 de septiembre de 2012

Libreria matbas.h

LibreriaMatBas.htm Librerias Externas :
Basico.h
Cadena.h
-->
#ifndef MATBAS
#define MATBAS

#include <iostream>
#include <math.h>
#include <cstring>
#include "Cadena.h"
#include "basico.h"

using namespace std;

//constantes Matemáticas
const double pi=3.141592653589;
const double e=2.718281828459;
const double fi=1.618033988749

double CalcParteDecimalPura(double, int &);
double CalcParteDecimal(double);
double MaximoComunDivisor(double a, double b);
int NumeroDigitos(double num);
bool EsPeriodica(double, long int &);

double CalcParteEntera(double num){
       
       return static_cast<int>(num);       
       }

double CalcParteDecimal(double num){
       
       if(num<0)
              num*=-1;
              
       if(num==CalcParteEntera(num))
       return 0;
       else       
       return (num-CalcParteEntera(num));
       }

bool EsDecimal(double num){
     
     if(num<0)
              num*=-1;
     return num!=CalcParteEntera(num);
     }
       
double CalcParteDecimalPura(double num, int &numdigdec){
    
    double DigitosDecimales=num;
    double j=10;//permite recorrer la parte decimal por sus digitos
    numdigdec=0;
    
if(!EsDecimal(num)) return 0;

while(CalcParteDecimal(static_cast<float>(DigitosDecimales))>0){
    DigitosDecimales=CalcParteDecimal(num)*j;
    j*=10;
    numdigdec++;
    } 
return DigitosDecimales;
}

int RestoF(double Dividendo, double Divisor){
      
      int Cociente=static_cast<int>(CalcParteEntera(Dividendo/Divisor));
      return Dividendo-Divisor*Cociente;     
      }
      
double MaximoComunDivisor(double a, double b){
       
       if(a < b) 
            return MaximoComunDivisor(b,a);
       if(b == 0) 
            return a;
            
        return MaximoComunDivisor(b, static_cast<int>(a) %static_cast<int>(b));
           
       }

int NumeroDigitos(double num){
    
    int numdigitos=0;
    int cociente=CalcParteEntera(num);
    
    while(cociente){
               
               cociente=cociente/10;
               numdigitos++;
               }
               
    return numdigitos;
    }

bool EsPeriodica(double num, long int &periodo){
     
     bool TienePeriodo=true;
     
     int numdig=NumeroDigitos(num);
     
     int digitodecimal, cociente, 
     resto,i;
     
     if(numdig<2&&!(numdig%2==0)) 
              return false;

for(i=1; i<=numdig/2; i++ )
{
     cociente=CalcParteEntera(num);
     digitodecimal=RestoF(num,pow(10,i));
     int j=0;
     
     while( cociente )
     {
                 resto=RestoF(cociente,pow(10,i));
                 cociente=cociente/(pow(10,i));
                 if(digitodecimal==resto){
                                          j++;
                                          }
                 if(digitodecimal!=resto && i==(numdig/2))
                     return false;
                 
                 if(j>1){
                         
                         if(EsPeriodica(digitodecimal, periodo))
                              periodo=digitodecimal/pow(10,NumeroDigitos(digitodecimal)-1);
                         else
                         periodo=digitodecimal;
                         }
                        
                        
                 digitodecimal=resto;
                 
                 }                

                 }
                 
return TienePeriodo;
}

//operaciones basicas
double Resto(float, float);

double Resto(double Dividendo, double Divisor){
      
      int Cociente=static_cast<int>(CalcParteEntera(Dividendo/Divisor));
      return Dividendo-Divisor*Cociente;     
      }

class NumeroPura{
      
      void CalcNumDiv();
      
      public:
             NumeroPura(double num);
             void CambiarValor(double);
             bool EsPrimo();
             
      protected: 
          int numdiv, ParteEntera, NumDigitosDecimales;
          double numero, ParteDecimal, DigitosDecimales, ParteDecimalPura;                
      };

NumeroPura::NumeroPura(double num){
                          
                   numero=(num);
                   if(num<0)
                            num*=-1;
                   ParteEntera=CalcParteEntera(num);
                   ParteDecimal=CalcParteDecimal(num);
                   ParteDecimalPura=CalcParteDecimalPura(num,NumDigitosDecimales);                   
                   numdiv=0;
                   CalcNumDiv();
}                   
void NumeroPura::CambiarValor(double num){
     
                   numero=(num);
                   if(num<0)
                            num*=-1;
                   ParteEntera=CalcParteEntera(num);
                   ParteDecimal=CalcParteDecimal(num);
                   ParteDecimalPura=CalcParteDecimalPura(num,NumDigitosDecimales);
                   numdiv=0;
                   CalcNumDiv();
     }

void NumeroPura::CalcNumDiv(){
     
     numdiv=0;
     
     int i;
     for(i=1;i<=ParteEntera;i++){
               if(ParteEntera%i==0)
               numdiv++;
               }
     }    
bool NumeroPura::EsPrimo(){
     
     return (numdiv==2);               
     }

class Divisores:
      public NumeroPura
      {      
          int *Div;
          void CalcularDivisores();

      public:
      
      Divisores(double num): NumeroPura(num){
                       };
      ~Divisores(){
                     delete Div;
                     delete[] Div;
                     }
      int NumDiv();
      void VerDivisores();
      int ndivisor(int);      
      };

int Divisores::NumDiv(){

    return numdiv;                                  
    }

void Divisores::CalcularDivisores(){
     
     int i;
     int ind=0;
     Div=new int[numdiv];
     
     for(i=1;i<=ParteEntera;i++){
               if(ParteEntera%i==0){
               Div[ind]=i;
               ind++;
               }               }     }

void Divisores::VerDivisores(){
     
     CalcularDivisores();                           
     cout << ParteEntera << ":" <<"{";
     
     int i;
     for(i=0;i<numdiv;i++){           
     cout <<Div[i];
     
     if(i>=0&&i<numdiv-1)
     cout <<",";
     
     }
     cout <<"}"<<endl;
     }

int Divisores::ndivisor(int ind){
     
     CalcularDivisores();                           
     if(ind<0 || ind>numdiv-1)
         return 0;
     else
         return Div[ind];     
     }

class FactoresPrimos:
      public Divisores
      {    
          int *FactPrim, numfactores;

          void CalcNumFact();
          void CalcFactores();
          
      public:
             
          FactoresPrimos(double num): Divisores(num){
                                     CalcNumFact();
                                     CalcFactores();
                                }
          ~FactoresPrimos(){
                         delete FactPrim;
                         delete[] FactPrim;
                         }
          int  NumFactores();
          void VerFactoresPrimos();
          int  nFactores(int);            
      };

int FactoresPrimos::NumFactores(){
    
    return numfactores;
    }
    
void FactoresPrimos::CalcNumFact(){
     
     int fact=2,num=ParteEntera;
     double Aux=numero;
     numfactores=0;
     int i=0;
     
while(num!=1){               
               CambiarValor(fact);

               if(EsPrimo())
                   if(num%fact==0){                                 
                       numfactores++;
                       num=num/fact;
                       fact=2;
                       continue;
                       }
               fact++;
     }    
CambiarValor(Aux);
}

void FactoresPrimos::CalcFactores()
{    
     int ind=0,fact=1, num=ParteEntera;
     double Aux=numero;
     
     FactPrim=new int[numfactores];
     
     while(num!=1){
               
               CambiarValor(fact);
               
               if(EsPrimo())     
                   if(num%fact==0){
                       FactPrim[ind]=fact;
                       num=num/fact;
                       fact=0;
                       ind++;
                       continue;}
               fact++;
               }     
CambiarValor(Aux);
     }

void FactoresPrimos::VerFactoresPrimos(){
     
     int i;
     cout <<ParteEntera <<":";
     
     CambiarValor(ParteEntera);
     if(!EsPrimo()){
         for(i=0;i<numfactores;i++){           
         cout <<FactPrim[i];
         
         if(i>=0&&i<numfactores-1)
         cout <<"*";
         
         }}
     else
     cout <<" Es un numero primo"<<endl;
}

int FactoresPrimos::nFactores(int ind){
     
     if(ind<0 || ind>numfactores-1)
              return 0;
     else
     return FactPrim[ind];     
     }

class Numero: 
      public FactoresPrimos
      {
      double Numerador, Denominador;
      long int periodo, anteperiodo;
      
      bool periodicomixta;
      void CalcularFraccion();
      void SimplificarFraccion();
      bool EsPeriodicapura();
      void CalcPeriodicoMixto();
      void CalcAntePeriodo();
      
      public:    
             Numero(double num):FactoresPrimos(num){
                           CalcularFraccion();
                           }
             ~Numero(){};       
                    
             double VerParteEntera();
             double VerParteDecimal();
             double VerNumerador();
             double VerDenominador();
             double valor();
             void CambiarValor(double num);
             
             Cadena Valor();                    
      };

void Numero::CalcularFraccion(){
           
           int tieneperiodico=0;
           
           CalcAntePeriodo();

           if(EsPeriodicapura())
                    tieneperiodico=1;
                    
           if(anteperiodo)      
           CalcPeriodicoMixto();
                
           else{               
           Numerador=numero*pow(10,NumDigitosDecimales);
           Denominador=pow(10,NumDigitosDecimales)-tieneperiodico;}
           
           SimplificarFraccion();
           }

void Numero::SimplificarFraccion(){
     
     int McD=MaximoComunDivisor(fabs(Numerador), fabs(Denominador));

     Numerador/=McD;
     Denominador/=McD;     
     }

bool Numero::EsPeriodicapura(){
            
            return EsPeriodica(ParteDecimalPura,periodo);
            }

void Numero::CalcAntePeriodo(){
     
periodo=0;
anteperiodo=0;

for(int i=NumDigitosDecimales-1; i>1; i-- ){
         
         
        
         periodo=RestoF(ParteDecimalPura,pow(10,i));
         anteperiodo=ParteDecimalPura/pow(10,i);         
                  if(EsPeriodica(periodo,periodo)) break;
         }
         }

void Numero::CalcPeriodicoMixto(){

         double PenterayAntePeri=(ParteEntera+anteperiodo/pow(10,
                  NumeroDigitos(anteperiodo)))*(pow(10,NumeroDigitos(anteperiodo)));
         double DigitosPuro= PenterayAntePeri*(pow(10,NumeroDigitos(periodo)))+periodo;
                  
         Numerador= DigitosPuro-PenterayAntePeri;
         Denominador=(pow(10,NumeroDigitos(periodo))-1)*(pow(10,NumeroDigitos(anteperiodo)));
         }               
double Numero::VerParteEntera(){
    
    return ParteEntera;
}
double Numero::VerParteDecimal(){    
       
    return ParteDecimal;
    }
double Numero::VerNumerador(){
       
       return Numerador;
       }       
double Numero::VerDenominador(){
       
       return Denominador;
       }
double Numero::valor(){
       return numero;
       }
                  
Cadena Numero::Valor(){       
              
       char valor[15];
       Cadena CValor(valor);
       
       if(!EsDecimal(numero)){
       sprintf(valor,"%.0lf",numero);
       }
       else
           {
            sprintf(valor,"%.0lf/%.0lf",Numerador,Denominador);
             }
       
       CValor=valor;
       
       return CValor;}

void Numero::CambiarValor(double num){
     
     NumeroPura::CambiarValor(num);
     CalcularFraccion();     
     }

class NumeroComplejo{
            
      public: 
              NumeroComplejo(double Pi, double Pr);
              ~NumeroComplejo(){}
              Cadena Valor();
                    
      protected:
                double ParteReal, ParteImaginaria;
      };

NumeroComplejo::NumeroComplejo(double pi, double pr=0.0){
                                      
                                      ParteReal=pr;
                                      ParteImaginaria=pi;
                                      }
Cadena NumeroComplejo::Valor(){       
       
       char valor[15];
       Numero NPr(ParteReal), NPi(ParteImaginaria);
       Cadena CValor(valor), CPr(NPr.Valor()), CPi(NPi.Valor());       
       
       if(ParteImaginaria>0)
           if(EsDecimal(ParteReal)&&EsDecimal(ParteReal))
                       sprintf(valor,"%s + %si",CPr.Lee(),CPi.Lee());
           else
               if(EsDecimal(ParteReal))
                       sprintf(valor,"%s + %.0lfi",CPr.Lee(),ParteImaginaria);
               else
                       sprintf(valor,"%.0lf + %si",ParteReal,CPi.Lee());
       else
          if(EsDecimal(ParteReal)&&EsDecimal(ParteReal))
                       sprintf(valor,"%s%si",CPr.Lee(),CPi.Lee());
           else
               if(EsDecimal(ParteReal))
                       sprintf(valor,"%s%.0lfi",CPr.Lee(),ParteImaginaria);
               else
                       sprintf(valor,"%.0lf%si",ParteReal,CPi.Lee());                                    
       CValor=valor;
       
       return CValor;
       
       }
class Radical
{      
       int Indice,Coeficiente, Radicando;
       
       public:
       Radical(int Rad, int Coef,int ind);
       ~Radical(){}
       void Simplificar();
       Cadena Mostrar();       
       };

Radical::Radical(int Rad, int Coef=1.0,int ind=2){
                   
                   Numero radicando(Rad);
                   Coeficiente=Coef;
                   Indice=2;
                   
                   if(radicando.EsPrimo())
                          Radicando=Rad;                   
                   else{
                          Radicando=Rad;
                          if(EsDecimal(sqrt(Radicando)))
                              Simplificar();
                          else{
                              Coeficiente*=sqrt(Radicando);
                              Radicando=0;
                              }}}
void Radical::Simplificar(){
     
     Numero radicando(Radicando);
     
     int factores[radicando.NumFactores()],i;

     for(i=0;i<radicando.NumFactores();i++)
                 factores[i]=radicando.nFactores(i);
     
     
     for(i=0;i<radicando.NumFactores();i++){
                      
                      int Exponente;
                      
                      if(i==0)
                              Exponente=Contador(factores,radicando.NumFactores(),factores[i]);
                      else
                          if(factores[i]!=factores[i-1])
                              Exponente=Contador(factores,radicando.NumFactores(),factores[i]);                      
                          else 
                              Exponente=0;    
                      
                      if(Exponente>Indice){
                                           int ExpCoef;
                                           
                                           ExpCoef=Exponente/Indice;
                                           Coeficiente*=pow(factores[i],ExpCoef);
                                           Radicando/=pow(factores[i],ExpCoef*Indice);
                                           }}}
Cadena Radical::Mostrar(){
     
     char valor[15];
     Cadena CValor(valor);
       
     if(!Radicando)                              
       sprintf(valor,"%d",Coeficiente);
       else
            if(Coeficiente==1)
                sprintf(valor,"--%d/**(%d)**",Indice,Radicando);
            else
                sprintf(valor,"%d--%d/**(%d)**",Coeficiente,Indice,Radicando);
       
       CValor=valor;
       
       return CValor;     
     }
#endif


Esta libreria fue Creada por José Elias Romero Guanipa( Agosto, 2012)

No hay comentarios:

Publicar un comentario