class Complejo { // ====================================================================== // Objetivo: Permitir el uso y las operaciones entre nUmeros complejos // Autor: J. Rafael R. Ochoa // Fecha: Nov-7-2003, Dic-17-2003 // Derechos: SID - FIE - UMSNH // ====================================================================== // DeclaraciOn de los elementos miembro double Real, Imag; // Se recibe un nUmero complejo en formato rectangular o polar en una cadena // Ej. // 45.98+j13.23 caso rectangular // 13.15 [60] caso polar // // Observaciones: // No importa si se deja espacio o no entre ambas partes del nUmero y el operador // El Angulo estA en grados si se trata en formato polar // Se supone que ambas partes del nUmero complejo son introducidos correctamente -por lo pronto- // 23 ==> parte vAlida -solo parte entera- // 75.23 ==> parte vAlida -solo un punto decimal- // 74.2.3 ==> parte invAlida -2 puntos decimales- // --------------------------------------------------------------------------------------------------- // METODOS RECONOCIDOS: // =================================================================================================== // =================================================================================================== // void Imprime() ==> Imprime // Complejo Suma(Complejo N1, Complejo N2) ==> Suma // Complejo Resta(Complejo N1, Complejo N2) ==> Resta // Complejo Potencia(Complejo num, int pot) ==> Potencia de un nUmero // Complejo Producto(Complejo Num_1, Complejo Num_2) ==> Producto // Complejo Division(Complejo Numerador, Complejo Denominador) ==> DivisiOn // Complejo Conjugado(Complejo Num) ==> Conjugado // Complejo Negativo(Complejo Num) ==> Cambio de signo // Complejo Reciproco(Complejo Num) ==> Reciproco // --------------------------------------------------------------------------------------------------- //_________________________________________________ // C O N S T R U C T O R E S //------------------------------------------------- Complejo() { this("0+j0"); } Complejo(String CADENA) { // Se verifica si estA en forma rectangular if (CADENA.toUpperCase().indexOf('J') >= 0) Recibe_Rectangular(CADENA.toUpperCase()); // o en polar if (CADENA.indexOf('[') > 0) Recibe_Polar(CADENA); if (CADENA.toUpperCase().indexOf('J') < 0 && (CADENA.indexOf('[') < 0)) // solo parte real = rectangular Recibe_RECT(CADENA); } //_________________________________________ // A L M A C E N A M I E N T O //----------------------------------------- // SOlo se recibiO la parte real void Recibe_RECT(String CAD) { Real = Double.parseDouble(CAD); Imag = 0; } // La cadena recibida estA en rectangular y se separa en sus partes void Recibe_Rectangular(String CAD) { int PosicionDeJ = CAD.toUpperCase().indexOf('J'); // Existe solo parte imaginaria y sin signo. -(+)- if (CAD.toUpperCase().indexOf('J') == 0) { Real = 0; Imag = Double.parseDouble(CAD.substring(1, CAD.length())); } // Existe solo parte imaginaria y con signo. (+ -) if (CAD.toUpperCase().indexOf('J') == 1) { Real = 0; Imag = Double.parseDouble(CAD.substring(2, CAD.length())); if (CAD.indexOf('-') == 0) Imag *= -1; } // Existen ambas partes (Real e Imaginario) if (CAD.toUpperCase().indexOf('J') > 1) { Real = Double.parseDouble(CAD.substring(0, PosicionDeJ-1)); Imag = Double.parseDouble(CAD.substring(PosicionDeJ+1, CAD.length())); if (CAD.lastIndexOf('-') > 0) Imag *= -1; } } // La cadena recibida estA en polar y se separa en sus partes void Recibe_Polar(String CAD) { int Pos_O = CAD.indexOf('['); int Pos_C = CAD.indexOf(']'); double Mag = Double.parseDouble(CAD.substring(0, Pos_O)); double Ang = Double.parseDouble(CAD.substring(Pos_O+1, Pos_C)); Real = Mag*Math.cos(Math.toRadians(Ang)); Imag = Mag*Math.sin(Math.toRadians(Ang)); } //________________________________________________________________________________________ // H E R R A M I E N T A S //---------------------------------------------------------------------------------------- // Crea un Complejo nuevo como cadena /* String CreaComplejo(double Real, double Imag) { return (Imag < 0) ? Real + "-J" + Math.abs(Imag) : Real + "+J" + Math.abs(Imag); }*/ String CreaComplejo(double Real, double Imag) { return (Imag < 0) ? CC_NEG(Real, Imag) : CC_POS(Real, Imag); } String CC_NEG(double Real, double Imag) { return (Imag != 0) ? Real + "-J" + Math.abs(Imag) : Real + ""; } String CC_POS(double Real, double Imag) { return (Imag != 0) ? Real + "+J" + Math.abs(Imag) : Real + ""; } Complejo Negativo(Complejo Num) { return new Complejo(CreaComplejo(Num.Real * -1, Num.Imag * -1)); } // Cambio de signo Complejo Conjugado(Complejo Num) { return new Complejo(CreaComplejo(Num.Real, Imag * -1)); } // Conjugado Complejo Reciproco(Complejo Num) { return Division(new Complejo("1"), Num); } // Reciproco void Imprime() { System.out.println(CreaComplejo(Real, Imag)); } // Imprime //COMPLEJO += Math.sqrt(Real*Real + Imag*Imag) + " [" + Math.toDegrees(Math.atan(Imag/Real)) + " ]"; Complejo Suma(Complejo N1, Complejo N2) { return new Complejo(CreaComplejo(N1.Real + N2.Real, N1.Imag + N2.Imag)); } // Suma Complejo Resta(Complejo N1, Complejo N2) { return new Complejo(CreaComplejo(N1.Real - N2.Real, N1.Imag - N2.Imag)); } // Resta Complejo Producto(Complejo N1, Complejo N2) { // Producto return new Complejo(CreaComplejo(N1.Real * N2.Real + N1.Imag * N2.Imag*-1, N1.Imag * N2.Real + N2.Imag * N1.Real)); } // Potencia Complejo Potencia(Complejo Num, int Orden) { if (Orden == 0) return new Complejo("1"); return Producto(Num, Potencia(Num, --Orden)); } // Division Complejo Division(Complejo Numerador, Complejo Denominador) { Complejo Num = Producto(Numerador, Conjugado(Denominador)); double Divisor = Denominador.Real * Denominador.Real + Denominador.Imag * Denominador.Imag*-1; return new Complejo(CreaComplejo(Num.Real/Divisor, Num.Imag/Divisor)); } }