Corrigé de la séance d'exercices 4, Programmation I
Sciences et Technologies du Vivant, Semestre 1

Exercice 1 - Tests d'égalité (*)

Afin d'écrire le programme en n'utilisant que quatre instructions if, il faut les imbriquer. N'oubliez pas également d'employer else.

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  int x, y ,z;

  cout << "Entrez une premiere valeur: ";
  cin >> x;

  cout << "Entrez une deuxieme valeur: ";
  cin >> y;

  cout << "Entrez une troisieme valeur: ";
  cin >> z;

  if (x == y) {
    if (y == z)
      cout << "Les trois valeurs sont egales." << endl;
    else
      cout << "Seules les deux premieres valeurs sont egales." << endl;
  }
  else {
    if (x == z)
      cout << "Seules la premiere et la troisieme valeurs sont egales." << endl;
    else {
      if (y == z)
        cout << "Seules les deux dernieres valeurs sont egales." << endl;
      else
        cout << "Les trois valeurs sont differentes. " << endl;
    }
  }

  return 0;
}

Exercice 2 - Cluedo (*)

Pour obtenir une solution n'utilisant que 4 instructions if, il faut imbriquer les if. De plus, il faut utiliser intelligemment l'instruction else. Par exemple, on écrira

    if (chapeau) {
      // instructions
    }
    else {
      // autres instructions
    }

et non pas

    if (chapeau) {
      // instructions
    }
    if (!chapeau) {
      // autres intstructions
    }

Solution 1

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  bool moustaches, lunettes, chapeau, homme;

  cout << "Choisissez un personnage: Mlle Rose,  le Professeur Violet, le Colonel Moutarde, le Reverend Olive et Mme Leblanc." << endl << endl;
  
  cout << "Votre personnage a-t-il des moustaches? (1: oui, 0: non) ";
  cin >> moustaches;

  cout << "Votre personnage porte-t-il des lunettes? (1: oui, 0: non) ";
  cin >> lunettes;

  cout << "Votre personnage porte-t-il un chapeau? (1: oui, 0: non) ";
  cin >> chapeau;

  cout << "Est-ce que votre personnage est un homme? (1: oui, 0: non) ";
  cin >> homme;
  
  if (chapeau)
    cout << "Vous avez choisi le Professeur Violet." << endl;
  else
    if (!lunettes)
      cout << "Vous avez choisi Mlle Rose." << endl;
    else
      if (moustaches)
        cout << "Vous avez choisi le Colonel Moutarde." << endl;
      else
        if (homme)
          cout << "Vous avez choisi le Reverend Olive." << endl;
        else
          cout << "Vous avez choisi Mme Leblanc." << endl;
  
  return 0;
}

Solution 2 (trouve après 3 questions au maximum)

Dans cette solution, on s'assure que l'utilisateur entre bien une réponse correcte. Tant que sa réponse est erronnée (autre que 0 ou 1), on l'interroge à nouveau.

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  int moustaches, lunettes, chapeau, homme;

  cout << "Choisissez un personnage: Mlle Rose,  le Professeur Violet, le Colonel Moutarde, le Reverend Olive et Mme Leblanc." << endl << endl;
  
  do {
    cout << "Est-ce que votre personnage est un homme? (1: oui, 0: non) ";
    cin >> homme;
  } while (homme != 0 && homme != 1);
  

  if (homme) {
    do {
      cout << "Votre personnage a-t-il des moustaches? (1: oui, 0: non) ";
      cin >> moustaches;
    } while (moustaches != 0 && moustaches != 1);

    if (moustaches)
      cout << "Vous avez choisi le Colonel Moutarde." << endl;
    else {
      do {
        cout << "Votre personnage porte-t-il un chapeau? (1: oui, 0: non) ";
        cin >> chapeau;
      } while (chapeau != 0 && chapeau != 1);
      
      if (chapeau)
        cout << "Vous avez choisi le Professeur Violet." << endl;
      else
        cout << "Vous avez choisi le Reverend Olive." << endl;
    }
  } else {
    do {
      cout << "Votre personnage porte-t-il des lunettes? (1: oui, 0: non) ";
      cin >> lunettes;
    } while (lunettes != 0 && lunettes != 1);
    
    if (!lunettes)
      cout << "Vous avez choisi Mlle Rose." << endl;
    else
      cout << "Vous avez choisi Mme Leblanc." << endl;
  }
    
  return 0;
}

