Tableau avec nom étudiant et moyenne !

Résolu
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - Modifié par TheRogerFederer le 7/10/2015 à 11:43
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - 27 nov. 2015 à 09:07
Bonjour, je reviens vers vous, car cela faisait un petit moment ! Voici l'énoncé de mon problème :

"Saisir les noms des étudiants et, pour chaque étudiant, sa moyenne. Afficher les noms
des étudiants qui sont au dessus de la moyenne de la classe. Il n'y a pas plus de 40
étudiants et on arrêtera la saisie en posant la question à l'utilisateur."

l'algo qui était attendue suite a mes essais était le suivant :

programme moyennesup
s_etudiants : structure
nom : chaine
moy : réel
finstructure
t_etudiant[1..40] : s_etudiant
moyenne : réel
rep : caractere
nb, k : entier
debut
nb <- 0 // compteur d'étudiants
moyenne <- 0 // cumul des moyennes
//--- saisie des informations ---
repeter
nb <- nb + 1
afficher "nom de l'étudiant = "
saisir t_etudiant[nb].nom
afficher "moyenne de l'étudiant = "
saisir t_etudiant[nb].moy
moyenne <- moyenne + t_etudiant[nb].moy
afficher "voulez-vous continuer ? (O/N) "
saisir rep
jusqu'à rep = "N" ou nb = 40
//--- calcul de la moyenne ---
moyenne <- moyenne / nb
//--- affichage des étudiants au dessus de la moyenne ---
pour k de 1 à nb
si t_etudiant[k].moy > moyenne alors
afficher t_etudiant[k].nom
finsi
finpour
fin


et j'ai codé cela :
#include <stdio.h>
#include <conio.h>
#include <string>

// -- Programme Principal --
void clear (void) {
 while (getchar () != '\n') ;
}

int main() 
{
 // -- Déclarations --
 struct s_etudiants {
  const char nom ;
  double moyenne ;
 };
 char rep = 'n' ;
 double moyenne = 0 ; // Cumul des moyennes
 int nbre = 0 ; // Compteurs d'étudiants
 int k ;
 t_etudiant[40] = s_etudiants ;
 
 // -- Saisie des informations --
 do 
 {
  printf(" Nom de l'\x85tudiant = ") ;
  scanf("%c",&t_etudiant[nbre].nom) ;
  printf(" Moyenne de l'\x85tudiant = %lf ", moyenne) ;
  scanf("%lf",&t_etudiant[nbre].moyenne) ;
  moyenne = moyenne + t_etudiant[nbre].moyenne ;
  printf(" Voulez-vous continuez ? (O/n) ") ;
  clear () ;
  scanf("%c",&rep) ;
  nbre ++ ;
 }
 
 while(rep == 'n' || nbre = 40) ;
  // -- Calcul de la moyenne --
  moyenne = (moyenne / nbre) ;
 
 // -- Affichage des étudiants au dessus de la moyenne --
 for (k = 1; k <= nbre; nbre++) 
 {
  if (t_etudiant[k].moyenne > moyenne) 
  {
   printf(" Afficher t_\x85tudiant = ", t_etudiant) ;
  }
 }
 
getch() ;
return 0 ;

}

j'ai dessus 3 erreurs en supposant biensure que le programme fasse bien ce qui est attendu :

lvalue required as left operand of assignment - line 44

expected primary-expression before ';' token - line 28

't_etudiant' was not declared in this scope - line 28

J'en avais bcp plus a la base, j'espère en avoir résolu certaine sans modifier le but final biensure !
A voir également:

35 réponses

TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
Modifié par TheRogerFederer le 5/11/2015 à 11:43
Non effectivement si on veut continuer il faut appuyer sur 'O', et ensuite nous on veut que sa boucle que jusqu'à tant que rep =='O' ou nbre == 39 ?
Donc en faite il faudrait que nbre ne dépasse pas 39 plutot non ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 nov. 2015 à 11:51
si on veut continuer il faut appuyer sur 'O'

Oui c'est déjà mieux.

Il faudrait que nbre ne dépasse pas 39 plutot non ?

Beaucoup mieux aussi.

on veut que sa boucle que jusqu'à tant que rep =='O' ou nbre == 39

