mon programme doit pouvoir afficher les informations relatives à chaque joueur utilisant un tableau de type personnalisé .
Voici mon code source (.c et .h) ,Je les analyses depuis un moment mais je ne vois pas pourquoi ça ne marche pas.
Merci de m'aider à trouver le souci.
#include <stdio.h>
#include <stdlib.h>
#include "Var2TypePerso.h"
int main(void)
{printf("**joueur**\n\n");
// recuperer les informations
int i=0,NombreDeJoueur=0;
personne Tab[2];
/*
printf("Nombre de Joueurs ? \n");
scanf("%d",NombreDeJoueur);
Tab[NombreDeJoueur];
*/
//Boucle de recuperation des informations en fonction de chaque joueur
for(i=0;i<2;i++)
{
printf("Nom du joueur n°%d\n",i+1);
scanf("%s",Tab[i].nom);
printf("Prenom du joueur n°%d\n",i+1);
scanf("%s",Tab[i].prenom);
printf("Adresse du joueur n°%d\n",i+1);
scanf("%s",Tab[i].adresse);
printf("Sex du joueur n°%d\n",i+1);
scanf("%d",Tab[i].sexe);
printf("Age du joueur n°%d\n",i+1);
scanf("%d",Tab[i].age);
printf("Joueur %d: Bien enregistre !",i+1);
}
printf("Vous avez bien enregistre tout vos joueurs\n\n\n\n");
// Afficher les informations
int NumeroDuJoueur=0;
printf("Afficher les infos du Joueur n° ");
scanf("%d",NumeroDuJoueur);
printf("***Joueurs n°%d\n",NumeroDuJoueur);
printf("nom :%s\n",Tab[NumeroDuJoueur].nom);
printf("prénom :%s\n",Tab[NumeroDuJoueur].prenom);
printf("âge :%d\n",Tab[NumeroDuJoueur].age);
printf("sexe :%d\n",Tab[NumeroDuJoueur].sexe);
printf("adresse :%s\n",Tab[NumeroDuJoueur].adresse);
return 0;}
j'avais pas compris que " Tableau[i].composante " était une simple variable.
J'ai fait une fonction pour le "output " Mais j'ai pas réussi pour le "input".
#include <stdio.h>
#include <stdlib.h>
#include "Var2TypePerso.h"
void output(int NumeroDuJoueur);
personne joueur[2];
int main(void)
{printf("**joueur**\n\n");
// recuperer les informations
int i=0,NombreDeJoueur=0;
/**/
//Boucle de recuperation des informations en fonction de chaque joueur
printf("Nombre de Joueurs ? ");
scanf("%d",&NombreDeJoueur);
joueur[NombreDeJoueur];
for(i=0;i<NombreDeJoueur;i++)
{
printf("Nom du joueur n°%d\n",i+1);
scanf("%s",joueur[i].nom);
printf("Prenom du joueur n°%d\n",i+1);
scanf("%s",joueur[i].prenom);
printf("Adresse du joueur n°%d\n",i+1);
scanf("%s",joueur[i].adresse);
printf("Sex du joueur n°%d\n",i+1);
scanf("%d",joueur[i].sexe);
printf("Age du joueur n°%d\n",i+1);
scanf("%d",joueur[i].age);
printf("\nJoueur %d: Bien enregistre !\n\n",i+1);
}
printf("Vous avez bien enregistre tout vos joueurs !\n\n\n\n");
output(1);
return 0;}
// Afficher les informations
void output(int NumeroDuJoueur)
{
printf("Afficher les infos du Joueur n° ");
scanf("%d",&NumeroDuJoueur);
printf("***Joueurs n°%d\n",NumeroDuJoueur);
printf("nom :%s\n",joueur[NumeroDuJoueur].nom);
printf("prénom :%s\n",joueur[NumeroDuJoueur].prenom);
printf("âge :%d\n",joueur[NumeroDuJoueur].age);
printf("sexe :%d\n",joueur[NumeroDuJoueur].sexe);
printf("adresse :%s\n",joueur[NumeroDuJoueur].adresse);
}
Commence par comprendre (et corriger) tes warnings:
j.c: In function 'main':
j.c:25:11: warning: statement with no effect [-Wunused-value]
joueur[NombreDeJoueur];
~~~~~~^~~~~~~~~~~~~~~~
j.c:37:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
scanf("%d",joueur[i].sexe);
^
j.c:39:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
scanf("%d",joueur[i].age);
^
j.c:45:5: warning: implicit declaration of function 'output' [-Wimplicit-function-declaration]
output(1);
^~~~~~
j.c: At top level:
j.c:50:10: warning: conflicting types for 'output'
void output(int NumeroDuJoueur)
^~~~~~
j.c:45:5: note: previous implicit declaration of 'output' was here
output(1);
^~~~~~
Parfois, je me demande à quoi servent les réponses que l'on donne:
edgarjacobs a écrit:
scanf() a besoin d'unde adresse mémoire où stocker l'entrée utilisateur.... ce que tu oublies de faire en lignes 27 et 29: &.... .age et &.... .sexe
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Désolé , pardon... j'avais juste créer la fonction output... J'ai oublié d'ajouter les adresses mémoires.
Voici :
#include <stdio.h>
#include <stdlib.h>
#include "Var2TypePerso.h"
void output(int Numero);
personne joueur[2];
int main(void)
{
printf("**joueur**\n\n");
// recuperer les informations
int i=0,NombreDeJoueur=0,NumeroDuJoueur=1;
/*joueur[NombreDeJoueur];*/
//Boucle de recuperation des informations en fonction de chaque joueur
printf("Nombre de Joueurs ? ");
scanf("%d",&NombreDeJoueur);
for(i=0;i<NombreDeJoueur;i++)
{
printf("Nom du joueur n°%d ",i+1);
scanf("%s",&joueur[i].nom);
printf("Prenom du joueur n°%d ",i+1);
scanf("%s",&joueur[i].prenom);
printf("Adresse du joueur n°%d ",i+1);
scanf("%s",&joueur[i].adresse);
printf("Sex du joueur n°%d (G/F) ",i+1);
scanf("%c",&joueur[i].sexe);
printf("Age du joueur n°%d ",i+1);
scanf("%d",&joueur[i].age);
printf("\nJoueur %d: Bien enregistre !\n\n",i+1);
}
printf("Vous avez bien enregistre tout vos joueurs !\n\n\n\n");
printf("Afficher les infos du Joueur n° ");
scanf("%d",&NumeroDuJoueur);
output(NumeroDuJoueur);
return 0;}
// Afficher les informations
void output(int Numero)
{
printf("***Joueurs n°%d\n",Numero);
printf("nom :%s\n",joueur[Numero].nom);//?!
printf("prénom :%s\n",joueur[Numero].prenom);//?!
printf("âge :%d\n",joueur[Numero].age);//?!
printf("sexe :%d\n",joueur[Numero].sexe);//?!
printf("adresse :%s\n",joueur[Numero].adresse);//?!
}
Un tableau est déjà une adresse: lorsque tu délares char s[50], s est une adresse. Il ne faut donc plus passer l'adresse de l'adresse à scanf() en lignes 24 26 28.
Ta ligne 18 est "dangereuse": si l'utilisateur répond autre chose 1 ou 2, ton programme va planter: joueur[....] n'a de la place que pour retenir deux éléments.
- Edité par edgarjacobs 5 février 2019 à 16:23:18
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Désolé , pardon... j'avais juste créer la fonction output... J'ai oublié d'ajouter les adresses mémoires
Il faut que tu compiles toujours avec les options qui donnent le maximum de messages et d'avertissements. Dans les programmes pour débutants, qui font des choses standards, il n'y a aucune raison d'avoir une bidouille qui provoque un message qu'on ne puisse pas régler proprement.
A part les paramètres non utilisés dans des fonctions, ce qu'on règle avec une option.
Et si c'est avec gcc, -Werror pour que tous les avertissements soient considérés comme des erreurs empêchant de produire du code exécutable.
J'espère avoir tout régler correctement maintenant.
En tout cas ,mon compilateur lui n'a signalé aucun problème.
#include <stdio.h>
#include <stdlib.h>
#include "Var2TypePerso.h"
void output(int Numero);
personne joueur[]={"","","",0,""};
int main(void)
{
printf("**joueur**\n\n");
int i=0,NumeroDuJoueur=1,NombreDeJoueur=0;
printf("Nombre de Joueurs ? ");
scanf("%d",&NombreDeJoueur);
// recuperer les informations
for(i=1;i<=NombreDeJoueur;i++)
{
printf("Nom du joueur n°%d ",i);
scanf("%s",&joueur[i].nom);
printf("Prenom du joueur n° k ",i);
scanf("%s",&joueur[i].prenom);
printf("Adresse du joueur n°%d ",i);
scanf("%s",&joueur[i].adresse);
printf("Sex du joueur n°%d (Homme/Femme) ",i);
scanf("%s",&joueur[i].sexe);
printf("Age du joueur n°%d ",i);
scanf("%d",&joueur[i].age);
printf("\nJoueur %d: Bien enregistre !\n\n",i);
}
printf("Vous avez bien enregistre tout vos joueurs !\n\n\n\n");
printf("Afficher les infos du Joueur n° ");
scanf("%d",&NumeroDuJoueur);
output(NumeroDuJoueur);
return 0;}
//Fonction Afficher les informations
void output(int Numero)
{
printf("***Joueurs n°%d\n\n",Numero);
printf("%s %s est un(e) %s de %d ans qui habite %s ",joueur[Numero].nom,joueur[Numero].prenom,joueur[Numero].sexe,joueur[Numero].age,joueur[Numero].adresse);
}
michelbillaud a écrit:
7Bryce a écrit:
Désolé , pardon... j'avais juste créer la fonction output... J'ai oublié d'ajouter les adresses mémoires
Il faut que tu compiles toujours avec les options qui donnent le maximum de messages et d'avertissements. Dans les programmes pour débutants, qui font des choses standards, il n'y a aucune raison d'avoir une bidouille qui provoque un message qu'on ne puisse pas régler proprement.
A part les paramètres non utilisés dans des fonctions, ce qu'on règle avec une option.
Et si c'est avec gcc, -Werror pour que tous les avertissements soient considérés comme des erreurs empêchant de produire du code exécutable.
tu as toutes les informations pour écrire une version correcte.
Oui bien-sûr...! Tu m'avais dis ce qui n'allait pas !
Je crois avoir maintenant trouvé la version correcte...
#include <stdio.h>
#include <stdlib.h>
typedef struct personne personne ;
struct personne
{
char nom[100];
char prenom[100];
char sexe[100];
int age;
char adresse[100];
};
void output(int Numero);
personne *joueur=NULL;
int main(void)
{
printf("**joueur**\n\n");
int i=0,NumeroDuJoueur=1,NombreDeJoueur=0;
char Exit='y';
do
{
printf("Nombre de Joueurs ? ");
scanf("%d",&NombreDeJoueur);
if(NombreDeJoueur>0)
{
joueur=malloc(NombreDeJoueur*sizeof(int));
if(joueur==NULL)
{
printf("Erreur !");
}
else
{
for(i=1;i<=NombreDeJoueur;i++)
{
printf("Nom du joueur n°%d >",i);
scanf("%s",joueur[i].nom);
printf("Prenom du joueur n°%d >",i);
scanf("%s",joueur[i].prenom);
printf("Adresse du joueur n°%d >",i);
scanf("%s",joueur[i].adresse);
printf("Sex du joueur n°%d (Homme/Femme) >",i);
scanf("%s",joueur[i].sexe);
printf("Age du joueur n°%d >",i);
scanf("%d",&joueur[i].age);
printf("\nJoueur %d: Bien enregistre !\n\n",i);
}
printf(">>>> Vous avez bien enregistre tout vos joueurs !\n\n\n\n");
printf("Afficher les infos du Joueur n° ");
scanf("%d",&NumeroDuJoueur);
output(NumeroDuJoueur);
free(joueur);
}
}
else
{printf("\n!!! veillez entrer un nombre positif !!! ");}
printf("\n\nContinuer ? (y/n) > ");
scanf("%c",&Exit);
}while(Exit=='y');
return 0;}
void output(int Numero)
{
printf("***Joueurs n°%d\n\n",Numero);
printf("%s %s est un(e) %s de %d ans qui habite %s ",joueur[Numero].nom,joueur[Numero].prenom,joueur[Numero].sexe,joueur[Numero].age,joueur[Numero].adresse);
}
Mon compilateur ( avec les options d'avertissement ) ne signale Rien d'anormal ...sauf que celui-ci redémarre souvent au bon milieu du programme et je ne sais pourquoi , puisqu'il refonctionne normalement comme par magie après...
la variable joueur ne représente pas un joueur, mais un tableau de joueurs.
Le découpage est insuffisant
void saisir_joueur(struct Personne *p) {
printf("Nom :");
scanf("%s", p->nom);
...
}
printf("saisie du joueur %d\n", n);
saisir_joueur(& tableau_joueurs[n]); // ou tableau_joueurs + n
- Edité par michelbillaud 8 février 2019 à 14:25:05
Exercice Les type personnalisé
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
<200%>Working</200%>
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent