Informations

Auteur(s) Berg Lucas
Date limite Pas de date limite
Limite de soumission Pas de limite

Se connecter

[4.2] Moyenne et invariant

Vous allez écrire un programme qui calcule la moyenne des nombres positifs entrés par l'utilisateur. Pour ce faire, remplacez les TODO du programme ci-dessous et suivez les instructions suivantes:

Dans ce programme, nous aurons besoin de trois variable: sum, number_of_numbers et nbr (le dernier nombre entré par l'utilisateur).

L'invariant doit donc porter sur ces trois variables.

Une façon de déterminer l'invariant d'une boucle est de se dire: "à chaque moment, qu'est-ce que j'ai déjà calculé et qu'est-ce qu'il me reste à calculer ?"

Ici, par exemple, à chaque moment j'ai déjà calculé:

  • la somme des nombres positifs déjà entrés par l'utilisateur
  • le nombre de nombres positifs déjà entrés par l'utilisateur

Ce qu'il me reste à calculer c'est:

  • la somme des nombres positifs que l'utilisateur n'a pas encore entrés
  • le nombre de nombre positifs que l'utilisateur va entrer

Ici, l'invariant peut être déduit facilement de "ce que j'ai déjà calculé".

Concernant sum, on peut dire que, juste avant la boucle, après la dernière instruction de la boucle (à chaque itération) et juste après la boucle, la variable sum contient la somme des nombres positifs que l'utilisateur a entrés. Quel impact cela va avoir sur la valeur initiale donnée à sum ?

Concernant number_of_numbers, on peut dire que juste avant la boucle, après la dernière instruction de la boucle (à chaque itération) et juste après la boucle, la variable n contient le nombre de nombres positifs que l'utilisateur a entrés. Quel impact cela va avoir sur la valeur initiale donnée à number_of_numbers ?

Concernant nbr, on peut dire que parmi toutes les valeurs successives qu'il prendra, il y en aura exactement une qui est négative. Et c'est la dernière.

La partie en gras, c'est notre invariant. On va faire en sorte de le respecter.

  1. Initialisation des variables: Vous avez correctement initialisé number_of_numbers et sum pour que ça respecte l'invariant. nbr est sensé contenir le dernier nombre entré par l'utilisateur. L'utilisateur n'en a pas encore entré mais, a priori, si on met 0 comme valeur initiale c'est ok car c'est neutre pour l'addition.
  2. Condition d'itération de la boucle: La boucle continue tant que le nombre entré par l'utilisateur est positif.
  3. Corps de la boucle: On peut d'abord récupérer un nombre que l'utilisateur entre. Ensuite, s'il est positif (voir invariant), on incrémente number_of_numbers et on ajoute ce nombre à sum`.
  4. Clôture: Une fois que la boucle est finie, sum contient bien la somme des nombres positifs entrés par l'utilisateur et number_of_numbers le nombre de nombres. Pour calculer la moyenne, il suffit de diviser l'un par l'autre. Attention ! Ça doit être une division réelle, et pas entière. Vérifiez bien les types des opérandes !

Exemple

Par exemple, si l'utilisateur indique 3, 4, 2, et -1, le programme devrait afficher:

3
4
2
-1
La moyenne des nombres entrés est : 3.00

Autoévaluation

Une fois votre programme écrit, vérifiez et corrigez les points suivants:

  • Chaque instruction se termine-t-elle bien par un point virgule ?
  • La séquence d'instruction après l'accolade ouvrante est-elle alignée mais légèrement décalée vers la droite par rapport à "main" ?
  • Chaque variable est-elle déclarée ? C'est-à-dire, avez vous déterminé le type de chacune de vos variables ?
  • Avez-vous utilisé la fonction de lecture qui correspond au type de la variable dont vous voulez obtenir la valeur ? Par exemple, si vous voulez obtenir un int, avez-vous bien utilisé "scanf("%d", &votre_variable)" ?

Une fois votre programme corrigé, exécutez-le ! Si tout semble correct, postez votre réponse sur Webcampus !


Le code