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