Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice Les type personnalisé

    31 janvier 2019 à 23:43:19

    Salut les doyens.

    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;}
    

    --------------------------------------------------------------------------------

    #ifndef Tor;
    #define Tor;
    
    typedef struct personne personne ;
    struct personne
    {
    	char nom[100];
    	char prenom[100];
    	int sexe;
    	int age;
    	char adresse[1000];
    	
    };
    
    
    
    #endif; 



    • Partager sur Facebook
    • Partager sur Twitter

    <200%>Working</200%>

      31 janvier 2019 à 23:55:33

      Hello,

      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

      Edit: je te conseille de créer des fonctions: une qui fait l'input, une qui fait l'affichage (et personnellement, je découperais encore plus)

      -
      Edité par edgarjacobs 31 janvier 2019 à 23:58:16

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        1 février 2019 à 1:33:01

        Merci doyen.

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



        • Partager sur Facebook
        • Partager sur Twitter

        <200%>Working</200%>

          1 février 2019 à 16:48:06

          Re,-

          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

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            4 février 2019 à 15:07:52

            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);//?!
            	}
            



            • Partager sur Facebook
            • Partager sur Twitter

            <200%>Working</200%>

              5 février 2019 à 16:22:53

              Re,

              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

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                6 février 2019 à 13:54:26

                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.

                CFLAGS = -std=c11 -Wall -Wextra -pedantic -Wno-unused -Werror

                C'est très important : le compilateur est ton ami, il te dit quand tu es en train de faire une connerie et t'en empêche.

                -
                Edité par michelbillaud 6 février 2019 à 13:55:18

                • Partager sur Facebook
                • Partager sur Twitter
                  7 février 2019 à 1:24:44

                  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.

                  CFLAGS = -std=c11 -Wall -Wextra -pedantic -Wno-unused -Werror

                  C'est très important : le compilateur est ton ami, il te dit quand tu es en train de faire une connerie et t'en empêche.

                  -
                  Edité par michelbillaud il y a environ 11 heures



                  Bien compris... Merci du conseil.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  <200%>Working</200%>

                    7 février 2019 à 19:33:05

                    7Bryce a écrit:

                    J'espère avoir tout régler correctement maintenant.

                    Non. Et pourtant tu as toutes les informations pour écrire une version correcte.



                    -
                    Edité par edgarjacobs 7 février 2019 à 19:33:55

                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      8 février 2019 à 0:38:00

                      edgarjacobs a écrit:

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



                      • Partager sur Facebook
                      • Partager sur Twitter

                      <200%>Working</200%>

                        8 février 2019 à 1:12:52

                        7Bryce a écrit:

                        sauf que celui-ci redémarre souvent au bon milieu du programme et je ne sais pourquoi

                        Regarde le malloc(): tu alloues NombreDeJoueurs sizeof(int), alors que tu devrais allouer NombreDeJoueurs sizeof(la structure)

                        Tu oublies également de faire un free() de l'espace alloué.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          8 février 2019 à 3:59:25

                          je vois...

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

                          Le free() est juste après le output (joueur) Ligne 62 ,vu que j' en ai plus besoin après.

                          J'espère que maintenant c'est bon.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          <200%>Working</200%>

                            8 février 2019 à 9:38:44

                            Salut,

                            La présentation (indentation) de ton code laisse à désirer... ce qui ne donne pas envie de s'y intéresser.

                            ...

                            -
                            Edité par magma 8 février 2019 à 9:47:52

                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 février 2019 à 13:00:57

                              Re,-

                              En C, les indices d'un tableau de N éléments vont de 0 à N-1....

                              • Partager sur Facebook
                              • Partager sur Twitter

                              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                8 février 2019 à 14:23:30

                                Le nommage des variables est aléatoire

                                • majuscule ou non
                                • orthographe 'NombreDeJoueurs" prend un S
                                • mélange de langues : exit, joueur, output
                                • 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

                                • Partager sur Facebook
                                • Partager sur Twitter

                                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.
                                • Editeur
                                • Markdown