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

Exercice 1 - Insertion dans un tableau(*)

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

using namespace std;
      
int main(int argc, char **argv) {
  const int nb_elements = 15;
  int tableau[nb_elements];
  int n, pos;

  srand(time(0));
  tableau[0] = rand() % 50;

  for (int i=1; i<nb_elements-1; i++)
    tableau[i] = tableau[i-1] + (rand() % 20);
  tableau[nb_elements-1] = 0;

  cout << "Tableau initial:" << endl;
  for (int i=0; i<nb_elements; i++)
    cout << tableau[i] << " ";
  cout << endl;

  cout << "Entrez un entier a inserer dans le tableau: ";
  cin >> n;

  /* calcul de la position a laquelle on va 
   * inserer le nouvel element */
  pos = 0;  
  while (tableau[pos] < n)
    pos++;

  // decalage des elements vers la droite
  for (int i=nb_elements-1; i>pos; i--)
    tableau[i] = tableau[i-1];

  // insertion du nouvel element
  tableau[pos] = n;

  cout << endl << "Tableau avec le nouvel element:" << endl;
  for (int i=0; i<nb_elements; i++)
    cout << tableau[i] << " ";
  cout << endl;

  return 0;
}

Exercice 2 - Fonctions simples

  1. float min2(float a, float b) {
      if (a < b)
        return a;
      else
        return b;
    }
    

  2. Pour calculer le minimum de 3 nombres, on peut, par exemple, calculer d'abord le minimum des 2 premiers, et ensuite calculer le minimum de ce résultat et du dernier nombre. Comme on a déjà écrit une fonction retournant le minimum de 2 nombres au point précédent, on peut donc la réutiliser.
    int min3(int a, int b, int c) {
      return int(min2(min2(a, b), c));
    }
    

  3. Pour arrondir un nombre à 2 décimales, il suffit de le multiplier par 100, le convertir en int, le reconvertir en float et le diviser par 100, comme nous l'avions vu à la série 2. Lorsqu'on divise 2 nombres, si l'un d'entre eux est un float, le compilateur effectuera une division réelle. Dans le corrigé, on écrit la constante 100 100.0 afin que le compilateur la considère comme une constante float, ce qui nous évite de faire la conversion explicite.
    float arrondi(float a) {
      return int(a * 100) / 100.0;
    }
    

  4. Il n'y pas d'autre manière que de fournir un texte particulier pour chaque nombre. La fonction peut aussi s'écrire avec des ifs.
    void traduction(int n) {
      switch (n) {
      case 0:
        cout << "zero";
        break;
      case 1:
        cout << "un";
        break;
      case 2:
        cout << "deux";
        break;
      case 3:
        cout << "trois";
        break;
      case 4:
        cout << "quatre";
        break;
      case 5:
        cout << "cinq";
        break;
      case 6:
        cout << "six";
        break;
      }
    }
    

Exercice 3 - Sapin

  1. Comme pour l'exercice 1 de la série précédente, tout l'intérêt de l'exercice réside dans la recherche de la relation entre le numéro de ligne et le nombre d'espaces et d'étoiles. Si $i$ est le numéro de ligne, commençant à 0, et lignes le nombre de lignes, le nombre d'espaces est donné par lignes-i-1 et le nombre d'étoiles par 2*i+1.
    void dessine_etage(int lignes) 
    {
      for (int i = 0; i < lignes; i++) 
      {
        for (int j = 0; j < lignes - i - 1; j++)
          cout << " ";
        for (int j = 0; j < i * 2 + 1; j++)
          cout << "*";
        cout << endl;
      }
    }
    

  2. Pour obtenir le même dessin que sur l'énoncé, il faut décaler les étages du sapin en ajoutant des espaces suppléntaires. Une solution consiste à légèrement modifier la fonction dessine_etage en lui ajoutant un paramètre spécifiant le nombre d'espaces supplémentaires.
    #include <iostream>
    
    using namespace std;
    
    void dessine_etage(int lignes, int espaces) 
    {
      for (int i = 0; i < lignes; i++) {
        for (int j = 0; j < espaces + lignes - i - 1; j++)
          cout << " ";
        for (int j = 0; j < i * 2 + 1; j++)
          cout << "*";
        cout << endl;
      }
    }
    
    int main(int argc, char **argv) {
      dessine_etage(2, 2);
      dessine_etage(3, 1);
      dessine_etage(4, 0);
      dessine_etage(1, 3);
    
      return 0;
    }
    

Exercice 4 - Modularisation

#include <iostream>

using namespace std;

// calcule a^b
int puissance(int a, int b) {
  int resultat = 1;
  for (int i=0; i<b; i++)
    resultat *= a;

  return resultat;
}

// calcule le log entier de n en base 'base'
int log_entier(int n, int base) {
  int resultat = 0;
  while (n > 0) {
    resultat++;
    n /= base;
  }
  
  return resultat;
}

// converti 'original', de taille 'bits' bits de la
// base de depart a la base d'arrivee
int conversion(int original, int bits, 
               int base_depart, int base_arrivee) {
  int converti = 0;
  int puissance_depart;
  int puissance_arrivee;
  for (int i=bits-1; i>=0; i--) {
    puissance_depart = puissance(base_depart, i);
    puissance_arrivee = puissance(base_arrivee, i);
    
    if (original / puissance_arrivee > 0) {
      original -= puissance_arrivee;
      converti += puissance_depart;
    }
  }

  return converti;
}

int main(int argc, char **argv) {
  const int max_bits = 10;
  int decimal, binaire, original, bits;

  cout << "Entrez un nombre entier: ";
  cin >> decimal;

  // calcul du nombre de bits de 'decimal'
  bits = log_entier(decimal, 2);

  cout << decimal << " a " << bits << " bits." << endl;
  if (bits > 10) {
    cout << "Nous ne pouvons pas convertir de nombres plus grands que " 
         << max_bits << " bits." << endl;
    return 0;
  }

  // conversion en binaire
  binaire = conversion(decimal, bits, 10, 2);

  cout << decimal << " vaut '" << binaire << "' en binaire." << endl;
  
  // calcul du nombre de bits
  bits = log_entier(binaire, 10);

  cout << decimal << " a " << bits << " bits." << endl;

  // conversion de binaire en decimal
  original = conversion(binaire, bits, 2, 10);
  
  cout << "Nombre original: " << original << endl;

  return 0;
}

Exercice 5 - Beau sapin($\dag $)

#include <iostream>

using namespace std;

void dessine_etage(int lignes, int espaces, int sommet) {
  for (int i=sommet; i<lignes; i++) {
    for (int j=0; j<espaces+lignes-i-1; j++)
      cout << " ";
    for (int j=0; j<i*2+1; j++)
      cout << "*";
    cout << endl;
  }
}

int main(int argc, char **argv) {
  dessine_etage(3, 2, 0);
  dessine_etage(4, 1, 1);
  dessine_etage(5, 0, 2);
  cout << "   |||" << endl;

  return 0;
}


Retour