/*  En-t�te du programme
  ====================
  Programme:  menu et ascii art
  Autheur:  Martin Robinson
  Conception: 20/01/2012
  But:    programme avec un menu
          qui dessine du ascii art.

  Directives du pr�processeur
  ===========================*/

#include <iostream>
#include <limits>

using namespace std;

const char * msgSaisieNb = "Entrez le nombre de symboles a reproduire : ";
const char * msgSaisieSymb = "Entrez le symbole a reproduire nombre : ";
const char * msgSaisieChoix = "Entrez votre choix : ";

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

int saisirNombre(const char * message)    //saisie d'un nombre
{
  int nombre;
  while (!nombre)
  {
    cout << message << ' ';
    cin >> nombre;
    if (cin.fail())             //n'est pas un nombre
    {
      cout << '\n' << "\nvous devez entrer un nombre\n";
      nombre = 0;
    }
    cin.clear();                                  //vider les flags
    cin.ignore(numeric_limits<int>::max(),'\n');  //vider le buffer
  }
  return nombre;
}

char saisirUnChar(const char * message)   //saisie d'un seul charactere
{
  char symbole;
  cout << '\n' << message << ' ';
  cin >> symbole;
  cin.clear();                                 //vider les flags
  cin.ignore(numeric_limits<int>::max(),'\n'); //videz le buffer
  return symbole;
}

/*  Programme principal
  ===================*/

int main()
{
  //initialisation
  int nb;     //nombre de symbole
  char symb,  //symbole
       choix; //choix du menu

  //saisie du nombre de symbole
  nb = saisirNombre(msgSaisieNb);
  symb = saisirUnChar(msgSaisieSymb);
  
  //boucle principale
  do{
    //system("cls");
    
    //menu choix
    cout << "\nChoisissez la forme que vous voulez reproduire parmi les suivantes :\n"
         << " a. ligne\n"
         << " b. cube plein\n"
         << " c. cube vide\n"
         << " d. triangle rectangle\n"
         << " e. quitter le programme\n\n";
    choix = saisirUnChar(msgSaisieChoix);
    choix = toupper(choix);
    if (choix < 65 && choix > 90)
    {
      cout << "\n\nvotre choix est invalide\n\n";
      continue;
    }

    //resultat du choix
    switch(choix)
    {
    case 'A':   //ligne
      cout << "\nvoici une ligne\n";
      for (int i = 0; i<nb;i++)
        cout << symb;
      cout << endl;
      break;
    case 'B':   //cube plein 
      cout << "\nvoici un cube plein\n";
      for (int i = 0; i<nb;i++)   //repetition de ligne
      {
        for (int j = 0;j<nb;j++)    //repetition de character
          cout << symb;
        cout << '\n';             //petit changement de ligne
      }
      break;
    case 'C':   //cube vide
      cout << "\nvoici un cube vide\n";
      for (int i = 0; i<nb;i++)   //repetition de ligne
      {
        for (int j=0;j<nb;j++)    //repetition de character
        {
          if (i>0 && i<nb-1 && j>0 && j<nb-1)
            cout << ' ';          //espace à l'interrieurs
          else
            cout << symb;
        }
        cout << '\n';             //petit changement de ligne
      }
      break;
    case 'D':   //triangle rectangle
      cout << "\nvoici un triangle\n";
      for (int i = 0; i<nb;i++)   //repetition de ligne
      {
        for (int j=0;j<=i;j++)    //se sert de i comme limite
          cout << symb;

        cout << '\n';             //petit changement de ligne
      }
      break;
    }

    //cout << "\nAppuyer sur une touche pour continuer.\n";
    //system("pause");
  }while(choix != 'E');

  //system("pause");
  return 0;
}