// Autor: Pablo Sánchez (p.sanchez@unican.es)
// http://personales.unican.es/sanchezbp
// Descripción: Implementación lenguaje de pseudocódigo
// utilizado en EDA del módulo Complejo,
// el cual representa a los números complejos.

IMPLEMENTACION MODULO Complejo ES

//-------------------------------------------------//
// Declaración del tipo complejo //
//-------------------------------------------------//
Complejo ES TUPLA
real : Real;
imag : Real;
FINTUPLA


//----------------------------------------------------//
// Funciones de acceso a atributos del tipo complejo //
//----------------------------------------------------//
FUNCION getReal(c : Complejo) : Real ES
DEVOLVER c.real;
FINFUNCION

FUNCION setReal(REF c : Complejo, r : Real) ES
c.real := r;
FINFUNCION

FUNCION getImaginaria(c : Complejo) : Real ES
DEVOLVER c.img;
FINFUNCION

FUNCION setImaginaria(REF c : Complejo, i : Real) ES
c.imag := i;
FINFUNCION


//----------------------------------------------------//
// Operaciones sobre el tipo complejo //
//----------------------------------------------------//
FUNCION suma(c1 : Complejo, c2 : Complejo) : Complejo ES

result : Complejo;
// En este punto del programa, los atributos de result,
// es decir, result.real y result.imag tendrán un valor
// indeterminado.

setReal(result,getReal(c1)+getReal(c2));
setImaginaria(result,getImaginaria(c1)+getImaginaria(c2));


DEVOLVER result;
FINFUNCION

FUNCION resta(c1 : Complejo, c2 : Complejo) : Complejo ES

result : Complejo;
// En este punto del programa, los atributos de result,
// es decir, result.real y result.imag tendrán un valor
// indeterminado.

setReal(result,getReal(c1)-getReal(c2));
setImaginaria(result,getImaginaria(c1)-getImaginaria(c2));


DEVOLVER result;
FINFUNCION

FUNCION multiplica(c1 : Complejo, c2 : Complejo) : Complejo ES

result : Complejo;
// En este punto del programa, los atributos de result,
// es decir, result.real y result.imag tendrán un valor
// indeterminado.

real, imag : Real;

real := (getReal(c1)*getReal(c2))-
(getImaginaria(c1)*getImaginaria(c2));
imag := (getReal(c1)*getImaginaria(c2))+
(getImaginaria(c1)*getReal(c2));

setReal(result,real);
setImaginaria(result,imag);

DEVOLVER result;
FINFUNCION

// Pre: En caso de que se divida por cero, el valor del
// resultado seria
FUNCION divide(c1 : Complejo, c2 : Complejo) : Complejo ES

result : Complejo;

SI ((getReal(c2) != 0.0) OR
(getImaginaria(c2) != 0.0))ENTONCES


real, imag, den : Real;

real := (getReal(c1)*getReal(c2))+
(getImaginaria(c1)*getImaginaria(c2));
imag := (getImaginaria(c1)*getReal(c2)) -
(getReal(c1)*getImaginaria(c2));
den := (getReal(c2)*getReal(c2)) +
(getImaginaria(c2)*getImaginaria(c2));


setReal(result,real/den);
setImaginaria(result,imag/den);

FINSI

DEVOLVER result;
FINFUNCION

// Post: El real que se devuelve es siempre positivo
FUNCION modulo(c1 : Complejo) : Real ES

result : Real;

// Suponemos que tenemos una función raizCuadrada(..)
// con la cabecera adecuada que podemos usar sin
// problema alguno (previa importación)
result := raizCuadrada((getReal(c1)*getReal(c1)) +
(getImaginaria(c1)*getImaginaria(c1)));

DEVOLVER result;
FINFUNCION

// Post: El real que se devuelve es siempre positivo y tiene
// un valor comprendido entre 0 y 2*Pi
FUNCION argumento(c1 : Complejo) : Real ES

result : Real;

// Suponemos que tenemos una función arcotangente(..)
// con la cabecera adecuada que podemos usar sin
// problema alguno (previa importación), y que además
// existe una constante PI que representa el valor de Pi
SI (getReal(c1) != 0.0) ENTONCES
result := arcotangente(getImaginaria(c1) / getReal(c1));
SINOSI (getImaginaria(c1) >= 0.0) ENTONCES
result := PI / 2.0;
SINO
result := PI * (3.0 / 2.0);
FINSI

DEVOLVER result;

FINFUNCION

FININTERFAZ

Última modificación: viernes, 26 de mayo de 2017, 10:16