Números complejos

Esther Valdovinos Garrido

/*Programa para la realización de operaciones con los números complejos */

#include <math.h>
#include <iostream>
using namespace std;

/* Definición de tipos de datos */

typedef struct {
float r;
float i;
} fcomplex;

/* Declaración de funciones */

/* Función que genera un nº complejo a partir de las partes real e imaginaria */
fcomplex Complejo(float re,float im);

/* Función que realiza la suma de dos números complejos */
fcomplex Cadd(fcomplex a,fcomplex b);

/* Función que realiza la resta de dos números complejos */
fcomplex Csub(fcomplex a,fcomplex b);

/* Función que realiza la multiplicación de dos números complejos */
fcomplex Cmul(fcomplex a,fcomplex b);

/* Función que realiza la división de dos números complejos */
fcomplex Cdiv(fcomplex a,fcomplex b);

/* Función que calcula el conjugado de un nº complejo */
fcomplex Conjg(fcomplex z);

/* Función que calcula el valor absoluto de un nº complejo */
float Cabs(fcomplex z);

/* Función que calcula la raiz cuadrada de un nº complejo */
fcomplex Csqrt(fcomplex z);

/* Función que devuelve la parte real de un nº complejo */
float Re(fcomplex z);

/* Función que devuelve la parte imaginaria de un nº complejo */
float Im(fcomplex z);

/* Función que calcula el argumento de un nº complejo */
float Arg(fcomplex z);

int main()
{
fcomplex z1, z2;
float r1, im1, r2, im2;
char operacion, continuar;
cout << “Vamos a realizar operaciones con dos numeros complejos” << endl;
cout << “Escribe la parte real del primer numero complejo: ” << endl;
cin >> r1;
cout << “Escribe la parte imaginaria del primer numero complejo: ” << endl;
cin >> im1;
cout << “Escribe la parte real del segundo numero complejo: ” << endl;
cin >> r2;
cout << “Escribe la parte imaginaria del segundo numero complejo: ” << endl;
cin >> im2;
z1=Complejo(r1,im1);
z2=Complejo(r2,im2);

if ((Im(z1)<0)&&(Im(z2)<0)) cout << “Los numeros son: ” << Re(z1) << “-” << Im(z1) << “i, ” << Re(z2) << ” ” << Im(z2) << “i” << endl;
else if ((Im(z1)<0)&&(Im(z2)>=0)) cout << “Los numeros son: ” << Re(z1) << “-” << Im(z1) << “i, ” << Re(z2) << “+” << Im(z2) << “i” << endl;
else if ((Im(z1)>=0)&&(Im(z2)<0)) cout << “Los numeros son: ” << Re(z1) << “+” << Im(z1) << “i, ” << Re(z2) << “-” << Im(z2) << “i” << endl;
else if ((Im(z1)>=0)&&(Im(z2)>=0)) cout << “Los numeros son: ” << Re(z1) << “+” << Im(z1) << “i, ” << Re(z2) << “+” << Im(z2) << “i” << endl;

continuar=’S’;
while ((continuar==’S’)||(continuar==’s’))
{
cout << “Escribe la operacion que quieres realizar: +(suma), -(resta), *(multiplicacion), /(division), c(conjugado), a(valor absoluto), s(raiz cuadrada), g(argumento)” << endl;
cin >> operacion;
switch (operacion)
{
case ‘+’:
{
if (Im(Cadd(z1,z2))<0) cout << “El resultado es: ” << Re(Cadd(z1,z2)) << “-” << Im(Cadd(z1,z2)) << “i” << endl;
else cout << “El resultado es: ” << Re(Cadd(z1,z2)) << “+” << Im(Cadd(z1,z2)) << “i” << endl;
break;
}
case ‘-‘:
{
if (Im(Csub(z1,z2))<0) cout << “El resultado es: ” << Re(Csub(z1,z2)) << “-” << Im(Csub(z1,z2)) << “i” << endl;
else cout << “El resultado es: ” << Re(Csub(z1,z2)) << “+” << Im(Csub(z1,z2)) << “i” << endl;
break;
}
case ‘*’:
{
if (Im(Cmul(z1,z2))<0) cout << “El resultado es: ” << Re(Cmul(z1,z2)) << “-” << Im(Cmul(z1,z2)) << “i” << endl;
else cout << “El resultado es: ” << Re(Cmul(z1,z2)) << “+” << Im(Cmul(z1,z2)) << “i” << endl;
break;
}
case ‘/’:
{
if (Im(Cdiv(z1,z2))<0) cout << “El resultado es: ” << Re(Cdiv(z1,z2)) << “-” << Im(Cdiv(z1,z2)) << “i” << endl;
else cout << “El resultado es: ” << Re(Cdiv(z1,z2)) << “+” << Im(Cdiv(z1,z2)) << “i” << endl;
break;
}
case ‘c’:
{
if ((Im(Conjg(z1))<0)&&(Im(Conjg(z2))<0)) cout << “El resultado es: ” << Re(Conjg(z1)) << “-” << Im(Conjg(z1)) << “i, ” << Re(Conjg(z2)) << “-” << Im(Conjg(z2)) << “i” << endl;
else if ((Im(Conjg(z1))<0)&&(Im(Conjg(z2))>=0)) cout << “El resultado es: ” << Re(Conjg(z1)) << “-” << Im(Conjg(z1)) << “i, ” << Re(Conjg(z2)) << “+” << Im(Conjg(z2)) << “i” << endl;
else if ((Im(Conjg(z1))>=0)&&(Im(Conjg(z2))<0)) cout << “El resultado es: ” << Re(Conjg(z1)) << “+” << Im(Conjg(z1)) << “i, ” << Re(Conjg(z2)) << “-” << Im(Conjg(z2)) << “i” << endl;
else if ((Im(Conjg(z1))>=0)&&(Im(Conjg(z2))>=0)) cout << “El resultado es: ” << Re(Conjg(z1)) << “+” << Im(Conjg(z1)) << “i, ” << Re(Conjg(z2)) << “+” << Im(Conjg(z2)) << “i” << endl;
break;
}
case ‘a’: cout << “El resultado es: ” << Cabs(z1) << “-” << Cabs(z2) << endl;
break;
case ‘s’:
{
if ((Im(Csqrt(z1))<0)&&(Im(Csqrt(z2))<0)) cout << “El resultado es: ” << Re(Csqrt(z1)) << ” ” << Im(Csqrt(z1)) << “i, ” << Re(Csqrt(z2)) << “-” << Im(Csqrt(z2)) << “i” << endl;
else if ((Im(Csqrt(z1))<0)&&(Im(Csqrt(z2))>=0)) cout << “El resultado es: ” << Re(Csqrt(z1)) << “-” << Im(Csqrt(z1)) << “i, ” << Re(Csqrt(z2)) << “+” << Im(Csqrt(z2)) << “i” << endl;
else if ((Im(Csqrt(z1))>=0)&&(Im(Csqrt(z2))<0)) cout << “El resultado es: ” << Re(Csqrt(z1)) << “+” << Im(Csqrt(z1)) << “i, ” << Re(Csqrt(z2)) << “-” << Im(Csqrt(z2)) << “i” << endl;
else if ((Im(Csqrt(z1))>=0)&&(Im(Csqrt(z2))>=0)) cout << “El resultado es: ” << Re(Csqrt(z1)) << “+” << Im(Csqrt(z1)) << “i, ” << Re(Csqrt(z2)) << “+” << Im(Csqrt(z2)) << “i” << endl;
break;
}
case ‘g’: cout << “El resultado es: ” << Arg(z1) << “-” << Arg(z2) << endl;
break;
default: cout << “Error: operacion no valida” << endl;
}
cout << “¿Quieres realizar otra operacion (S/N)?” << endl;
cin >> continuar;
}

return 0;
}

