Se connecter avec
S'enregistrer | Connectez-vous

question sur les structures et les tableau [c]

Dernière réponse : dans Programmation

Salut

j'ai une question, je suis en train de lire le tuto sur les structure en c sur le sdz. à un moment du tuto il y a un execercice, mais il y a un ou deux trucs que je n'ai pas compris sur le tuto. l'exercice consiste à afficher les info du joueur avec une boucle (const Personne joueurs[2];)

il y a juste une chose que je ne comprend pas trop ^^ c'est comment faire pour afficher les info qui se trouve dans joueur[0].nom (par exemple) et joueur[1].nom ?

Autres pages sur : question structures tableau

Lassé par la pub ? Créez un compte

ca encore ca va, mon gros problème surtous c'est dans la structure. j'ai fait ca pour le moment:

main.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "prototype.h"
  4. int main(int argc, char *argv[])
  5. {
  6.  
  7. joueur joueur[2];
  8. long i =0, nombre = 0;
  9. for (i = 0; i < 2; i++)
  10. {
  11. nombre = i + 1;
  12. printf("joueur %ld\n", nombre);
  13. printf("entre un nom:");
  14. scanf("%s", joueur[i].nom);
  15. printf("\nentre un age:");
  16. scanf("%ld\n", joueur[i].age);
  17. }
  18. printf("joueur1: nom: %s, age: %ld, joueur2 nom: %s, age: %ld\n", joueur[0].nom, joueur[0].age, joueur[1].nom, joueur[1].age);
  19.  
  20. system("PAUSE");
  21. return 0;
  22. }


prototype.h:
  1. typedef struct personne joueur;
  2.  
  3. struct personne
  4. {
  5. char nom[100];
  6. long age;
  7.  
  8. };

Va revoir un peu le scanf :)  !

scanf prend l'adresse de ta variable donc :

  1. scanf( "%s" , &joueur[i].nom );


Ensuite ton deuxième scanf : il faut virer le "\n" inutile dans ce cas là et même problématique

Avec ces modifs ton programme devrait fonctionner mais moi je changerais quelques trucs :

- un boucle pour l'affichage à la fin
- suppression de la variable nombre qui ne sert à rien ( remplacer directement nombre par i+1 dans ton printf )
- un nom différent pour ta structure et ton tableau ou alors tu fais directement un tableau de structures dans ta déclaration
- un #define pour le nombre de joueurs c'est mieux :) 
Expert Programmation

maxcailla a dit :
Va revoir un peu le scanf :)  !

scanf prend l'adresse de ta variable donc :

  1. scanf( "%s" , &joueur[i].nom );


Ensuite ton deuxième scanf : il faut virer le "\n" inutile dans ce cas là et même problématique

Avec ces modifs ton programme devrait fonctionner mais moi je changerais quelques trucs :

- un boucle pour l'affichage à la fin
- suppression de la variable nombre qui ne sert à rien ( remplacer directement nombre par i+1 dans ton printf )
- un nom différent pour ta structure et ton tableau ou alors tu fais directement un tableau de structures dans ta déclaration
- un #define pour le nombre de joueurs c'est mieux :) 


Si joueur.nom est un char *, c'est déjà un pointeur, il ne faut pas mettre le &, par contre sur l'age (qui n'est pas un pointeur) il faut le mettre l'adresse avec & pour que la fonction puisse faire les modifications.

Le define, c'est parce que lorsque tu aura pas mal de code, le jour où tu voudra changer ce nombre, tu vas devoir faire des modifs partout et ça ne marchera pas (tu oublieras forcément quelque chose), alors que si tu bosses dès le début avec un #define, tu n'auras qu'a changer ça si un jour tu veux augmenter le nombre de joueurs.
Mieux vaut prendre les bonnes habitudes dès le début ;) 

CRicky a dit :
Si joueur.nom est un char *, c'est déjà un pointeur


Oupps oui excuse.

Sinon moi je te propose le fichier "prototype.h" comme ça :
  1. #define NB_JOUEUR 2
  2.  
  3. struct personne
  4. {
  5. char * nom[100];
  6. long age;
  7. }joueur[NB_JOUEUR]=
  8. {
  9.  
  10. { 0 , 0 },
  11. { 0 , 0 }
  12.  
  13. };


En gros tu déclares ici ton tableau joueur qui contient les 2 éléments de ta structure, les 0 servent pour l'initialisation tu les actualiseras par la suite avec tes scanf.
Lorsque que tu voudras ajouter un troisième joueur il te suffira alors de changer la valeur de ton #define et de rajouter une ligne { 0 , 0 } dans ton tableau, propre et pratique ;) 

EDIT : tu dois mettre des NB_JOUEUR aussi dans tes boucles for
Lassé par la pub ? Créez un compte
Tom's guide dans le monde