/* Programa    complexos01.c  
	Assunto:  	Álgebra de números complexos.
	Programa 	sem erros

   Descrição: Recebe dois  pares de número reais e calcula
	alguma operação com estes números complexos. Faz também
	o produto de um complexo por um real.
         

   por Tarcisio Praciano Pereira - 10 lições para aprender C
   Sobral, Novembro de 2002 - na era Lula	- UVA
*/


# include <stdio.h>  	// (1) leitura da biblioteca padrão
# include "/home/tarcisio/tex/c/ufg/ambiente.h"

			//	(2)	O tipo, número complexo
typedef	struct {
			float a; float b;
			} Complexo;

float		Re(Complexo z);
float		Im(Complexo z);
void		escreve(Complexo z);
Complexo	mais(Complexo z, Complexo w);
Complexo	vezes(Complexo z, Complexo w);
Complexo	P(Complexo z);
Complexo	Q(Complexo z);
Complexo	faz_complexo(float a, float b);

int main(void)
{
	Complexo z,w;
	printf("	=====   Sistema algébrico dos números complexos \n");
	printf("		Entrada de dados do número complexo z =   \n");	
	z.a = entrada_float(" a1 =  ", z.a);
	z.b = entrada_float("	b1 =  ", z.b);
	printf("	Um outro número complexo z =   \n");	
	w.a = entrada_float(" a2 =  ", w.a);
	w.b = entrada_float("	b2 =  ", w.b);	
	printf("	 A soma de "); escreve(z); printf("com ");escreve(w);
	printf("\n é \n");
	escreve(mais(z,w));
	apeteco2();
	printf("	 A produto  de "); escreve(z); printf("com ");escreve(w);
	printf("\n é \n");
	escreve(vezes(z,w));	
	apeteco2();
	printf("O quadrado de ");z.a = -2; z.b = 3;
	escreve(z);
	printf("é "); 
	escreve(Q(z));
	return 0;
}

Complexo	recebe(Complexo z, Complexo w)
{
	z.a = w.a;
	z.b = w.b;
	return(z);
}

float		Re(Complexo z)
	{
		return z.a;
	}

float		Im(Complexo z)
	{
		return z.b;
	}

Complexo	mais(Complexo z, Complexo w)
{
	Complexo temp;
	temp.a = z.a + w.a;
	temp.b = z.b + w.b;
	return(temp);
}

Complexo vezes(Complexo z, Complexo w)
{
	Complexo temp;
	temp.a = z.a*w.a - z.b*w.b;
	temp.b = z.b*w.a + z.a*w.b;
	return(temp);
}

Complexo	faz_complexo(float a, float b)
{
	Complexo temp;
	temp.a= a; temp.b = b;
	return(temp);
}

void	escreve(Complexo z)
{
	printf(" %2.2f + %2.2f i\n", Re(z),Im(z));
}

//      a0 + z*(a1 + z*( a2 + z*a3))) 
//     mais(a0, vezes(z, mais(a1, vezes(z, mais(a2, vezes(a3,z))))))
Complexo	P(Complexo z)
{
	Complexo a0, a1, a2, a3;
	Complexo temp;
	
	recebe(temp, mais(a0, vezes(z, mais(a1, vezes(z, mais(a2, vezes(a3,z)))))));
	return(temp);
}

Complexo	Q(Complexo z)
{
	Complexo v={1,0};
	recebe(v, faz_complexo(1,0));
	Complexo temp = vezes(z,z);
	temp = vezes(v,temp);
	return(temp);
}


/* Comentários:  A numeração dos comentários não
		  é continuada, pode dar saltos...para
		  facilitar a reutilização de programas.

	(2)	O tipo, número complexo. Com "typedef" podemos criar novos tipos 
	de dados. Aqui foi criado o tipo "Complexo" com auxílio de "struct".
	Um número complexo tem dois campos indicados por "a" e por "b".
*/


