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

Exercice 1 - Génération de nombres aléatoires

  1. La fonction rand() retourne un entier entre 0 et RAND_MAX, où RAND_MAX est un très grand nombre entier. La manière la plus simple d'obtenir un nombre aléatoire entre 0 et 9, consiste à prendre le reste de la division entière par 10 de l'entier retournè par rand(). Comme vous le savez, le reste de la division entière par $n$ donne un nombre entre 0 et $n-1$.
  2. Pour obtenir un nombre aléatoire entre 1 et 10, il suffit d'ajouter 1 au résultat obtenu au point précédent.
  3. Commençons par obtenir un nombre flottant entre 0 et 1. Si l'on convertit le résultat de rand() en float et qu'on le divise par RAND_MAX (i.e. la plus grande valeur possible), le résultat sera un nombre flottant compris entre 0 et 1. Pour obtenir un flottant entre 0 et 10, il suffit simplement de multiplier ce résultat par 10.
  4. Appliquons la méthode du point précédent afin d'obtenir un nombre flottant entre 0 et 2. En lui soustrayant 1, on obtient à présent un flottant entre -1 et 1.

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

using namespace std;

int main(int argc, char **argv)
{
  srand(time(NULL));

  // entiers entre 0 et 9
  cout << rand() % 10 << endl;

  // entiers entre 1 et 10
  cout << 1 + (rand() % 10) << endl;

  // flottants entre 0 et 10
  //      rand(): entier entre 0 et RAND_MAX
  //      float(rand()): flottant entre 0 et RAND_MAX
  //      float(rand()) / RAND_MAX: flottant entre 0 et 1
  cout << float(rand()) / RAND_MAX * 10 << endl;

  // flottants entre -1 et 1
  cout << (float(rand()) / RAND_MAX * 2) - 1 << endl;

  return 0;
}

Exercice 2 - Tests

a) Notez l'usage de < ``strictement plus petit'' et <= ``plus petit ou egal''. N'oubliez pas la différence entre l'affectation (=) et l'égalité (==). Plusieurs conditions peuvent être testées dans une seule instruction if, à l'aide des opérateurs && (et) et || (ou). Pour tester si un nombre est pair, il suffit de vérifier s'il est divisible par 2, i.e. si le reste de sa division entière par 2 est 0.

#include <iostream>

using namespace std;

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

  cout << "Entrez x: ";
  cin >> x;

  cout << "Entrez y: ";
  cin >> y;
  
  if (x == 2 * y)
    cout << "x = 2y" << endl;
  
  if (x % 2 == 0)
    cout << "x est pair" << endl;
  
  if ((x % 2 == 0) && (y % 2 ==  1))
    cout << "x est pair et y est impair" << endl;
  
  if (-15 < x && x < 10)
    cout << "x est compris (strictement) entre -15 et +10" << endl;

  return 0;
}

b) Afin de ne pas utiliser d'opérateurs logiques (&& et ||), il faut employer efficacement les instructions de test if et else. Souvenez-vous que les instructions if peuvent être suivies d'un bloc d'instructions dans lequel figurent d'autres instructions if.

#include <iostream>

using namespace std;

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

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

  if (x >= 50)
    cout << "x >= 50" << endl;
  else {           // si x < 50
    if (x >= 5)
      cout << "5 <= x < 50" << endl;
    else {         // si x < 5
      if (x >= -5)
        cout << "-5 <= x < 5" << endl;
      else         // si x < -5
        cout << "x < -5" << endl;
    }
  }

  return 0;
}

Exercice 3 - Suite et Série

a)

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
  float U = 1;
  
  cout << "U0 = " << U << endl;

  for (int n = 1; n <= 10; n++) {
    U = U / n;

    cout << "U" << n << " = " << U << endl;
  }

  return 0;
}

b)

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
  float U = 1;
  float V = U;

  cout << "U0 = " << U << endl;

  for (int n = 1; n <= 10; n++) {
    U = U / n;
    V = V + U;

    cout << "U" << n << " = " << U << endl;
    cout << "V" << n << " = " << V << endl;
  }

  return 0;
}

Exercice 4 - Figures en mode texte

L'affichage d'une ligne se fait à l'aide d'une simple boucle for. Pour afficher plusieurs lignes, il faudra imbriquer 2 boucles for.

Pour le triangle, la longueur d'une ligne est fonction du numéro de ligne. Donc, la condition d'arrêt de la boucle écrivant une ligne dépendra du compteur de la boucle parent (j).

Pour la pyramide inversée, il suffit de rajouter un nombre variable d'espaces avant les nombres.

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
  // 1.
  for (int i=1; i<=9; i++)
    cout << i;
  cout << endl << endl;

  // 2.
  for (int j=1; j<=9; j++) {
    for (int i=1; i<=9; i++)
      cout << i;
    cout << endl;
  }
  cout << endl;

  // 3.
  for (int j=1; j<=9; j++) {
    for (int i=1; i<=j; i++) // la boucle va de 1 a j !!
      cout << i;
    cout << endl;
  }
  cout << endl;

  // 4.
  for (int j=1; j<=9; j++) {
    for (int i=1; i<=(9-j); i++)
      cout << " ";
    for (int i=1; i<=j; i++)
      cout << i;
    cout << endl;
  }
  cout << endl;

  return 0;
}

Exercice 5 - Devinette

La structure de ce programme est simple:

  1. On tire un nombre au hasard (random);
  2. On demande à l'utilisateur d'entrer un nombre (guess);
  3. On compare les deux nombres.

Il n'y a que 3 conditions à tester:

  1. Les deux nombres sont égaux;
  2. random est plus grand que guess;
  3. guess est plus grand que random.

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

using namespace std;

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

  srand(time(NULL));
  random = rand() % 11;

  cout << "J'ai choisi un nombre entre 0 et 10. Essayez de le deviner: ";
  cin >> guess;

  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;

  return 0;
}

Exercice 6 - Résolution d'équation du deuxième degré (suite)

Le but de cet exercice est d'empêcher le programme d'effectuer une opération impossible - la racine carrée d'un nombre négatif - à l'aide de l'instruction if. La solution est très simple: il suffit de vérifier que $\Delta=b^2-4ac$ est positif avant de calculer la racine carrée. Si $\Delta > 0$, on procède normalement, sinon on écrit un message d'erreur et on ne calcule pas la racine carrée.

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

using namespace std;

int main(int argc, char **argv)
{
  float a, b, c;
  float delta;

  cout << "Entrez les coefficients:" << endl << "a: ";
  cin >> a;
  cout << "b: ";
  cin >> b;
  cout << "c: ";
  cin >> c;
  
  delta = b*b-4*a*c;

  if (delta < 0)
    cout << "Je ne sais pas calculer les racines dans ce cas." << endl;
  else {
    cout << "Les deux racines sont: " << endl;
    cout << "1) " << (-b+sqrt(delta))/2/a << endl;
    cout << "2) " << (-b-sqrt(delta))/2/a << endl;
  }

  return 0;
}


Retour