Re: Help calculo de numeros complejos Hola:
Aquí tengo un código C que te puede servir.
Nota: No son los números complejos tradicionales, sino que son cuaterniones, es decir, complejos pero con tres partes imaginarias en vez de una.
El código esta hecho con estructuras en vez de punteros.
// Programa que opera con números hipercomplejos o cuaterniones
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct vector vec;
struct vector
{
int pos;
float valor1;
float valor2;
float valor3;
float valor4;
vec *sgte;
}; // Se define la estructura (una posición, los cuatro valores del cuaternión,
// y un vector que apunta al siguiente cuaternión.
void guardar (float a,float b,float c,float d);
void showele(void);
void eliminar(void);
void reordenar(vec *T,int i);
float norma(int i);
void inversa();
vec *P;
vec *Q;
int n; // Se definen diversos tipos de datos en forma de cast.
void division()
{
float q,w,e,r,a,s,d,f,z,x,c,v;
vec *T;
int i;
if (!n)
return;
T = P;
printf("Ingrese el primer cuaternion a dividir\n");
scanf("%i",&i);
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
q=T->valor1;
w=T->valor2;
e=T->valor3;
r=T->valor4;
printf("Ingrese el segundo cuaternion a dividir\n");
scanf("%i",&i);
T=P;
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
a=T->valor1;
s=T->valor2;
d=T->valor3;
f=T->valor4;
z=norma(i);
z=z*z;
a=-a/z;
s=-s/z;
d=-d/z;
f=-f/z;
z=a*q-s*w-d*e-f*r;
x=q*s+a*w+e*f-d*r;
c=q*d+a*e+s*r-w*f;
v=q*f+a*r+w*d-s*e;
printf("el resultado es: %.5f + %.5fi + %.5fj + %.5fk\n",z,x,c,v);
system ("pause");
guardar(z,x,c,v);
return;
} // Se define la función división.
void inversa (int i)
{
float q,w,e,r;
float z;
vec *T;
if (!n)
return;
T = P;
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return ;
}
q=T->valor1;
w=T->valor2;
e=T->valor3;
r=T->valor4;
z=norma(i);
z=z*z;
q=q/z;
w=-w/z;
e=-e/z;
r=-r/z;
guardar(q,w,e,r);
printf("inversa de q%i es %.5f + %.5fi + %.5fj + %.5fk\n",i,q,w,e,r);
return ;
} // Se define la función inversa.
float norma(int i)
{
int q,w,e,r;
double z;
vec *T;
if (!n)
return;
T = P;
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
q=T->valor1;
w=T->valor2;
e=T->valor3;
r=T->valor4;
z=fabs(-q*q-w*w-e*e-r*r);
z=sqrt(z);
return z;
} // Se define la función norma.
void showele(void)
{
vec *T;
if (!n)
return;
T = P;
printf("\n");
while (T != NULL)
{
printf("q%i= ",(T->pos));
printf("%.5f + ",T->valor1);
printf("%.5fi + ",T->valor2);
printf("%.5fj + ",T->valor3);
printf("%.5fk\n",T->valor4);
T = T->sgte;
}
printf("\n");
return;
} // Se muestra en pantalla un cuaternión almacenado en memoria.
void guardar (float a,float b,float c,float d)
{
vec *T;
T = malloc(sizeof(struct vector));
if (!n)
P = T;
else
Q->sgte = T;
n++;
T->pos = n;
T->valor1 = a;
T->pos = n;
T->valor2 = b;
T->pos = n;
T->valor3 = c;
T->pos = n;
T->valor4 = d;
T->sgte = NULL;
Q = T;
return;
} // Se almacena un cuaternión en memoria.
void ingresar(void)
{
vec *T;
float i;
T = malloc(sizeof(struct vector));
if (!n)
P = T;
else
Q->sgte = T;
printf("Ingrese el Valor1\n");
scanf("%f",&i);
n++;
T->pos = n;
T->valor1 = i;
printf("Ingrese el Valor2\n");
scanf("%f",&i);
T->pos = n;
T->valor2 = i;
printf("Ingrese el Valor3\n");
scanf("%f",&i);
T->pos = n;
T->valor3 = i;
printf("Ingrese el Valor4\n");
scanf("%f",&i);
T->pos = n;
T->valor4 = i;
T->sgte = NULL;
Q = T;
printf("Valor Ingresado\n");
system ("pause");
return;
} // Se ingresan los valores del cuaternión.
void eliminar(void)
{
vec *T,*L;
int i;
if (!n)
return;
T = P;
printf("Ingrese el cuaternion a Eliminar\n");
scanf("%i",&i);
if (i == 1)
{
L = P;
P = P->sgte;
free(L);
T = P;
reordenar(T,i);
return;
}
while (T != NULL)
{
if (T->pos == (i-1))
break;
T = T->sgte;
}
if (n == i)
{
Q = T;
free(T->sgte);
Q->sgte = NULL;
n--;
return;
}
if ((T == NULL) || (T->pos == n))
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
L = T->sgte;
T->sgte = T->sgte->sgte;
T = T->sgte;
free(L);
reordenar(T,i);
return;
}
void reordenar(vec *T,int i)
{
while (T != NULL)
{
T->pos = i;
T = T->sgte;
i++;
}
n--;
printf("Cuaternion eliminado\n");
system ("pause");
return;
} // Se crea esta función para liberar memoria física mediante la eliminación
// de un cuaternión.
void sumar()
{
float q,w,e,r,a,s,d,f;
vec *T;
int i;
if (!n)
return;
T = P;
printf("Ingrese el primer cuaternion a Sumar\n");
scanf("%i",&i);
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
q=T->valor1;
w=T->valor2;
e=T->valor3;
r=T->valor4;
printf("Ingrese el segundo cuaternion a Sumar\n");
scanf("%i",&i);
T=P;
while (T != NULL)
{
if (T->pos == i)
break;
T = T->sgte;
}
if (T == NULL)
{
printf("No se encontro ese cuaternion\n");
system ("pause");
return;
}
a=T->valor1;
s=T->valor2;
d=T->valor3;
f=T->valor4;
a=a+q;
s=s+w;
d=d+e;
f=f+r;
printf("el resultado es: %.5f + %.5fi + %.5fj + %.5fk\n",a,s,d,f);
guardar(a,s,d,f);
system ("pause");
return; |