Petit programme qui ne fonctionne pas proprement [Résolu/Fermé]

Signaler
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016
-
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016
-
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

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 742
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,
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016

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.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 742
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.
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016

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.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 742
} 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.
Messages postés
25
Date d'inscription
lundi 9 juillet 2012
Statut
Membre
Dernière intervention
8 janvier 2016

Ah oui ça marche maintenant, merci ;-)