Choisissez votre style : colorisé, impression

Série 7  (Niveau 0):
Tableaux

Exercice 0 : Manipulation d'un tableau dynamique

Cet exercice est similaire à celui donné en page 39 de l'ouvrage C++ par la pratique

Nous allons dans cet exemple écrire un programme permettant à l'utilisateur de calculer la moyenne de classe ainsi que les écarts à la moyenne du futur test du cours d'informatique.

Vu le nombre d'étudiants suivant le cours, il est impossible de stocker la note de chaque étudiant dans une variable distincte, et nous avons donc besoin d'un tableau.

Comme on ne connait pas a priori le nombre d'étudiants (i.e. ce nombre n'est pas connu au moment où l'on écrit le programme, et pourrait même varier d'une exécution du programme à une autre), on envisage l'utilisation de tableaux dynamiques (vector).

L'ébauche du programme est alors la suivante :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  // déclare un tableau (dynamique) pouvant contenir
  // autant de notes que d'étudiants
  vector<double> notes;

  return 0;
}

Maintenant que notre tableau est déclaré, nous pouvons le remplir en demandant à l'utilisateur la note de chaque étudiant. On va donc utiliser une boucle.

Puisque le nombre d'itérations (= nombre d'étudiants) n'est pas connu a priori, on pourrait soit le demander, soit utiliser une convention pour indiquer la fin, par exemple une note négative. Utilisons cette seconde façon de procéder.

On en profite aussi pour calculer la somme des notes servant au calcul de la moyenne, au fur et à mesure qu'on les reçoit. Ce qui donne :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  // déclare un tableau (dynamique) pouvant contenir
  // autant de notes que d'étudiants
  vector<double> notes;
  double moyenne(0.0);

  // lecture des notes
  double note_lue(-1.0);
  do
  {
    cout << " Note etudiant " << notes.size()+1 << " (<0 pour finir) : ";
    cin >> note_lue;
    if (note_lue >= 0.0) {
       // stocke la note du ième étudiant dans la ième case du tableau
       notes.push_back(note_lue); 

       // maintient la somme à jour
       moyenne = moyenne + note_lue;
    }
  } while (note_lue >= 0.0);

  return 0;
}

Il est maintenant possible de calculer la moyenne de classe, et d'afficher l'écart à la moyenne pour chaque étudiant.

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  // déclare un tableau (dynamique) pouvant contenir
  // autant de notes que d'étudiants
  vector<double> notes;
  double moyenne(0.0);

  // lecture des notes
  double note_lue(-1.0);
  do
  {
    cout << " Note etudiant " << notes.size()+1 << " (<0 pour finir) : ";
    cin >> note_lue;
    if (note_lue >= 0.0) {
       // stocke la note du ième étudiant dans la ième case du tableau
       notes.push_back(note_lue); 

       // maintient la somme à jour
       moyenne = moyenne + note_lue;
    }
  } while (note_lue >= 0.0);

  moyenne = moyenne / notes.size();
  
  // affichage des résultats
  cout << "Moyenne de classe : " << moyenne << endl;
  cout << " Etudiant : note (ecart a la moyenne)" << endl; 
  for (size_t i(0); i < notes.size(); ++i)
  {
    cout << "  " << i+1 << " : " << notes[i] << " ("
         << (notes[i] - moyenne) << ")" << endl;
  }

  return 0;
}

Exemple d'exécution du programme :

 Note etudiant 1 (<0 pour finir) : 4
 Note etudiant 2 (<0 pour finir) : 4
 Note etudiant 3 (<0 pour finir) : 5
 Note etudiant 4 (<0 pour finir) : 6
 Note etudiant 5 (<0 pour finir) : -2
Moyenne de classe : 4.75
 Etudiant : note (ecart a la moyenne)
  1 : 4 (-0.75)
  2 : 4 (-0.75)
  3 : 5 (0.25)
  4 : 6 (1.25)

Complément C++11 : depuis la nouvelle norme 2011, on peut utiliser une autre sorte d'itération, et remplacer

for (size_t i(0); i < notes.size(); ++i)
  {
    cout << "  " << i+1 << " : " << notes[i] << " ("
         << (notes[i] - moyenne) << ")" << endl;
  }

par

 int i(1);
  for (auto note : notes)
  {
    cout << "  " << i << " : " << note << " ("
         << (notes - moyenne) << ")" << endl;
    i = i + 1;
  }

mais l'intérêt est ici limité vu que l'on a besoin du numéro i. Cette sorte d'itération prend tout son sens lorsque que l'on veut parcourir le tableau sans avoir besoin explicitement des numéros de positions (i.e. des index).


Retour à la série
Dernière mise à jour : $Date: 2017/10/27 17:35:03 $ ($Revision: 1.7 $)