J'ai quand même fait du progrès en C

Résolu/Fermé
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011 - 6 nov. 2009 à 01:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 9 nov. 2009 à 22:06
Bonjour, Programme qui a pour but de saisir la note de 8 juges et de calculer la note moyenne du juge et de recommancer avec un autre patineur au besoin. Il faut connaitre la plus faible et la plus haute note donné par les juges pour lasuite du programme, mais la j'ai un problème avec ma moyenne et les note max et min.
#include <stdio.h>

#define FAUX 0 /* Constante booléenne FAUX en C. */
#define VRAI !FAUX /* Constante booléenne VRAI en C. */

#define NB_NOTES 8 /* Nombre de notes à traiter. */
#define NOTE_MIN 0 /* Note minimale. */
#define NOTE_MAX 10 /* Note maximale. */

main()
{
float moyenne,SomMoyenne,moyPlus,moyFaible;
int tab_notes [8];
float notes;
char reponse;
int nbPat,i;
float somme;
nbPat=0;

int non_valide; /* Utilisee comme un booleen. */

/* Initialisation du tableau. */

printf( "Lecture de %d du juge\n\n\n", NB_NOTES );

for ( i = 0; i < NB_NOTES; i++ ) {



do{ printf( "Entrez la note du juge #%d : ", i + 1 );
fflush( stdin );
scanf( "%d", &tab_notes[ i ] );
non_valide = tab_notes[ i ] < NOTE_MIN || tab_notes[ i ] > NOTE_MAX;
if ( non_valide ) {
printf( "Erreur, note invalide\n\n" );
}
} while ( non_valide );
}

/* Afficher le tableau. */


/*
for ( i = 0; i < NB_NOTES; ++i ) {
printf( "note du juge #%d : %6.2f\n", i + 1, tab_notes[ i ] );*/

/*Calcul de la somme*/
somme=0;
for(i=0;i<NOTE_MAX;i++)
somme+=tab_notes[i];
fflush(stdin);


printf("La note moyenne : %6.2f \n", somme /6);
printf("La note la plus grande : %6.2f \n", NOTE_MAX);
printf("La notela plus petite : %6.2f \n", NOTE_MIN);

printf("\n\n");

printf("\nVoulez-vous continuer ? (o/n) ");
fflush(stdin);
/*reponse = toupper ( getchar() );*/

/*while (reponse == 'O');
if (reponse=='O');*/
nbPat++;
printf("On a traite %d patineurs\n", nbPat);
while (reponse == 'O');
if (reponse=='O');
getch();

}
Exemple de resultat lors de l'exxecution, saver vous le probleme que j'ai avec nes moyenne et note max et Min. MerciLecture de 8 du juge


Entrez la note du juge #1 : 2.6
Entrez la note du juge #2 : 2.6
Entrez la note du juge #3 : 2.8
Entrez la note du juge #4 : 2.6
Entrez la note du juge #5 : 2.5
Entrez la note du juge #6 : 2.4
Entrez la note du juge #7 : 2.8
Entrez la note du juge #8 : 2.9
La note moyenne : 682987733.33(????)
La note la plus grande : 682987520.00 ?
La notela plus petite : 682987520.00 ?
Merci



Voulez-vous continuer ? (o/n) On a traite 1 patineurs
A voir également:

10 réponses

zavenger Messages postés 811 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012 161
6 nov. 2009 à 13:57
Bonjour,

2 ou 3 trucs a corriger:

...
float tab_notes [NB_NOTES];
...
scanf( "%f", &tab_notes[ i ] );
...
somme=0;
NotePlusBasse=10;
NotePlusHaute=0;
for(i=0;i<NB_NOTES;i++)
somme+=tab_notes[i];
fflush(stdin);
if (notes[i]>NotePlusHaute)
NotePlusHaute=notes[i];
if (notes[i]<NotePlusBasse)
NotePlusBasse= notes[i]
somme-=NotePlusHaute
somme-=NotePlusBasse
...
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
6 nov. 2009 à 08:22
Salut.
déjà ta moyenne c'est n'importe quoi, et tu as de la chance de ne pas avoir une erreur de segmentation.
Pour l'affichage, c'est normal, tu lui demande d'afficher des float et tu lui fourni de entier.
somme/6 donne un entier il me semble, car "6" est un entier. Pour avoir un réel il faut faire "somme/6.0"
Que signifie NOTE_MIN et NOTE_MAX, les notes extrémales mises ou possibles ? Dans un cas c'est bon dans l'autre c'est n'importe quoi.
0
blackdam Messages postés 327 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 13 février 2015 35
6 nov. 2009 à 08:26
Bonjour,
ton problème c'est qu'a aucun moment tu calcules ta note min ou ta note max...
il existe plusieurs moyens de calculer un nombre min et un nombre max dans une liste, google est ton ami :)