/* Función que genera un nº complejo a partir de las partes real e imaginaria */
fcomplex Complejo(float re,float im)
{
fcomplex c;
c.r=re;
c.i=im;
return c;
}

/* Función que realiza la suma de dos números complejos */
fcomplex Cadd(fcomplex a,fcomplex b)
{
fcomplex c;
c.r=a.r+b.r;
c.i=a.i+b.i;
return c;
}

/* Función que realiza la resta de dos números complejos */
fcomplex Csub(fcomplex a,fcomplex b)
{
fcomplex c;
c.r=a.r-b.r;
c.i=a.i-b.i;
return c;
}

/* Función que realiza la multiplicación de dos números complejos */
fcomplex Cmul(fcomplex a,fcomplex b)
{
fcomplex c;
c.r=a.r*b.r-a.i*b.i;
c.i=a.i*b.r+a.r*b.i;
return c;
}

/* Función que realiza la división de dos números complejos */
fcomplex Cdiv(fcomplex a,fcomplex b)
{
fcomplex c;
float r,den;
if (fabs(b.r) >= fabs(b.i))
{
r=b.i/b.r;
den=b.r+r*b.i;
c.r=(a.r+r*a.i)/den;
c.i=(a.i-r*a.r)/den;
}
else
{
r=b.r/b.i;
den=b.i+r*b.r;
c.r=(a.r*r+a.i)/den;
c.i=(a.i*r-a.r)/den;
}
return c;
}

/* Función que calcula el conjugado de un nº complejo */
fcomplex Conjg(fcomplex z)
{
fcomplex c;
c.r = z.r;
c.i = -z.i;
return c;
}

/* Función que calcula el valor absoluto de un nº complejo */
float Cabs(fcomplex z)
{
float x,y,ans,temp;

x=(float)fabs(z.r);
y=(float)fabs(z.i);
if (x==0) ans=y;
else if (y==0) ans=x;
else if (x > y)
{
temp=(float)y/(float)x;
ans=x*(float)sqrt((double)(1.+temp*temp));
}
else
{
temp=(float)x/(float)y;
ans=y*(float)sqrt((double)(1.+temp*temp));
}
return ans;
}

/* Función que calcula la raiz cuadrada de un nº complejo */
fcomplex Csqrt(fcomplex z)
{
fcomplex c;
float x,y,w,r;
if ((z.r == 0.0) && (z.i == 0.0))
{
c.r=0;
c.i=0;
return c;
}
else
{
x=(float)fabs(z.r);
y=(float)fabs(z.i);
if (x >= y)
{
r=(float)y/(float)x;
w=(float)sqrt(x)*(float)sqrt(0.5*(1.+(float)sqrt(1.+r*r)));
}
else
{
r=(float)x/(float)y;
w=(float)sqrt(y)*(float)sqrt(0.5*(r+(float)sqrt(1.+r*r)));
}
if (z.r >= 0.0)
{
c.r=w;
c.i=z.i/(2*w);
}
else
{
c.i=(z.i >= 0) ? w : -w;
c.r=z.i/(2*c.i);
}
return c;
}
}

/* Función que devuelve la parte real de un nº complejo */
float Re(fcomplex z)
{
float c;
c=z.r;
return c;
}
/* Función que devuelve la parte imaginaria de un nº complejo */

float Im(fcomplex z)
{
float c;
c=z.i;
return c;
}

/* Función que calcula el argumento de un nº complejo */
float Arg(fcomplex z)
{
float c;
c=(float)atan2(z.i,z.r);
return c;
}

Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s