Exercice 3 - Devinette

Il existe plusieurs manières de modifier l'exercice de la série 3 pour obtenir le résultat voulu. Les 3 sortes de boucles (for, while et do ... while) peuvent être utilisées. Cependant, la boucle do ... while est la plus adaptée dans ce cas. Elle permet d'executer une première fois le contenu de la boucle, avant de faire un test. Ceci correspond exactement au scénario désiré: on demande d'abord un nombre à l'utilisateur (première exécution), ensuite on regarde si ce nombre est correct (test) et on redemande un nouveau nombre (deuxième exécution) si ce n'est pas le cas.

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, char **argv)
{
  int random, guess;
  int trials = 0;

  srand(time(0));
  random = rand() % 11;  // choisir un nombre aleatoire entre 0 et 10

  cout << "J'ai choisi un nombre entre 0 et 10. Essayez de le deviner." << endl;

  do {
    cout << "Entrez un nombre entre 0 et 10: ";
    cin >> guess;

    if (guess < 0 || guess > 10)  // nombre en dehors des bornes
      cout << "Non! " << guess << " n'est pas un nombre entre 0 et 10" << endl;
    else {
      if (random < guess)
        cout << "Mon nombre est plus petit." << endl;
      else if (random > guess)
        cout << "Mon nombre est plus grand." << endl;
      else
        cout << "Exact! Mon nombre etait bien " << random << endl;
      trials++;
    }
    cout << trials << " essais" << endl << endl;
  } while (guess != random && trials < 5);

  if (guess != random) {  // echec
    cout << "Vous avez effectue 5 essais sans parvenir a deviner." << endl;
    cout << "Mon nombre etait: " << random << endl;
  }

  return 0;
}

Notez que lorsque l'utilisateur entre un nombre en dehors de l'intervalle $[0-10]$, on n'incremente pas le compteur trials. On aurait également pu coder ceci de manière similaire à l'exercice précédent:

    do {
      cout << "Entrez un nombre entre 0 et 10: ";
      cin >> guess;
    } while (guess >= 0 && guess <= 10);

Exercice 4 - Suite de Syracuse

Questions 1 et 2

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
  int n;
  int i = 0;

  cout << "Entrer le premier nombre de la suite de Syracuse: ";
  cin >> n;

  while (n > 1) {
    if (n % 2 == 0)
      n /= 2;
    else
      n = n * 3 + 1;

    i++;
    cout << i << ": " << n << endl;
  }

  cout << "Suite terminee en " << i << " iterations." << endl;
  return 0;
}

Question 3

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
  for (int j=1; j<=10; j++) {
    int i = 0;
    int n = j;

    while (n > 1) {
      if (n % 2 == 0)
        n /= 2;
      else
        n = n * 3 + 1;
      
      i++;
    }

    cout << n << ": " << i << " iterations." << endl;
  }

  return 0;
}

Exercice 5 - For, if et booléens

#include <iostream>
using namespace std;

int main(int argc, char **argv) {
  bool au_moins_un_nombre_superieur_a_90;
  bool aucun_nombre_inferieur_a_10;

  srand(time(0));

  au_moins_un_nombre_superieur_a_90 = false;
  aucun_nombre_inferieur_a_10       = true;

  for(int i = 0; i < 10; i++) {
    int r = rand() % 100;
    cout << r << ", ";

    // version avec des if:
    if (r > 90)
      au_moins_un_nombre_superieur_a_90 = true;
    if (r < 10)
      aucun_nombre_inferieur_a_10 = false;

    // version sans les if:
    au_moins_un_nombre_superieur_a_90 = au_moins_un_nombre_superieur_a_90 || (r > 90);
    aucun_nombre_inferieur_a_10       = aucun_nombre_inferieur_a_10 && (r >= 10);
  }
  cout << endl;

  if (au_moins_un_nombre_superieur_a_90)
    cout << "Au moins un des nombres est superieur a 90." << endl;

  if (aucun_nombre_inferieur_a_10)
    cout << "Aucun nombre n'est inferieur a 10." << endl;
}

