Discussion: Calcul de moyenne

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : mai 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut Calcul de moyenne

    Bonjour à tous,

    je débute complètement en C et je bute depuis des jours sur une erreur qui est sûrement toute bête mais je ne sais plus trop quoi faire. Comme je suis super original je tente de faire un programme pour calculer mes moyennes. Pour l'instant mon programme doit seulement demander le nombre de notes ( ça marche ). Il doit demander ensuite les notes et les afficher et en faire la somme au fur et à mesure. Mais voilà, je n'arrive pas à comprendre pourquoi les 2 résultats affichés sont toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void ) {
    	float *liste_notes=NULL,somme = 0.0;
    	int nb_de_notes = 0, i;
    	printf("Nombre de notes\n");
    	scanf("%d", &nb_de_notes);
    	liste_notes=malloc(nb_de_notes*sizeof(float));
     
    	if(liste_notes == NULL )
    		exit(1);
     
    	for (i=0; i < nb_de_notes; i++)
    {
    		printf("Note? ");
    		scanf("%f",&liste_notes[i]);
    		somme = somme + liste_notes[i];
    		printf("[%f]\n",&liste_notes[i]);
    		printf("%f\n",&somme);
    }
    free(liste_notes);
    }

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    5 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 5 316
    Points : 22 613
    Points
    22 613

    Par défaut

    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("[%f]\n", &liste_notes[i]);
    printf("%f\n", &somme);
    Tu veux afficher un flottant mais passe un pointeur. Retire les & et tu devrais voir apparaître tes valeurs
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    mars 2009
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : mars 2009
    Messages : 498
    Points : 334
    Points
    334
    Billets dans le blog
    3

    Par défaut

    J'ajoute que la réservation d'un vecteur de nb_de_notes de pointeurs sur des flottants ne m'apparaît pas necessaire .
    Pourquoi réserver de l'espace mémoire pour une donnée qui ,une fois utilisée ,disparaît aussitôt ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
            float note,somme = 0.0;
     
     
    	for (i=0; i < nb_de_notes; i++)
    {
    		printf("Note? ");
    		scanf("%f",&note);
    		somme = somme + note;
    		printf("[%f]\n",&note);
    		printf("%f\n",&somme);
    }
    me semble amplement suffisant.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : mai 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Thank you Bousk, it worked !

    @exe2bin: elle ne disparaissait que parce que mon programme n'était pas encore fini. Le voici presque fini:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void ) {
    	float *liste_notes=NULL, somme = 0.0, moyenne=0.0;
    	int nb_de_notes = 0, i;
    	printf("Nombre de notes\n");
    	scanf("%d", &nb_de_notes);
    	liste_notes=malloc(nb_de_notes*sizeof(float));
     
    	if(liste_notes == NULL )
    		exit(1);
     
    	for (i=0; i < nb_de_notes; i++)
    {		
    		printf("Note? ");
    		scanf("%f",&liste_notes[i]);
    		if (liste_notes[i] > 20) 
    			printf("Erreur, note non prise en compte\n");
    		else if (liste_notes[i] < 0) 
    			printf("Erreur, note non prise en compte\n");
    		else 
         		somme = somme + liste_notes[i];
    }
     
    	moyenne = somme / nb_de_notes;
    	printf("moyenne:""%f\n",moyenne);
    	for (i=0; i < nb_de_notes; i++)
    	{printf("%f\n",liste_notes[i]);}
     
    free(liste_notes);
     
    }

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    mai 2016
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2016
    Messages : 217
    Points : 776
    Points
    776

    Par défaut

    Si des notes ne sont pas prises en compte, le calcul de moyenne ne sera pas correct.
    Il faut diviser la somme par le nombre de notes prises en compte, qui peut être inférieur à nb_de_notes.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : mai 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Il suffit de décrémenter i dans les 2 cas d'erreur

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 370
    Points : 17 685
    Points
    17 685
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Freyrlin Voir le message
    Il suffit de décrémenter i dans les 2 cas d'erreur
    Bonjour

    C'est assez mal vu de toucher manuellement à un indice de boucle car 9 fois sur 10 ça provoque un drame (ok, ici c'est le cas d'exception mais vaut mieux éviter de prendre de mauvaises habitudes). Surtout que ta solution se traduit par un décrément puis un incrément en fin de boucle donc au-moins une opération inutile ce qui est toujours choquant.

    Soit tu décides de saisir quoi qu'il arrive "n" notes et tu le fais via un for() en incrémentant en parallèle le nombre de notes valides ; soit tu décides de stocker "n" notes valides et tu le fais via un while() en faisant ressaisir tant que la note est invalide et en incrémentant l'indice en fin de bloc quand la note est valide...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : mai 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Bonjour, voici mon programme que je considère terminé car il fonctionne et fait tout ce que je voulais. Je veux bien l'améliorer pour obtenir un code propre. Je regarde ça donc demain.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void ) {
    	float *liste_notes=NULL, somme = 0.0, moyenne=0.0;
    	int nb_de_notes = 0, i;
    	printf("Nombre de notes\n");
    	scanf("%d", &nb_de_notes);
    	liste_notes=malloc(nb_de_notes*sizeof(float));
     
    	if(liste_notes == NULL )
    		exit(1);
     
    	for (i=0; i < nb_de_notes; i++)
    {		
    		printf("Note? ");
    		scanf("%f",&liste_notes[i]);
    		if (liste_notes[i] > 20) 
    		{
    			printf("Erreur, note non prise en compte\n");
    			i--;
    		}	
    		else if (liste_notes[i] < 0) 
    		{
    			printf("Erreur, note non prise en compte\n");
    			i--;
    		}
    		else 
         		somme = somme + liste_notes[i];
    }
     
    	moyenne = somme / nb_de_notes;
    	printf("moyenne:""%f\n",moyenne);
    	for (i=0; i < nb_de_notes; i++)
    	{printf("%f\n",liste_notes[i]);}
     
    free(liste_notes);
     
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 370
    Points : 17 685
    Points
    17 685
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Freyrlin Voir le message
    Je veux bien l'améliorer pour obtenir un code propre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void ) {
    	float *liste_notes=NULL, somme = 0.0, moyenne=0.0;
    	unsigned short nb_de_notes = 0, i;
     
    	printf("Nombre de notes\n");
    	scanf("%hu", &nb_de_notes);
    	liste_notes=malloc(nb_de_notes*sizeof(float));
     
    	if (liste_notes == NULL )
    		exit(1);
     
    	i=0;
    	while (i < nb_de_notes) {
    		printf("Note %hu ? ", i+1);
    		fflush(stdout);
    		scanf("%f", &liste_notes[i]);
    		if (liste_notes[i] < 0 || liste_notes[i] > 20) {
    			printf("Erreur, note non prise en compte\n");
    			continue;
    		}	
    		somme = somme + liste_notes[i];
    		i++;
    	}
     
    	moyenne = somme / nb_de_notes;
    	printf("moyenne:""%f\n",moyenne);
    	for (i=0; i < nb_de_notes; i++) {
    		printf("%f\n",liste_notes[i]);
    	}
     
    	free(liste_notes);
    }
    Comme tu vois, c'était pas très long de transformer un code "fonctionnel" en code "fonctionnel et propre". Et en plus il est plus court (ce qui est souvent le cas)...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : mai 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Merci pour ce code J'étais parti avec un while dans un autre while pour vérifier d'abord si la note était bien positive puis si elle n'était pas supérieure à 20.

    C'est une précaution ce fflush(stdout)? Car ça compile très bien sans.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 370
    Points : 17 685
    Points
    17 685
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Freyrlin Voir le message
    Merci pour ce code J'étais parti avec un while dans un autre while pour vérifier d'abord si la note était bien positive puis si elle n'était pas supérieure à 20.
    Possible aussi mais bon, quand on peut faire simple... Ca se serait justifié si par exemple il y avait eu une action avant la saisie, action à ne faire qu'une fois quoi qu'il arrive. Mais là, le continue repart en début de boucle donc à la saisie. A noter toutefois que certains profs n'aiment pas cette instruction car elle dénature (selon eux) l'esprit de la boucle (qui est d'effectuer tout ce qui s'y trouve) et confondent malheureusement purisme et puritanisme. Pour moi, un bon break/continue bien placés évitent bien des complications.

    Citation Envoyé par Freyrlin Voir le message
    C'est une précaution ce fflush(stdout)? Car ça compile très bien sans.
    L'absence ou la présence d'une instruction n'empêchera jamais le code de compiler. Mais sa présence génèrera une action en plus.

    Quand tu écris un truc dans un flux de sortie (fichier, écran), ce que tu écris est bufferisé. Il n'est réellement écrit que dans 5 cas
    1. quand le buffer est plein
    2. quand le processus écrivain rencontre un caractère '\n'
    3. quand le processus se termine
    4. quand on ferme le flux (fclose)
    5. quand on le demande explicitement via fflush


    Ici aucun des 4 premiers cas n'étant présent, j'ai activé le 5°. Ca permet à ta question de s'afficher immédiatement à l'écran (sinon elle ne s'affiche pas forcément au moment où tu le voudrais). Tu remarqueras par exemple que je ne l'ai pas mis au premier printf car là, il y avait un '\n'.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E] problème de calcul de moyenne
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/04/2006, 17h13
  2. [Oracle] Calcul de moyenne par module
    Par naazih dans le forum Langage SQL
    Réponses: 14
    Dernier message: 27/04/2006, 14h38
  3. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  4. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo