#ifndef _NB_COMP
#define _NB_COMP

// NombreComplexe.H
// Interface du module NombreComplexe offrant le type abstrait Complexe
// ainsi qu'un jeu d'operations, de fonctions et de procedures permettant
// de manipuler les Complexes independamment de leur implantation interne.

// Modules importes-------------------------------------------------------
// (offrant des types, variables, constantes, procedures 
//  ou fonctions intervenant dans l'interface de NombreComplexe)

#include "Reel.H" //Module offrant le type reel

//  ----------------------------------------------------------------------- 
//  Types, variables, constantes, procedures et fonctions exportees 

// declaration constante globale exportee
extern const Reel PI;

// declaration variable globale exportee
// (aucune ici)

// declaration (et definition!) type exporte
struct Complexe
{
  //donnees membres (champs)
  Reel x,y;
};

// --declaration procedures d'initialisation--------------------- 
void initialisation(Complexe & c); 
// Precondition : c non initialise prealablement
// Postcondition : le Complexe c initialise vaut 0
//                 et le nombre de Complexes "vivants" est incremente de 1

void initialisation(Complexe & c1,const Complexe & c2);
//Precondition : c1 non initialise prealablement, c2 initialise
//Postcondition : c1 a la meme valeur que c2
//                et le nombre de Complexes vivants est incremente de 1

void initialisation(Complexe & c, Reel a, Reel b);
//Precondition : c non initialise prealablement
//Postcondition : le complexe c initialise vaut a+ib
//                et le nombre de Complexes vivants est incremente de 1


// --declaration procedures testament --------------------- 
void testament(Complexe & c);
// Precondition : c initialise
// Postcondition : le complexe c est pret a disparaitre 
//        (le nombre de Complexes vivant est decremente de 1)

// --declaration procedures affectation ---------------------  
void affectation(Complexe & c1,const Complexe & c2);
// Precondition : c1 et c2 initialises
// Postcondition : le complexe c1 a la meme valeur que c2


// Addition entre Complexes
Complexe addition(const Complexe & c1,const Complexe & c2);
// Precondition : c1 et c2 initialises 
// Resultat : renvoie la somme des complexes codes dans c1 et c2

/// Affichage d'un Complexe
void affiche(const Complexe & c);
// Precondition : c initialise
// Postcondition : Affichage sur la sortie standard du complexe code dans c

//Nombre de Complexes "vivants"
int nbComplexesVivants();
// Precondition : aucune
// Resultat : renvoie le nombre de Complexes "vivants" au moment de l'appel

#endif

