IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

structure et définition en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    visiteur
    Inscrit en
    Décembre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : visiteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2019
    Messages : 21
    Points : 8
    Points
    8
    Par défaut structure et définition en C
    Bonjour

    j'aimerai savoir si il y a des erreurs dans ma structure et mes définitions sont correctes svp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    struct etudiant_s
    {
        char nom[25];
        char prenom[25];
        int n_etudiant;
        date_t naissance; 
    };
    typedef struct etudiant_s etudiant_t;
    // le champs naissance doit être de type date_t que je considère ici déjà fait  
     
     
    etudiant_t creer_etudiant(char chaine1[], char chaine2[], int num, date_t naissance)
    {
    strcpy(e.nom,chaine1);
    strcpy(e.prenom,chaine2); 
     
    e.n_etudiant=num;
    e.date=naissance; 
    return e; 
    }
    // qui prend en arguments deux chaınes de caracteres, un entier et une date, et
    //renvoie un etudiant 
     
     
    void afficher_etudiant(etudiant_t e)
    {
        printf("%s%s%d\n", e.prenom, e.nom, e.n_etudiant);
        afficher_date(e.date);
    }
    //qui prend en argument un etudiant et affiche son contenu,cette fonction ne renvoie pas de valeur
     
     
     int comparer_etudiant_age(etudiant_t e1, etudiant_t e2)
    {
    int res=0;
     
    if(e1.date.annee==e2.date.annee)
    {
     res=0;
    }
     
    else if(e1.date.annee>e2.date.annee)
    {
    res=1;
    }
     
    else
    {
    res=-1;
    }
     
    return res;
    }
    //qui prend en arguments deux etudiants et renvoie 0 si les deux etudiants
    //ont exactement le meme age, −1 si le premier est plus agés que le deuxieme et 1 si le premier est plus
    //jeune que le deuxieme.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Un bon moyen de vérifier ton code, c'est de le compiler. Le compilateur t'indiquera certaines erreurs.

    Par exemple :
    - ligne 6, le type date_t est utilisé alors qu'il n'a pas été défini avant.
    - ligne 14, remplissage d'un objet inconnu e.
    - ligne 27, une espace entre les %s permettrait d'avoir un affichage sans coller les mots (pour voir ça il faut compiler et exécuter le programme.)
    - ligne 28, où est définie la fonction afficher_date()?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    visiteur
    Inscrit en
    Décembre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : visiteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2019
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    bonjour

    J'ai déjà fait la structure date_t et afficher_date avant mais je voulais juste savoir si mes structures sont correctes car je viens de commencer cette partie en C.
    Par contre pour la ligne 14 c'est vraie que j'ai oublié de rajouter etudiant_t e merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    struct etudiant_s
    {
        char nom[25];
        char prenom[25];
        int n_etudiant;
        date_t naissance; 
    };
    typedef struct etudiant_s etudiant_t;
    // le champs naissance doit être de type date_t que je considère ici déjà fait  
     
     
    etudiant_t creer_etudiant(char chaine1[], char chaine2[], int num, date_t naissance)
    {
     
    etudiant_t e;
     
    strcpy(e.nom,chaine1);
    strcpy(e.prenom,chaine2); 
     
    e.n_etudiant=num;
    e.date=naissance; 
    return e; 
    }
    // qui prend en arguments deux chaines de caractères, un entier et une date, et
    //renvoie un etudiant
     
     
    void afficher_etudiant(etudiant_t e)
    {
        printf("%s%s%d\n", e.prenom, e.nom, e.n_etudiant);
        afficher_date(e.date);
    }
    //qui prend en argument un etudiant et affiche son contenu,cette fonction ne renvoie pas de valeur
     
     
     int comparer_etudiant_age(etudiant_t e1, etudiant_t e2)
    {
    int res=0;
     
    if(e1.date.annee==e2.date.annee)
    {
     res=0;
    }
     
    else if(e1.date.annee>e2.date.annee)
    {
    res=1;
    }
     
    else
    {
    res=-1;
    }
     
    return res;
    }
    //qui prend en arguments deux etudiants et renvoie 0 si les deux etudiants
    //ont exactement le meme age,   −1 si le premier est plus agés que le deuxieme et 1 si le premier est plus
    //jeune que le deuxieme.
    sinon tout est bon ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Il y a plein de choses à faire

    Tu peux concaténer la définition et le typedef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct etudiant_s {
        char nom[25];
        char prenom[25];
        int n_etudiant;
        date_t naissance; 
    } etudiant_t;

    Pas la peine de passer des chaines de caractères :
    etudiant_t creer_etudiant(char* chaine1, char* chaine2, int num, date_t naissance)
    Et il faut tester les pointeurs NULL ... et donner des noms de variables explicites

    Attention au retour de creer_etudiant : il faut ne pas retourner une variable locale. Dans ce cas, il faut passer un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    unsigned char creer_etudiant(etudiant_t* e, char* nom, char* prenom, int num, date_t naissance) {
        unsigned char ret;
     
        if (e != NULL) {
            if (nom != NULL) {
    //          copy nom
            } else {
                e->nom = NULL;
            }
     
            if (prenom != NULL) {
    //          copy prenom
            } else {
                e->prenom = NULL;
            }
     
            ret = 1;
        } else {
            ret = 0;
        }
     
        return ret;
    }

    Pour la fonction void afficher_etudiant(etudiant_t e), il faut passer un pointeur (avec un test NULL) au lieu de copier toute la structure sur la pile

    Pour la fonction int comparer_etudiant_age(etudiant_t e1, etudiant_t e2), il faut mieux utiliser un ternaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int comparer_etudiant_age(etudiant_t* e1, etudiant_t* e2) {
         return  ((e1->date.annee == e2->date.annee)? 0: ((e1->date.annee > e2->date.annee)? 1: -1));
    }
    Par contre pour gérer les pointeurs NULL faire 1 macro ? utiliser une 4ième valeur pour le retour ? passer en paramètre pointeur le retour avec un booléen pour dire si tout c'est bien passé ? Tester avant l'appel (dangereux) ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tu compares que l'année pour tes étudiants ?
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int comparer_etudiant_age(etudiant_t* e1, etudiant_t* e2) {
    	if (e1->date.annee < e2->date.annee) return -1;
    	if (e1->date.annee > e2->date.annee) return 1;
     
    	if (e1->date.mois < e2->date.mois) return -1;
    	if (e1->date.mois > e2->date.mois) return 1;
     
    	if (e1->date.jour < e2->date.jour) return -1;
    	if (e1->date.jour > e2->date.jour) return 1;
     
    	// Ici possibilité de rajouter facilement les heures, minutes et secondes si besoin plus tard...
     
    	return 0;
    }

    Sinon foetus a raison. Chaque fois que tu passes une structure à une fonction, il y a recopie de tout son contenu (long). Vaut mieux passer l'adresse de la structure à ta fonction (copier une adresse est plus rapide que copier tout son contenu). Et accessoirement le suffixe "_t" est réservé aux types de la librairie standard (size_t, ptr_t, etc). Les types persos doivent être préfixés "t_" et non suffixés "_t".

    Et puis apprends à indenter ton code !!! Un code ça doit s'écrire mais aussi pouvoir être relu !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    visiteur
    Inscrit en
    Décembre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : visiteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2019
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    merci pour vos explications, cependant j'aurai une dernière question. J'ai crée une fonction comparer_date qui est la suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    int comparer_date(date_t d1, date_t d2)
    {
    	if(d1.annee < d2.annee)
    	{
    		return 1;
    	}
    	if(d1.annee > d2.annee)
    	{
    		return -1;
    	}
     
    	if(d1.mois < d2.mois)
    	{
    		return 1;
    	}
    	if(d1.mois > d2.mois)
    	{
    		return -1;
    	}
     
     
    	if(d1.jour < d2.jour)
    	{
    		return 1;
    	}
    	if(d1.jour > d2.jour)
    	{
    		return -1;
    	}
    	else{
    		return 0;
    	}
    }
    j'aimerai maintenant l'utiliser pour ma fonction comparer etudiant age mais je n'arrive pas à mis prendre, pouvez vous m'expliquer svp

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blue_42 Voir le message
    J'ai creer une fonction comparer_date
    Mouais. La même que la mienne en moins bien. T'as vraiment besoin du "else" final ???

    Citation Envoyé par blue_42 Voir le message
    j'aimerai maintenant l'utiliser pour ma fonction comparer etudiant age mais je n'arrive pas à m'y prendre, pouvez vous m'expliquer svp
    etudiant_t e1, e2; comparer_date(e1.naissance, e2.naissance).
    Et la remarque sur les fonctions qui ont tout avantage à recevoir les adresses de structures s'applique aussi à ta fonction "comparer_date" !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Futur Membre du Club
    Homme Profil pro
    visiteur
    Inscrit en
    Décembre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : visiteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2019
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    etudiant_t e1, e2; comparer_date(e1.naissance, e2.naissance).
    Et la remarque sur les fonctions qui ont tout avantage à recevoir les adresses de structures s'applique aussi à ta fonction "comparer_date" !!!
    Oui je sais que ma fonction n'est pas courte ... mais je préfère, pour l'instant, faire des programmes que je comprends et qui sont simples même si c'est un peu long. Je viens de commencer le chapitre sur les structures, mon but est vraiment de, d'abord comprendre comment les manipuler, puis ensuite les améliorer.

    Citation Envoyé par Sve@r Voir le message
    Mouais. La même que la mienne en moins bien. T'as vraiment besoin du "else" final ???
    je l'avais déjà crée avant de poster mon message dans se forum

Discussions similaires

  1. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34
  2. Aide pour diagramme de structure des données
    Par DeezerD dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/12/2004, 19h10
  3. Méta-Programmation - [ structures de données ]
    Par Dam)rpgheaven dans le forum C++
    Réponses: 3
    Dernier message: 03/12/2004, 19h38
  4. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15
  5. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo