/*  En-tete du programme
  ====================
  Programme:  Formulaire
  Autheur:    Martin Robinson
  Conception: 20/01/2012
  But:    Prouver que Angelina Jolie
          se reproduit beaucoup trop

  Directives du preprocesseur
  ===========================*/

#include <iostream>
#include <limits>
#include <string>
#include <sstream>

using namespace std;

const char * msgSaisieNom = "Entrer votre nom : ";
const char * msgSaisieSexe = "Entrer votre sexe (f/g) : ";
const char * msgSaisieNbEnfant = "Combien d’enfants avez-vous ? : ";
const char * msgSaisieNomEnfant = "Quel est le nom de votre enfant ";
const int maxInt = numeric_limits<int>::max();

/*  Prototype de fonction
  ===================*/

void clearStream()
{
    cin.clear();              //vider les flags
    cin.ignore(maxInt,'\n');  //vider le buffer
}

int saisirNombre(const char * message,int min=0 ,int max =maxInt)    //saisie d'un nombre
{
  int nombre = min-1;
  while (1)
  {
    cout << message << ' ';
    cin >> nombre;
    if (cin.fail() || nombre<min || nombre>max)             //n'est pas un nombre
      cout << "\nvous devez entrer un nombre entre " << min << " et " << max << '\n';
    else
      break;
    clearStream();
  }
  return nombre;
}

char saisirUnChar(const char * message)   //saisie d'un seul charactere
{
  char symbole;
  cout << '\n' << message << ' ';
  cin >> symbole;
  clearStream();
  return symbole;
}

string saisirUneString(string message)
{
  string saisie;
  while (saisie=="")
  {
    cout << '\n' << message;
    getline(cin,saisie);
  }
  return saisie;
}

/*  Programme principal
  ===================*/
 
int main ()
{
  /*initialisation*/
  string nom;
  char sexe;
  int nbEnfant = 0;
  string nomEnfant;
  /*valiation*/
  cout << "Formulaire d’inscription\n"
       << "========================\n";
  nom = saisirUneString(msgSaisieNom);
  while (sexe!='G' && sexe!='F')
    sexe = toupper(saisirUnChar(msgSaisieSexe));
  nbEnfant = saisirNombre(msgSaisieNbEnfant,0,20);
  
  clearStream();
  for(int i=0; i<nbEnfant; i++)
  {
    stringstream questionEnfant;
    questionEnfant << msgSaisieNomEnfant << i+1 << " ? : ";
    nomEnfant = saisirUneString(questionEnfant.str());
  }
  
  cout << nom << " votre montant d'allocation pour " << nbEnfant 
       << " enfant" << ((nbEnfant>1)?'s':' ') << " : " 
       << ((nbEnfant>0) ? ((nbEnfant-1)*1083)+2166 : 0) + ((nbEnfant>3) ? (nbEnfant-3)*540 : 0) 
       << "$\n";
  
  return 0;
}