/* File: complex.c */
/* Time-stamp: "2001-05-02 18:08:44 calvanes" */
/* Scopo: strutture */

/* Operazioni sui numeri complessi: definizione della struttura dati e delle
                                    principali funzioni

   La rappresentazione dei numeri e` data nella forma "a + i*b".
   Per le operazioni aritmetiche si usano le funzioni re im e assegnaC.
*/

#include <stdio.h>
#include <math.h>


struct complex {
  double re, imm;
};
typedef struct complex Complex;


Complex leggiC()
  /* Restituisce un complesso letto da input. */
{
  Complex c;

  printf("parte reale ? ");
  scanf("%lg", &c.re);
  printf("parte immaginaria ? ");
  scanf("%lg", &c.imm);

  return c;
}


void scriviC(Complex c)
  /* Stampa un complesso in output. */
{
  if (c.imm < 0)
    printf("%4.2f - i*%4.2f", c.re, fabs(c.imm));
  else
    printf("%4.2f + i*%4.2f", c.re, c.imm);
}


Complex assegnaC(double x, double y)
  /* Restituisce x + i*y */
{
  Complex c;

  c.re = x;
  c.imm = y;
  return c;
}


double re(Complex c)
  /* Restituisce la parte reale di c. */
{
  return (c.re);
}


double imm(Complex c)
  /* Restituisce la parte immaginaria di c. */
{
  return (c.imm);
}


Complex sommaC(Complex c1, Complex c2)
  /* Restituisce c1 + c2. */
{
  Complex c;

  c.re = c1.re + c2.re;
  c.imm = c1.imm + c2.imm;
  /* c = assegnaC(re(c1) + re(c2), imm(c1) + imm(c2)); */
  return c;
}


Complex prodottoC(Complex c1, Complex c2)
  /* Restituisce c1 * c2. */
{
  Complex c;

  c.re = c1.re * c2.re - c1.imm * c2.imm;
  c.imm = c1.re * c2.imm + c1.imm * c2.re;
  return c;
}

int main(void)
{
  Complex a, b, c;

  printf("Immetti il primo numero complesso\n");
  a = leggiC();
  printf("Immetti il secondo numero complesso\n");
  b = leggiC();

  c = sommaC(a, b);
  printf("La somma e`: ");
  scriviC(c);
  putchar('\n');

  c = prodottoC(a, b);
  printf("Il prodotto e`: ");
  scriviC(c);
  putchar('\n');
}