Par exemple la fonction min() ou max() avec un #define(math.h) si je me souviens bien qui va sortir le minimum ou le maximum entre 2 nombres...
ou alors cherche "tri par selection en C" sur google, tu trouveras des moyens de trier ta liste, il ne te restera plus qu'a afficher le 1er et le dernier nombre de ta liste.

0
cycloop Messages postés 69 Date d'inscription mercredi 22 octobre 2008 Statut Membre Dernière intervention 8 avril 2013 16
6 nov. 2009 à 10:01
Bonjour,

Voici une erreur qui pourrait expliquer certains problèmes : tab_notes est un tableau d'int dans lequel tu mets des float (2.6 n'es pas un int ;) )

voilà une bonne piste :
int i , note_juge_min = NOTE_MAX , note_juge_max = NOTE_MIN; 
float tab_notes[8];
float moyenne;

[... remplissage tableau ...]

for(i=0;i<8:i++) {
    moyenne+=tab[i];
    if (tab_notes[i]<note_juge_min) note_juge_min = tab_notes[i];
    if (tab_notes[i]>note_juge_max) note_juge_max = tab_notes[i];
}
moyenne=moyenne/8;


je mets la note min au max pour être sûr que les notes de juge soit inf; de même pr la note max.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011
6 nov. 2009 à 13:33
//Programme qui prends les notes de 8 juges pour un patineur
//On élimine la plus faible et la plus forte note
//On calcule la moyenne et on recommence pour un autre patineur autant de fois
//qu'on le désir. Après il faut pouvoir compter le nombre de patineur
//Determiner le meilleur et le plus mauvais patineur.
//Programme par C.

#include <stdio.h>

#define FAUX 0 /* Constante booléenne FAUX en C. */
#define VRAI !FAUX /* Constante booléenne VRAI en C. */

#define NB_NOTES 8 /* Nombre de notes à traiter. */
#define NOTE_MIN 0 /* Note minimale. */
#define NOTE_MAX 10 /* Note maximale. */

main()
{
float moyenne,SomMoyenne,moyPlus,moyFaible;
float tab_notes [notes];
float NotePlusBasse=10;
float NotePlusHaute=0;
float notes;
char reponse;
int nbPat,i;
float somme;
nbPat=0;

int non_valide; /* Utilisee comme un booleen. */

/* Initialisation du tableau. */

printf( "Lecture de %d du juge\n\n\n", NB_NOTES );

for ( i = 0; i < NB_NOTES; i++ ) {



do{ printf( "Entrez la note du juge #%d : ", i + 1 );
fflush( stdin );
scanf( "%d", &tab_notes[ i ] );
non_valide = tab_notes[ i ] < NOTE_MIN || tab_notes[ i ] > NOTE_MAX;
if ( non_valide ) {
printf( "Erreur, note invalide\n\n" );
}
} while ( non_valide );
}

/* Afficher le tableau. */




/*for ( i = 0; i < NB_NOTES; ++i ) {
printf( "note du juge #%d : %6.2f\n", i + 1, tab_notes[ i ] );

/*Calcul de la somme*/



/* somme=0;
for(i=0;i<NOTE_MAX;i++)
somme+=tab_notes[i];
fflush(stdin);
if (notes[i]>NotePlusHaute)
NotePlusHaute=notes[i];
if (notes[i]<NotePlusBasse)
NotePlusBasse= notes[i]*/



printf("La note moyenne : %6.2f \n", somme/6.0 );
printf("La note la plus grande : %6.2f \n", NotePlusHaute);
printf("La notela plus petite : %6.2f \n", NotePlusBasse);

printf("\n\n");

printf("\nVoulez-vous continuer ? (o/n) ");
fflush(stdin);
/*reponse = toupper ( getchar() );*/

/*while (reponse == 'O');
if (reponse=='O');*/
nbPat++;
printf("On a traite %d patineurs\n", nbPat);
while (reponse == 'O');
if (reponse=='O');
getch();

}

