Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction pour remplir une structure

26 avril 2009 à 0:05:23

Bonsoir !

Je rencontre des difficultés quand je dois initialiser une structure à l'intérieur d'une fonction. Je ne sais pas ce que je dois entrer comme variable en paramètre pour la fonction (ligne 13 dans le code), ni avec quoi je dois faire appel à la fonction (ligne 33).
Dans ma tête, la boucle permettrait de remplir :
- 0.nom
- 0.pays
- 0.note[0]
- 0.note[1]
- 0.note[2]
...
- 0.note[7]
- 0.note[8]
- 1.nom
- 1.pays
- 1.note[0]
- 1.note[1]
- 1.note[2]
...
- 1.note[7]
- 1.note[8]
...
- 4.nom
- 4.pays
- 4.note[0]
- 4.note[1]
- 4.note[2]
...
- 4.note[7]
- 4.note[8]

Mais je ne trouve pas comment remplir les deux parties citées ci-dessus.

#include <stdio.h>

#define NB_NOTE 9
#define NB_PATINEUSE 5

struct patineuse_type
{
    char nom[50];
    char pays[50];
    float note[NB_NOTE];
};

void entrer_donnees(struct patineuse_type num_patineuse)
{
    int i;
    printf("Entrez le nom de la patineuse : ");
    scanf("%s", num_patineuse.nom);
    printf("Entrez le pays de la patineuse : ");
    scanf("%s", num_patineuse.pays);
    for(i=0; i<=NB_NOTE-1; i++)
    {
        printf("Entrez la note n%d : ", i+1);
        scanf("%f", &num_patineuse.note[i]);
    }
}

int main(void)
{
    int i;
    for(i=0; i<=NB_PATINEUSE-1; i++)
    {
    printf("Entrez les informations de la candidate n%d :", i+1);
    entrer_donnees(struct patineuse_type i);
    }

    fflush(stdin);
    getchar();
    return(0);
}


Autre question : sur le Site du Zéro, vous utilisez uniquement le mot "fonction". Notre prof nous a appris a dire "procédure" quand le sous-programme ne retourne rien (donc void) et "fonction" quand un sous-programme retourne quelque chose (int, double, float...). C'est correct ?

Merci !
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 0:11:28

Je ne vois pas trop où ta structure est déclarée, c'est assez confus comme code, je ne comprends pas ta ligne qui appelle entrer_donnees dans le main, que fait telle?

for(i=0; i<=NB_PATINEUSE-1; i++)

Cela sert à rien, tu peux faire

for(i=0; i<NB_PATINEUSE; i++)

Ce évite des confusions



et ici http://www.siteduzero.com/forum-83-260 [...] html#r2352843
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 0:23:56

Salut !

Citation : Jaloyan1

Je ne vois pas trop où ta structure est déclarée


Ici (lignes 6 à 11) :
struct patineuse_type
{
    char nom[50];
    char pays[50];
    float note[NB_NOTE];
};


Citation : Jaloyan1

je ne comprends pas ta ligne qui appelle entrer_donnees dans le main, que fait telle?


Elle fait appel à la fonction pour remplir les infos pour la patineuse 0, 1, 2, 3 puis 4.
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 0:30:04

oulà, tu as défini le type patineuse_type, mais tu n'a pas déclaré de structures, relis le cours de mateo.

"entrer_donnees(struct patineuse_type i);"

Cela ne veut rien dire, si tu veux faire un tableau de structs, il faut des crochets.
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 12:11:08

J'ai enfin trouvé une solution :
#include <stdio.h>

#define NB_NOTE 9
#define NB_PATINEUSE 5

struct patineuse_type
{
    char nom[50];
    char pays[50];
    float note[NB_NOTE];
};

void entrer_donnees(int numero_patineuse, struct patineuse_type numero[NB_PATINEUSE])
{
    int i;
    printf("Entrez le nom de la patineuse : ");
    scanf("%s", numero[numero_patineuse].nom);
    printf("Entrez le pays de la patineuse : ");
    scanf("%s", numero[numero_patineuse].pays);
    for(i=0; i<=NB_NOTE-1; i++)
    {
        printf("Entrez la note n%d : ", i+1);
        scanf("%f", &numero[numero_patineuse].note[i]);
    }
}

