}
void saisie (joueur T[])
{ int i ;
for(i=0 ;i<15 ; i++)
{
do
{
printf("donner le numero du joueur \n") ;
scanf("%d",T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) ) ;
printf("donner le nom du joueur \n") ;
scanf("%s",T[i].nom ) ;
printf("donner le prenom du joueur \n") ;
scanf("%s",T[i].prenom) ;
do
{
printf("donner le poids du joueur \n") ;
scanf("%2.f", T[i].poids) ;
}
while (T[i].poids<0) ;
}
for (i=0;i< 15 ;i++)
{
printf("joueur num %d%s%s%.2f \n", T[i].num_poste , T[i].nom , T[i].prenom , T[i].poids) ;
}
}
void Max_poids (joueur T[])
{
float max=T[0].poids ;
float S= T[0].poids ;
int i ;
int pos ;
for (i=0 ;i<15 ; i++)
{
if (T[i].poids > max )
{
max = T[i].poids ;
pos = i ;
}
S= S+ T[i].poids ;
}
printf("les coordonnés du joueur le plus lourd sont %d%s%s%.2f \n", T[pos].num_poste , T[pos].nom ,T[pos].prenom , T[pos].poids) ;
printf("la moyenne des poids est %.2f", (S/15) ) ;
}
void main ()
{char c;
joueur tab [15] ;
saisie(tab) ;
Max_poids(tab) ;
c=getchar();
}
Il est exécutable mais je ne peux entrer que le numéro de joueur et le programme ne sort pas de cette boucle... une idée sur comment corriger cela svp ?
Merci d'avance.
J'ai pas tout lu car ton code est vraiment illisible.
Peux-tu le poster entre des balises "code" (à droite du bouton souligné) et de faire une belle indentation.
scanf("%d",T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) ) ; Il faut mettre : scanf("%d", &T[i].num_poste); L'esperluette (&) est importante.
Dans le while(...); il faut faire attention. Si tu mets un point virgule à la fin, cela reviendra à : while(...) { } (sans instruction).
Il faut enlever le ; après le while si tu veux qu'il exécute les instructions suivantes.
void main () C'est : int main (void)
main() renvoie un int.
Il faut donc mettre également return 0;
}
void saisie (joueur T[])
{ int i ;
for(i=0 ;i<15 ; i++)
{
do
{
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) ) ;
printf("donner le nom du joueur \n") ;
scanf("%s",T[i].nom ) ;
printf("donner le prenom du joueur \n") ;
scanf("%s",T[i].prenom) ;
do
{
printf("donner le poids du joueur \n") ;
scanf("%2.f", T[i].poids) ;
}
while (T[i].poids<0) ;
}
for (i=0;i< 15 ;i++)
{
printf("joueur num %d%s%s%.2f \n", T[i].num_poste , T[i].nom , T[i].prenom , T[i].poids) ;
}
}
void Max_poids (joueur T[])
{
float max=T[0].poids ;
float S= T[0].poids ;
int i ;
int pos ;
for (i=0 ;i<15 ; i++)
{
if (T[i].poids > max )
{
max = T[i].poids ;
pos = i ;
}
S= S+ T[i].poids ;
}
printf("les coordonnés du joueur le plus lourd sont %d%s%s%.2f \n", T[pos].num_poste , T[pos].nom ,T[pos].prenom , T[pos].poids) ;
printf("la moyenne des poids est %.2f", (S/15) ) ;
}
void main ()
{char c;
joueur tab [15] ;
saisie(tab) ;
Max_poids(tab) ;
c=getchar();
}
Merci pour votre réponse et désolé,
j'ai corriger le scanf("%d",&T[i].num_poste) et le problème de la boucle de numéro de joueur est résolu mais, quand le programme arrive au 2ème joueur il affiche deux fois "donner le numero du joueur" et meme si je met le meme numéro qu'au premier joueur il passe et ne repéte pas l'instruction
do
{
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) ) ;
pour le ; aprés le while(...)';' j'ai pas bien compris si je l'enlève ça me donne ça: "expected ';' before 'printf'', je suis sous codeblocks.
Merci encore.
Ca serait plus efficace si tu tenais toutes mes remarques en compte...
Je les remets :
void main ()
C'est : int main (void)
main() renvoie un int.
Il faut donc mettre également return 0;
Et puis surtout : Peux-tu le poster entre des balises "code" (à droite du bouton souligné) et de faire une belle indentation. Sinon c'est illisible...
Autre remarque :
scanf("%2.f", T[i].poids) ; Tu as oublié l'esperluette (&).
pour le while, essaie en enlevant le ; et en mettant entre accolade le groupe d'instruction que tu veux répéter.
Et ce qui serait sympa aussi, ça serait de mettre les warning et messages d'erreur de ton compilateur en indiquant à quelle ligne cela se rapporte :-).
#include <stdio.h>
#include <conio.h>
#define taille 15 ;
typedef struct {
char nom [25] ;
char prenom [25] ;
float poids ;
int num_poste ;
} joueur ;
int test (joueur T[] ,int val , int N)
{
int i ;
for(i=0 ; i<N ; i++)
{
if(T[i].num_poste == val)
return 1 ;
}
return 0 ;
}
void saisie (joueur T[])
{ int i ;
for(i=0 ;i<15 ; i++)
{
do
{
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) )
printf("donner le nom du joueur \n") ;
scanf("%s",T[i].nom ) ;
printf("donner le prenom du joueur \n") ;
scanf("%s",T[i].prenom) ;
do
{
printf("donner le poids du joueur \n");
scanf("%2.f", &T[i].poids) ;
}
while (T[i].poids<0)
}
for (i=0;i< 15 ;i++)
{
printf("joueur num %d%s%s%.2f \n", T[i].num_poste , T[i].nom , T[i].prenom , T[i].poids) ;
}
}
void Max_poids (joueur T[])
{
float max=T[0].poids ;
float S= T[0].poids ;
int i ;
int pos ;
for (i=0 ;i<15 ; i++)
{
if (T[i].poids > max )
{
max = T[i].poids ;
pos = i ;
}
S= S+ T[i].poids ;
}
printf("les coordonnés du joueur le plus lourd sont %d%s%s%.2f \n", T[pos].num_poste , T[pos].nom ,T[pos].prenom , T[pos].poids) ;
printf("la moyenne des poids est %.2f", (S/15) ) ;
}
int main (void)
{char c;
joueur tab [15] ;
saisie(tab) ;
Max_poids(tab) ;
c=getchar();
return 0;
}
1)error: expected ';' before 'printf': ici (sur la ligne de printf):
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) )
printf("donner le nom du joueur \n") ;
2)warning:unkown convertion type character '.' in format: ici (sur la ligne de scanf):
printf("donner le poids du joueur \n");
scanf("%2.f", &T[i].poids) ;
3) warining: too many arguments for format meme ligne que 2
4)error: expected ';' before 'printf': ici (sur la ligne de l'accolade):
while (T[i].poids<0)
}
for (i=0;i< 15 ;i++)
5) warning:'main' is normally a non-static function (sur la ligne: int main(void).
6)expected declaration or statement at end of input (sur ma dernière ligne).
Tu avais raison, il faut bien un ; après ton while.
J'avais pas vu le do 3 lignes plus haut. C'est pour ça qu'il faut systématiquement poster son code entre deux balises code en indentant (toi tu as mis gras)...
#define taille 15 ; Surtout pas de point virgule après un #define
scanf("%2.f", &T[i].poids) ; Mets plutôt : "%f"
Corrige, recompile, reposte (par pitié, le bouton code (à droite de souligné)) et remets les messages d'erreur / warning du compilateur.
aprés la correction ici scanf("%f", &T[i].poids) ; "donner le numero du joueur" ne s'affiche plus 2 fois pour le deuxième joueur mais si je mets le meme numero il passe au nom et prenom... alors qu'il faut qu'il repete ça:
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
mais au 3éme joueur si je mets le meme numero il les repete (pourquoi il ne reconnai pas que c'est le meme numero depuis le 2éme joueur),
pas d'erreurs ni de warnings maintenant.
#include <stdio.h>
#include <conio.h>
#define taille 15
typedef struct {
char nom [25] ;
char prenom [25] ;
float poids ;
int num_poste ;
} joueur ;
int test (joueur T[] ,int val , int N)
{
int i ;
for(i=0 ; i<N ; i++)
{
if(T[i].num_poste == val)
return 1 ;
}
return 0 ;
}
void saisie (joueur T[])
{ int i ;
for(i=0 ;i<15 ; i++)
{
do
{
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
}
while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) );
printf("donner le nom du joueur \n") ;
scanf("%s",T[i].nom ) ;
printf("donner le prenom du joueur \n") ;
scanf("%s",T[i].prenom) ;
do
{
printf("donner le poids du joueur \n");
scanf("%f", &T[i].poids) ;
}
while (T[i].poids<0);
}
for (i=0;i< 15 ;i++)
{
printf("joueur num %d%s%s%.2f \n", T[i].num_poste , T[i].nom , T[i].prenom , T[i].poids) ;
}
}
void Max_poids (joueur T[])
{
float max=T[0].poids ;
float S= T[0].poids ;
int i ;
int pos ;
for (i=0 ;i<15 ; i++)
{
if (T[i].poids > max )
{
max = T[i].poids ;
pos = i ;
}
S= S+ T[i].poids ;
}
printf("les coordonnés du joueur le plus lourd sont %d%s%s%.2f \n", T[pos].num_poste , T[pos].nom ,T[pos].prenom , T[pos].poids) ;
printf("la moyenne des poids est %.2f", (S/15) ) ;
}
int main (void)
{char c;
joueur tab [15] ;
saisie(tab) ;
Max_poids(tab) ;
c=getchar();
return 0;
}
j'ai mis les balises de code seulement, désolé encore et surtout merci.
Dommage que ton code ne soit pas indenté.
J'ai fait l'effort de l'indenter, on y voit plus clair :
#include <stdio.h>
#include <conio.h>
#define taille 15
typedef struct {
char nom [25] ;
char prenom [25] ;
float poids ;
int num_poste ;
} joueur ;
int test (joueur T[] ,int val , int N) {
int i ;
for(i=0 ; i<N ; i++) {
if(T[i].num_poste == val)
return 1 ;
}
return 0 ;
}
void saisie (joueur T[]) {
int i ;
for(i=0 ;i<15 ; i++) {
do {
printf("donner le numero du joueur \n") ;
scanf("%d",&T[i].num_poste) ;
} while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) );
printf("donner le nom du joueur \n") ;
scanf("%s",T[i].nom ) ;
printf("donner le prenom du joueur \n") ;
scanf("%s",T[i].prenom) ;
do {
printf("donner le poids du joueur \n");
scanf("%f", &T[i].poids) ;
} while (T[i].poids<0);
}
for (i=0;i< 15 ;i++) {
printf("joueur num %d%s%s%.2f \n", T[i].num_poste , T[i].nom , T[i].prenom , T[i].poids) ;
}
}
void Max_poids (joueur T[]) {
float max=T[0].poids ;
float S= T[0].poids ;
int i ;
int pos ;
for (i=0 ;i<15 ; i++) {
if (T[i].poids > max ) {
max = T[i].poids ;
pos = i ;
}
S= S+ T[i].poids ;
}
printf("les coordonnés du joueur le plus lourd sont %d%s%s%.2f \n", T[pos].num_poste , T[pos].nom ,T[pos].prenom , T[pos].poids) ;
printf("la moyenne des poids est %.2f", (S/15) ) ;
}
int main (void) {
char c;
joueur tab [15] ;
saisie(tab) ;
Max_poids(tab) ;
c=getchar();
return 0;
}
Qu'en penses-tu ?
Sinon, ton code fonctionne sur ma machine. Peux-tu réssayer sur la tienne et dire exactement ce que tu as tapé pour provoquer l'erreur.
Pour le premier joueur j'ai taper pour le numero: 1 pour le nom: a pour le prenom: b pour le poid 80,
pour le deuxième j'ai taper 1, c, d, 80 (c'est ici le problème il faut qu'il me demande de retaper le numero car j'ai deja taper 1 pour le premier joueur.
Pour le 3ème joueur si je tape 1 pour le numero le programme me demande de retaper le numero(c'est ce que je veux mais pourquoi il ne me demande pas de retaper le numero pour le 2ème joueur).
Merci.
} while ((T[i].num_poste<0) || (T[i].num_poste>15) || (test(T,T[i].num_poste, i-1)==1) ); Ce n'est pas i-1, mais i puisque dans ta fonction test(), tu utilises i strictement inférieur à N.
aprés la correction ici scanf("%f", &T[i].poids) ; "donner le numero du joueur" ne s'affiche plus 2 fois pour le deuxième joueur mais si je mets le meme numero il passe au nom et prenom... alors qu'il faut qu'il repete ça:
mais au 3éme joueur si je mets le meme numero il les repete (pourquoi il ne reconnai pas que c'est le meme numero depuis le 2éme joueur),
pas d'erreurs ni de warnings maintenant.
j'ai mis les balises de code seulement, désolé encore et surtout merci.
J'ai fait l'effort de l'indenter, on y voit plus clair :
Qu'en penses-tu ?
Sinon, ton code fonctionne sur ma machine. Peux-tu réssayer sur la tienne et dire exactement ce que tu as tapé pour provoquer l'erreur.
pour le deuxième j'ai taper 1, c, d, 80 (c'est ici le problème il faut qu'il me demande de retaper le numero car j'ai deja taper 1 pour le premier joueur.
Pour le 3ème joueur si je tape 1 pour le numero le programme me demande de retaper le numero(c'est ce que je veux mais pourquoi il ne me demande pas de retaper le numero pour le 2ème joueur).
Merci.
Ce n'est pas i-1, mais i puisque dans ta fonction test(), tu utilises i strictement inférieur à N.