Pense bien à tous les cas. Imaginons que tu dises: tant que rep == 'O' ou nbre <= 39. Que se passera-t-il si je met 'O' tout le temps ? Que se passera-t-il si je met 'n', et que l'on est au premier tour de boucle ?
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
Modifié par TheRogerFederer le 5/11/2015 à 12:06
Eh bien si tu met oui tout le temps ca va boucler indéfiniment ??
J'ai essayé de mettre rep == 'O' ou nbre <= 39 et quand je fais cela, il boucle sans arrêt, et cela que je réponde 'O' ou 'n'........................... !
Même si je met 'n' au premier tour de boucle, il continue a m'afficher : nom de l'étudiant, moyenne de l'étudiant, voulez-vous continuez etc......................
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 5/11/2015 à 12:10
Tu dis: si cette condition "rep == 'O'" OU BIEN si cette condition "nbre <= 39" est vrai, alors boucler.
Si l'une des deux conditions est vrai, ça suffit pour boucler.

Ne vois-tu pas là, une erreur de logique ?


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0

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

Posez votre question
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
Modifié par TheRogerFederer le 5/11/2015 à 12:18
Ahhhhhhh ouiiiiii, ca veut dire que si on repond 'n' mais que nbre <=39 ca continue de boucler quand même alors que ce ne devrait pas et inversement........................................On devrait utiliser un ou exclusif plutot qu'un ou inclusif ??
regarde l'algo qui m'a été fourni :

s_etudiants : structure
nom : chaine
moy : réel
finstructure
t_etudiant[1..40] : s_etudiant
moyenne : réel
rep : caractere
nb, k : entier
debut
nb <- 0 // compteur d'étudiants
moyenne <- 0 // cumul des moyennes
//--- saisie des informations ---
repeter
nb <- nb + 1
afficher "nom de l'étudiant = "
saisir t_etudiant[nb].nom
afficher "moyenne de l'étudiant = "
saisir t_etudiant[nb].moy
moyenne <- moyenne + t_etudiant[nb].moy
afficher "voulez-vous continuer ? (O/N) "
saisir rep
jusqu'à rep = "N" ou nb = 40
//--- calcul de la moyenne ---
moyenne <- moyenne / nb
//--- affichage des étudiants au dessus de la moyenne ---
pour k de 1 à nb
si t_etudiant[k].moy > moyenne alors
afficher t_etudiant[k].nom
finsi
finpour
fin
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 nov. 2015 à 13:43
Ne pas confondre "jusqu'à" et "tant que". En C, on ne peut pas dire "jusqu'à", on a juste "tant que" (while).

Pour la logique, un ou exclusif ou inclusif ne change pas grand chose (très peu). Je t'invite à réaliser la moitié (environ) de ce cours:
https://openclassrooms.com/courses/l-algebre-de-boole

Si tu transcris littérallement le code donné, ça ne fonctionnera jamais. il faut l'adapter.
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
Modifié par TheRogerFederer le 5/11/2015 à 15:28
Pour la confusion, c'est moi laisse tomber !! J'ai parlé de tant que alors que dans ma tête je voulais bien dire jusqu'à................

Pour la logique la seule chose qui change c'est que avec un ou exclusif on aurait SOIT l'un, SOIT l'autre, alors qu'avec un inclusif on a soit l'un soit l'autre aussi mais les 2 sont possibles en plus !!

La traduction des portes NAND, AND, NOR, OR, OUX, NOUX etc....... sont très intéressantes même si je connaissais déjà pas mal de notion la dessus !
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
5 nov. 2015 à 15:46
C'est bon le programme marche, j'avais fais une erreur stupide sur le printf de la fin ce qu'il fait qu'il ne m'affichait pas le nom des étudiants au dessus de la moyenne.....
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 5/11/2015 à 19:00
Si tu as résolu ton souci, n'oublie pas de poster ton code afin qu'un lecteur qui passe après toi, puisse avoir la réponse.

avec un OU exclusif on aurait SOIT l'un, SOIT l'autre

Si tu as utilisé un OR (inclusif) un XOR (exclusif), tu as nécessairement une erreur de logique.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
6 nov. 2015 à 14:05
D'accord et bien paradoxalement en codant cela :
void clear (void) 
{
	while (getchar () != '\n') ;
}