int main(void)
{
    int i;
    struct patineuse_type candidates[NB_PATINEUSE];

    for(i=0; i<=NB_PATINEUSE-1; i++)
    {
    printf("\nEntrez les informations de la candidate n%d :\n", i+1);
    entrer_donnees(i, candidates);
    }

    fflush(stdin);
    getchar();
    return(0);
}


Je n'ai pas appris à utilisé * (pointeur de structure) en cours, donc il y avait forcément un moyen d'y arriver sans.

J'ai toujours un peu de mal à comprendre les liens entre la ligne 13 et 35.
i renvoie à int numero_patineuse : ça, je comprend
candidates renvoie à struct patineuse_type numero[NB_PATINEUSE] : j'ai plus de mal à saisir
Pourquoi il ne faut pas écrire candidates[NB_PATINEUSE] plutôt (c'est pourtant ce que j'ai déclaré ligne 30) ?

Est-ce qu'il existe une solution pour utiliser seulement une seule variable en paramètre de la fonction (comme j'essayais de faire au premier post) sans utiliser de pointeur de structure ?

Merci !
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 12:23:30

Salut

Citation : pihug12

sur le Site du Zéro, vous utilisez uniquement le mot "fonction". Notre prof nous a appris a dire "procédure" quand le sous-programme ne retourne rien (donc void) et "fonction" quand un sous-programme retourne quelque chose (int, double, float...).


Le mot "procédure" vient du pascal, pas du C. En C, qu'une fonction retourne ou pas de résultat, on peut toujours l'utiliser en "procédure". Par exemple la fonction printf est souvent utilisée en procédure, c'est à dire qu'on ne teste pas la valeur de retour et qu'on ne l'affecte pas à une variable. Elle retourne pourtant un int. Donc en C, pas de procédure, puisque chaque fonction en est une en puissance.

A+

Pfeuh
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 13:39:42

pour répondre à ta question, tu peux utiliser des références pour pas te casser la tête avec des pointeurs de structures, mais c'est du C++. Je te conseille d'aller regarder le tuto de C++.
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2009 à 14:38:41

Citation : Jaloyan1

pour répondre à ta question, tu peux utiliser des références pour pas te casser la tête avec des pointeurs de structures, mais c'est du C++. Je te conseille d'aller regarder le tuto de C++.



Oui ou te mettre à Java comme ça tu ne te casses plus la tete avec grand chose (les objets n'étants manipulés que par référence)...
Non mais c'est quoi ce conseil; tu t'es mis au C++, c'est bien, mais il faut faire la part des choses, ici on fait du C :)
------------

Citation : pihug12

Est-ce qu'il existe une solution pour utiliser seulement une seule variable en paramètre de la fonction (comme j'essayais de faire au premier post) sans utiliser de pointeur de structure ?


Tu ne le vois pas encore mais avec ce prototype :
void entrer_donnees(int numero_patineuse, struct patineuse_type numero[NB_PATINEUSE])

tu utilises déjà un pointeur; en effet c'est strictement équivalent à
void entrer_donnees(int numero_patineuse, struct patineuse_type* numero)

En fait quand tu veux envoyer un tableau à une fonction (ce que tu fais ici), on envoie l'adresse de son premier élement : c'est ce que tu fais ligne 35.

Mais si tu ne veux pas réfléchir là-dessus tout de suite laisse ça de coté, et garde ta solution qui semble la meilleur.
  • Partager sur Facebook
  • Partager sur Twitter
9 avril 2023 à 15:27:19 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


9 avril 2023 à 15:50:36

@IkramAttouch Bonjour, merci de ne pas squatter le sujet des autres, créer votre sujet dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (Un bonjour ou des salutations à la communauté et se termine par des remerciements par avances pour les futures réponses), la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter