Moyenne en langage c [Fermé]

Signaler
Messages postés
7
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
27 octobre 2013
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Bonjour,

Je dois faire un programme qui demande à l'utilisateur un entier, l'affiche, et recommence tant
que l'entier saisi est positif ou nul. Le programme s'arrête dès que l'utilisateur entre un
entier strictement négatif. Et ensuite je dois faire en sorte qu'il calcule et affiche la moyenne des entiers positifs entrés (en ne tenant pas compte du dernier nombre entré).

J'ai fait mon programme mais je ne vois pas d'où vient mon erreur. :/

#include <stdio.h>

int main(){

int a, b, nombre;
float moyenne, compteur = 0.0;

printf("Saisissez un entier. \n");
scanf(" %d", &a);

while ((a >= 0) && (compteur >= 0.0))
{
compteur = compteur + 1;
b = a;
moyenne = a/compteur;
printf("Saisissez un entier. \n");
scanf(" %d", &a);

if ((a > 0) && (compteur == 1.0))
{
compteur = compteur + 1.0;
nombre = b + a;
moyenne = nombre/compteur;
}
else if ((a > 0) && (compteur >= 2.0))
{
compteur = compteur + 1.0;
b = nombre;
nombre = b + a;
moyenne = nombre/compteur;
}
}
printf("La moyenne des positifs entrés est %f. \n", moyenne);

return 0;}

3 réponses

Messages postés
7
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
27 octobre 2013

Je n'ai pas appris à utiliser "double", je dois faire ça seulement avec des "if", "while", "do..while", "for"...
Messages postés
16248
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 février 2021
2 796
Il te faut un compteur c'est évident, d'ailleurs il apparaît dans l'algorithme, c'est "Nb", mais c'est un entier pas un décimal. En fait la partie vraiment calcul de moyenne qui est flottante est tout à la fin, tout le reste c'est des entiers.
Messages postés
7
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
27 octobre 2013

J'ai fais le programme un peu différemment, il fonctionne bien, sauf que lorsque j'entre directement une valeur négative, cela m'affiche "Moyenne = -nan".

Voici le programme que j'ai refais :
#include <stdio.h>

int main(){

int n, nombre, somme;
float compteur = 0;

n = 0;
nombre = 0;

while (n >= 0)
{
printf("Saisissez un entier. \n");
scanf(" %d", &n);

if (n >= 0)
{
nombre = nombre + n;
somme = nombre;
compteur = compteur + 1;
}
}
printf("Moyenne = %f \n", somme/compteur);

return 0;}
Messages postés
16248
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 février 2021
2 796
Si tu entres directement une valeur négative, tu fais donc la moyenne de 0 nombre. Ça n'a aucun sens mathématique, et avec ton code cela revient à faire une division par 0. Tu obtient donc NaN qui signifie "Not an Number", c'est un message d'erreur en soit tout à fait compréhensible.

Remarque :

nombre = nombre + n; 
somme = nombre;

À quoi ça te sert d'avoir deux variables avec la même valeur ?
Messages postés
7
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
27 octobre 2013

Oui, je viens de remarquer, j'ai enlevé "somme".
J'ai résolu le problème.
A la fin de la boucle while , j'ai mis le printf de cette façon :
if (compteur > 0)
{
printf("Moyenne = %f \n", nombre/compteur);
}

Ca marche à merveille !

Merci beaucoup. :)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 740
Effectivement, j'ai écrit en français pour t'obliger à comprendre pour que tu puisses le coder en C :-). Si j'avais écrit l'algorithme en C, t'avais plus qu'à faire copier coller de ma réponse ^^.
Bref, tant mieux si c'est résolu. A bientôt sur CCM :-).
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
928
Ton code est top compliqué, vraissemblablement incorrect.
Ceci suffira à ton bonheur. Il faudrait vérifier la validité des entrées !!!
#include <stdio.h>

void main(void)

{
int cnt=0;
float current=0.0 ,sum=0.0;

while (current >= 0)
{
sum += current;
scanf("%f", ¤t);
if(current >= 0)
cnt++;
}

if ( 0 == cnt)
printf("No valid data entered\n");
else
printf("Moyenne de %d nombres: %f (%f/%d)\n", cnt, sum/cnt, sum, cnt);
}

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 740
jisisv,
Il faut laisser chercher un peu les autres ;-).
J'avais déjà donné l'algorithme...
Sinon, void main(void) => ça n'existe pas en C Standard.
float current; => Pas conforme avec l'énoncé.
Et du coup, il ne faut pas oublier return 0; lorsque tout va bien.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 740
Bonjour,

Je te conseille d'utiliser double à la place de float.

scanf(" %d", &a);
Pas d'espace devant %d.

A quoi sert ton compteur ?? Surtout qu'il est en float.
Ton algorithme est bien trop compliqué.

Grosso modo :

N, Nb, Somme : Entier
Somme : Reel
N<-0
Nb<-0
Somme<-0
TantQue N>=0

Saisir N
Si N>=0
Afficher ...
Nb<- ...
Somme<- ...
FinSi
FinTantQue
Afficher "Moyenne = ", ...

A toi compléter les petits points.