/* Lecture de 8 du juge


Entrez la note du juge #1 : 2.6
Entrez la note du juge #2 : 2.5
Entrez la note du juge #3 : 2.6
Entrez la note du juge #4 : 2.6
Entrez la note du juge #5 : 2.8
Entrez la note du juge #6 : 2.9
Entrez la note du juge #7 : 2.4
Entrez la note du juge #8 : 2.5
La note moyenne : 1300519146211295500000000000000000.00
La note la plus grande : 0.00
La notela plus petite : 10.00



Voulez-vous continuer ? (o/n) On a traite 1 patineurs*/
J'ai mis cela/* somme=0;
for(i=0;i<NOTE_MAX;i++)
somme+=tab_notes[i];
fflush(stdin);
if (notes[i]>NotePlusHaute)
NotePlusHaute=notes[i];
if (notes[i]<NotePlusBasse)
NotePlusBasse= notes[i]*/,car j'avais des problème de compilation.
MON PROBLEME MAJEUR EST QUE LORSQUE JE FAIT APPELER UNE NOTE PAR EX [2], j'obtiens 0.0. comme si les note que j'avais enregister au debut du programme n'avaient pas été saisie dans les 8 case sdu tableau
MERCI!
0
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011
8 nov. 2009 à 12:52
////////////////////////////////////////////////////////////////////////////////
//Programme qui prends les notes de 8 juges pour un patineur /
//On élimine la plus faible et la plus forte note /
//On calcule la moyenne et on recommence pour un autre patineur autant de fois /
//qu'on le désir. Après il faut pouvoir compter le nombre de patineur /
//Determiner le meilleur et le plus mauvais patineur. /
//Programme par C /
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#define FAUX 0 /* Constante booléenne FAUX en C. */
#define VRAI !FAUX /* Constante booléenne VRAI en C. */

#define NB_NOTES 8 /* Nombre de notes à traiter. */
#define NOTE_MIN 0 /* Note minimale. */
#define NOTE_MAX 10 /* Note maximale. */

int main()
{
float Moyenne,SomMoyenne,MoyPlus,MoyFaible;
float tab_notes [NB_NOTES];
float NotePlusBasse=10;
float NotePlusHaute=0;
float notes;
char reponse;
int nbPat,i;// nombre de patineur traité(s).
float somme;//somme des notes des juges pour un patineur.
nbPat=0;
int non_valide; /* Utilisee comme un booleen. */

/* Initialisation du tableau. */

printf( "Lecture de %d du juge\n\n\n", NB_NOTES );

for ( i = 0; i < NB_NOTES; i++ ) {



do{ printf( "Entrez la note du juge #%d : ", i + 1 );
fflush( stdin );
scanf( "%f", &tab_notes[ i ] );
non_valide = tab_notes[ i ] < NOTE_MIN || tab_notes[ i ] > NOTE_MAX;
if ( non_valide ) {
printf( "Erreur, note invalide\n\n" );
}
} while ( non_valide );
}

/* Afficher le tableau. */




/*for ( i = 0; i < NB_NOTES; ++i ) {
printf( "note du juge #%d : %6.2f\n", i + 1, tab_notes[ i ] );

/*Calcul de la somme*/

somme=0;
for(i=0;i<NB_NOTES;i++)
somme+=tab_notes[i];
fflush(stdin);
/*if (notes[i]>NotePlusHaute)
NotePlusHaute=notes[i];
if (Notes[i]<NotePlusBasse)
NotePlusBasse= notes[i];
somme-=NotePlusHaute;
somme-=NotePlusBasse;
fflush(stdin);*/



printf("La note moyenne est : %6.2f \n", somme/8.0 );
/*printf("La note la plus grande : %6.2f \n", NotePlusHaute);
printf("La notela plus petite : %6.2f \n", NotePlusBasse);*/

printf("\n\n");

printf("\nVoulez-vous continuer ? (o/n) ");
fflush(stdin);
/*reponse = toupper ( getchar() );

/*while (reponse == 'O');
if (reponse=='O');*/
nbPat++;
printf("On a traite %d patineurs\n", nbPat);
while (reponse == 'O');
if (reponse=='O');
getch();



return 0;
}
F:\NUMERO_C_01.c In function `main':

65 F:\NUMERO_C_01.c subscripted value is neither array nor pointer



66 F:\NUMERO_C_01.c subscripted value is neither array nor pointer 67 F:\NUMERO_C_01.c `Notes' undeclared (first use in this function)

