IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Calcul de moyenne


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 4
    Points
    4
    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
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    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
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 4
    Points
    4
    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 éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    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 : 313
    Points : 1 237
    Points
    1 237
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 4
    Points
    4
    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
    12 684
    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 : 12 684
    Points : 30 973
    Points
    30 973
    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 «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 4
    Points
    4
    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
    12 684
    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 : 12 684
    Points : 30 973
    Points
    30 973
    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 «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 4
    Points
    4
    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
    12 684
    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 : 12 684
    Points : 30 973
    Points
    30 973
    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 «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

+ 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