Petit programme qui ne fonctionne pas proprement

Résolu/Fermé
geekon Messages postés 25 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 8 janvier 2016 - Modifié par geekon le 24/02/2013 à 13:29
geekon Messages postés 25 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 8 janvier 2016 - 25 févr. 2013 à 23:35
Bonjour,



#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) ) ;
}
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.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 févr. 2013 à 15:37
Bonjour,

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;

Cdlt,
0
geekon Messages postés 25 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 8 janvier 2016
Modifié par geekon le 24/02/2013 à 19:08
#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) ) ;
}
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 févr. 2013 à 19:21
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 :-).
0
geekon Messages postés 25 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 8 janvier 2016
25 févr. 2013 à 21:03
Bonsoir ;-), Desolé encore:

#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).

Merci.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 févr. 2013 à 21:34
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.
0
geekon Messages postés 25 Date d'inscription lundi 9 juillet 2012 Statut Membre Dernière intervention 8 janvier 2016
Modifié par geekon le 25/02/2013 à 21:56
Bonsoir ;),

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.
0