68 F:\NUMERO_C_01.c subscripted value is neither array nor pointer
Cela apparait comme resultat si j'enlève les ces lignes, j'ai essayé plusieurs version, mais je n'y arrive pas j'ai toujours ces message du compilateur

Lecture de 8 du juge


Entrez la note du juge #1 : 4.8
Entrez la note du juge #2 : 4
Entrez la note du juge #3 : 5
Entrez la note du juge #4 : 4.6
Entrez la note du juge #5 : 4
Entrez la note du juge #6 : 4.7
Entrez la note du juge #7 : 4.8
Entrez la note du juge #8 : 4.9
La note moyenne est : 4.60



Voulez-vous continuer ? (o/n) On a traite 1 patineurs
Merci encore, j epense qu'qpres cela je seraite en mesure de complété ce programme. MERCI BEAUCOUP
0
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011
9 nov. 2009 à 02:26
A vrai dire je plus préoccupé par des problème de logique, car le programme fonctionne si je place les accolades ou elles sont, mais il n'y a pas de retour de la boucle pour recommencer mon programme si quelqu'un peut me donner sont avis sur cela se serait apprécier. Peut-etre etes vous tanner de voir ce programme, mais je suis nouveau dans la programmation et je pense pas trouver une reponse mis a part ici
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
9 nov. 2009 à 03:08
non non pas de problème, ce forum est comme tu le dis exactement fais pour ça. Tu présentes bien tes essais, ce n'est pas comme d'autres qui mettent juste un énoncé d'exercice qu'ils ont en cours et marquent "donné la rep svp vite vite depechez vous".