int main() 
{
	// -- Déclarations --
	struct s_etudiants 
	{
		signed char nom[10] ;
		double moyenne ;
	};
	char rep ;
	double moyenne = 0 ; // Cumul des moyennes
	int nbre = 0 ; // Compteurs d'étudiants
	int k ;
	s_etudiants t_etudiant[39] ;
	
	// -- Saisie des informations --
	do 
	{
		printf(" Nom de l'\x82tudiant = ") ;
		scanf("%s",t_etudiant[nbre].nom) ;
		printf(" Moyenne de l'\x82tudiant = ") ;
		scanf("%lf",&t_etudiant[nbre].moyenne) ;
		moyenne = moyenne + t_etudiant[nbre].moyenne ;
		printf(" Voulez-vous continuez ? (O/n) : ") ;
		clear() ;
		scanf("%c",&rep) ;
		nbre++ ;
	}
	while(rep == 'O' | nbre == 39) ;
		
	// -- Calcul de la moyenne --
		moyenne = (moyenne / nbre) ;
	
	
	// -- Affichage des étudiants au dessus de la moyenne --
	for (k = 0; k <= nbre-1; k++) 
	{
		if (t_etudiant[k].moyenne > moyenne) 
		{
			printf(" \nEtudiants au dessus de la moyenne = %s\n ", t_etudiant[k].nom) ;
		}
	
	}
	
getch() ;
return 0 ;

}

il m'affiche ce que je veux au final donc..........
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 nov. 2015 à 14:18
Ta condition est fausse :(. Que se passe-t-il si je réponds 'O' tout le temps ? Eh bien tu boucleras à l'infini...
C'est simple si je met 'O' tout le temps c'est comme si j'écrivais "while (true | nbre == 39)", Or true | qqchose => donnera toujours "true". Donc, tu vas dépasser ta borne.
Il est aisé de s'en rendre compte: au lieu de 39, tu mets 2 en borne (moins chiant à tester) et tu verras rapidement que c'est très facile à dépasser.

Plusieurs soucis:
- Ne pas confondre le OU logique: || et le OU binaire: |. Les deux se ressemblent, mais ne font pas la même chose. L'un n'évalue qu'une partie de l'expression, l'autre toutes les expressions (inutilement). À part si tu réalises des opérations de logique binaire, il est (fortement) conseillé d'utiliser des "OU" logiques (c'est-à-dire le "||"). Je ne vais pas t'embrouiller avec cela. Pour l'instant retient que les opérateurs de logiques sont: !, || et &&.
- Tu t'acharnes à essayer de faire passer un OU à tout prix, parce que tu essaies de transcrire littéralement ton énoncé. Le OU n'est pas, et ne peut pas être la solution. Dans ton énoncé, tu as "jusqu'à", or tu utilises un while ("tant que"), qui est l'inverse, en terme de logique, d'un "jusqu'à"...
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
6 nov. 2015 à 15:47
Oui je n'en doutais pas on en avait déjà parlé de la condition et de la boucle a l'infini, et effectivement il ne s'arrête pas.

Pour le 'OU' ok ;) !

Une boucle : répéter, jusqu'à ne s'écrit pas comme cela :

do
{
.............
.............
.............
}
while () ;

?????
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 6/11/2015 à 16:09
Un "do...while" équivaut à un "faire... tant que". En C, on ne peut pas faire de "faire... jusqu'à" (do...until).

Ce n'est pas très gênant. Il suffit d'adapter la logique en l'inversant. Pour corriger ton souci, essaie de trouver la logique par toi même sans te reporter au pseudo-code fourni. Essaie plusieurs opérateurs logiques, fais des tests avec (surtout qu'il n'y en pas beaucoup: 2 opérateurs).

Tu devrais assez rapidement arriver à la solution.

Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 nov. 2015 à 16:50
Correction pour qui lira ce fil:

#include <stdio.h>

typedef struct
{
  char nom[10];
  double moyenne;
} s_etudiants;

void clear(void)
{
  while (getchar () != '\n')
    ;
}

int main()
{
  char rep = 0;
  int nb = 0;
  int k = 0;
  double moyenne = 0;
  s_etudiants etudiants[39];

  do
  {
    printf("Nom de l'etudiant: ");
    scanf("%s", etudiants[nb].nom);
    printf("Moyenne de l'etudiant: ");
    scanf("%lf", &etudiants[nb].moyenne);
    moyenne = moyenne + etudiants[nb].moyenne;
    printf("Voulez-vous continuez ? (O/n): ") ;
    clear() ;
    scanf("%c", &rep);
    nb++;
  }
  while (rep != 'n' && nb < 39);

  moyenne = moyenne / nb;

  for (k = 0; k < nb; ++k)
    if (etudiants[k].moyenne > moyenne)
      printf("Etudiant au dessus de la moyenne (de %f) = %s (avec un note de %f)\n",
	     moyenne, etudiants[k].nom, etudiants[k].moyenne);

  return 0;
}


0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
Modifié par TheRogerFederer le 27/11/2015 à 09:08
Oups désolé de ne pas avoir répondu après cela, j'avais complètement oublié ce sujet........, j'espère que tu ne m'en veut pas...........?
0
Rejoignez-nous