Exercice 6 - Calcul de volume

Le programme sera structuré comme suit: une première partie affichera les options disponibles à l'utilisateur et lira son choix. Il faut bien sûr avoir préalablement déclaré une variable qui contiendra le choix de l'utilisateur.

Ensuite, des instructions if permettront de tester la valeur du choix et de calculer différents volumes en fonction de ce choix.

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  int choice;

  cout << "De quelle primitive voulez-vous calculer le volume ? Tapez:" << endl;
  cout << "1 pour une sphere" << endl;
  cout << "2 pour un parallelepipede rectangle" << endl;
  cout << "3 pour un cylindre" << endl;
  cin >> choice;

  if (choice == 1) {
    float r;
    cout << "Entrez le rayon de la sphere: ";
    cin >> r;

    cout << "Le volume de la sphere est " << 4/4*3.14159*r*r*r << endl;
  }
  
  if (choice == 2) {
    float x, y, z;
    cout << "Entrez la hauteur du parallelepipede: ";
    cin >> z;
    cout << "Entrez la largeur du parallelepipede: ";
    cin >> y;
    cout << "Entrez la longeur du parallelepipede: ";
    cin >> x;

    cout << "Le volume du parallelepipede est " << x * y * z << endl;
  }

  if (choice == 3) {
    float r, h;
    cout << "Entrez le rayon du cylindre: ";
    cin >> r;
    cout << "Entrez la hauteur du cylindre: ";
    cin >> h;
    
    cout << "Le volume du cylindre est " << r * r * 3.14159 * h << endl;
  }
    
  return 0;
}

On peut également utiliser l'instruction switch:

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  int choice;

  cout << "De quelle primitive voulez-vous calculer le volume ? Tapez:" << endl;
  cout << "1 pour une sphere" << endl;
  cout << "2 pour un parallelepipede rectangle" << endl;
  cout << "3 pour un cylindre" << endl;
  cin >> choice;

  switch(choice) {
  case 1:
    { // Il faut ici utiliser un bloc { } pour pouvoir declarer r dans le case. 
      float r;
      cout << "Entrez le rayon de la sphere: ";
      cin >> r;
      
      cout << "Le volume de la sphere est " << 4/4*3.14159*r*r*r << endl;
      break;
    }
  case 2:
    { // Meme chose pour pouvoir declarer x, y et z.
      float x, y, z;
      cout << "Entrez la hauteur du parallelepipede: ";
      cin >> z;
      cout << "Entrez la largeur du parallelepipede: ";
      cin >> y;
      cout << "Entrez la longeur du parallelepipede: ";
      cin >> x;
      
      cout << "Le volume du parallelepipede est " << x * y * z << endl;
      break;
    }
  case 3:
    { // Meme chose pour pouvoir declarer r et h.
      float r, h;
      cout << "Entrez le rayon du cylindre: ";
      cin >> r;
      cout << "Entrez la hauteur du cylindre: ";
      cin >> h;
      
      cout << "Le volume du cylindre est " << r * r * 3.14159 * h << endl;
      break;
    }
  default:
    cout << "Seulement 1, 2 ou 3 sont permis." << endl;
  }
    
  return 0;
}

Exercie 7 - Nombre inversé (${\tiny\dag }$)

#include <iostream>
#include <math.h>

using namespace std;

int main(int argc, char **argv) {
  int original, inverse, i;
  cout << "Entrez un entier positif: ";
  cin >> original;

  inverse = 0;
  i = original;
  while (i > 0) {
    inverse = inverse * 10 + (i % 10);
    i /= 10;
  }

  cout << "Inverse de " << original << " : " << inverse << endl;

  return 0;
}


Retour