Par contre ça aiderait tout le monde à t'aider si tu mettais les balises "code" autour de ton code, comme ça ça gardera les espaces d'indentation (j'espère que tu en as mis!)et ton programme sera beaucoup plus lisible. C'est le bouton à droite de gras italique, souligné.
0
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011
9 nov. 2009 à 05:39
////////////////////////////////////////////////////////////////////////////////
//Programme qui prends les notes de 8 juges pour un patineur /
//On élimine la plus faible et la plus forte note /
//On calcule la moyenne et on recommence pour un autre patineur autant de fois /
//qu'on le désir. Après il faut pouvoir compter le nombre de patineur /
//Determiner le meilleur et le plus mauvais patineur. /
//Programme de Claude Bisson BISC05036104 pour M. Pierre Trochu pour le 17/11/09 /
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#define FAUX 0 /* Constante booléenne FAUX en C. */
#define VRAI !FAUX /* Constante booléenne VRAI en C. */

#define NB_NOTES 8 /* Nombre de notes à traiter. */
#define NOTE_MIN 0 /* Note minimale. */
#define NOTE_MAX 10 /* Note maximale. */

int main()
{
   float Moyenne,SomMoyenne,MoyPlus,MoyFaible;

float  tab_notes [NB_NOTES];
     <code>
float NotePlusBasse=10;
   float NotePlusHaute=0; 

  char reponse;

  int nbPat,i;// nombre de patineur traité(s)et i pour la bouble for.

  float somme;//somme des notes des juges pour un patineur.

 nbPat=0;

 int non_valide;  /*  Utilisee comme un booleen.  */</code>   /*  Initialisation du tableau.  */


 printf( "Lecture de %d du juge\n\n\n", NB_NOTES );


 for ( i = 0; i < NB_NOTES; i++ ) {




 do{  printf( "Entrez la note du juge #%d : ", i + 1 );

 fflush( stdin );

   scanf( "%f", &tab_notes[ i ] );

non_valide = tab_notes[ i ] < NOTE_MIN || tab_notes[ i ] > NOTE_MAX;

   if ( non_valide ) {

 printf( "Erreur, note invalide\n\n" );

  }

    } while ( non_valide );          


}
/* Afficher le tableau. */




 /*for ( i = 0; i < NB_NOTES; ++i ) {

    printf( "note du juge #%d : %6.2f\n", i + 1, tab_notes[ i ] );


/*Calcul de la somme*/

somme=0;

  for(i=0;i<NB_NOTES;i++)

somme+=tab_notes[i];


 /*if (notes[i]>NotePlusHaute)

  NotePlusHaute=notes[i];

  if (notes[i]<NotePlusBasse)

NotePlusBasse= notes[i];*/

   somme-=NotePlusHaute;

    somme-=NotePlusBasse;





 printf("La note moyenne est       : %6.2f \n", somme/6.0 );

   /*printf("La note la plus grande : %6.2f \n", NotePlusHaute);

 printf("La notela plus petite : %6.2f \n", NotePlusBasse);*/


printf("\n\n");


printf("\nVoulez-vous continuer ? (o/n) ");

fflush(stdin);

/*reponse = toupper ( getchar() );


/*while (reponse == 'O');

if (reponse=='O');*/
    nbPat++;

 printf("On a traite %d patineurs\n", nbPat);

while (reponse == 'O');

 if (reponse=='O');

  getch();




return 0;
}

Pet-etre que c'est plus facile a lire comme ca
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 nov. 2009 à 09:54
non, pas plus. Les balises codes, c'est l'idéal, ça ne demande qu'un clic.
0
Moustiquet Messages postés 212 Date d'inscription samedi 3 octobre 2009 Statut Membre Dernière intervention 27 juin 2011
9 nov. 2009 à 11:29
comment je clik sur balise code si je veux que le tabulation de ce texte entre quillemet soit 2 cm a droite
"cherche une reponse"
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 nov. 2009 à 11:34
2 solutions :
- tu tape ton texte avec indentation, tu sélectionnes ce que tu as taper avec la souris, tu clic sur le bouton;
- Tu cliques sur le bouton, les balises apparaissent et tu tape ton texte à l'intérieur, entre <code > et </code>
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
9 nov. 2009 à 21:33
dans ton code il faut faire des espacement pour bien voir les "niveaux d'encapsulation" des blocs.

Ex :
Avec balise code (et des espaces):
#include <stdio.h>

//Ceci est mon programme
int main() {
  int a, b;
  char nom[35];

  printf("Bienvenue!");
  a=5;
  b=10;

  if (a<b) {
    printf("a est plus grand que b");
  } 
  else {
    printf("Blabla");
    if (a==b) {
      return 0;
    }
    else {
      printf("jsrjfew");
      //fin du bloc if imbriqué
    }

    //fin du bloc if principal
  }

  //fin de la fonction main
}


sans balise code (mais quand même avec des espaces):
#include <stdio.h>

//Ceci est mon programme
int main() {
int a, b;
char nom[35];

printf("Bienvenue!");
a=5;
b=10;

if (a<b) {
printf("a est plus grand que b");
}
else {
printf("Blabla");
if (a==b) {
return 0;
}
else {
printf("jsrjfew");
//fin du bloc if imbriqué
}

//fin du bloc if principal
}

//fin de la fonction main
}




comme cela, c'est bien plus clair pour savoir à quel if ou à quelle boucle tes accolades se réfèrent.

Le problème avec le forum ici c'est que si tu fais copier coller de ton code avec des espaces, les espaces ne sont pas affichés. En utilisant la balise code ils restent bien à l'écran. Dans mon exemple j'avais mis deux espaces pour chaque niveau d'indentation.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 nov. 2009 à 22:06
Je rajouterai à ton code qu'il ne faut pas mettre "fflush(stdin);" ça marche pas ;-))).
Sinon, tu n'as pas besoin de t'embêter à redéfinir FAUX etc. Le type booléen existe en C iso 99. Et si tu me dis que t'es en C ansi, je te répondrai que dans ce cas tu n'as pas le droit d'utiliser les commentaires // ;-))).

Et un dernier conseil, oublie les float. Dans la plupart des cas, le double est conseillé (à part pour le système embarqué où l'espace est critique).

Cdlt
0