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 :

Comment retourner un tableau en utilisant des structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Lyceen
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Maroc

    Informations professionnelles :
    Activité : Lyceen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut Comment retourner un tableau en utilisant des structures
    Bonjour à tout le monde
    j'ai un problème à résoudre mais je j'ai trouvé devant moi quelques obstacles.
    J'ai essayé de faire un programme en C qui permet de gérer les nom, les notes et leurs moyennes en utilisant une structure et des fonctions.
    Je vous donne ma réponse.
    et merci pour votre aide.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
    char nom[15];
    char prenom[15];
    int identifiat;
    float note[6];
    float moyenne;
    }Etudiant;
    int i,j;
    // fonction et procedure
     
    void saisie(Etudiant *E,int nbE){
      for(i=0;i<nbE;i++){
        printf("\n\t\t************ L'information de l'etudiant %d\n",i+1);
        printf("\n donnenr le nome :");
        scanf("%s",E[i].nom);
        printf("\n donnenr le prenome :");
        scanf("%s",E[i].prenom);
        printf("\n donnenr CNE  :");
        scanf("%d",&E[i].identifiat);
        for(j=0;j<6;j++){
            printf("donner la note du module %d:",j+1);
            scanf("%f",&E[i].note[j]);
        }
     
       }
     
     
    }
    void affiche(Etudiant *E,int nbE){
        printf("\n***************************************************************\n");
        printf("Nom\tprenom\tNote1\tNote2\tNote3\tNote1\tNote2\tNote3\tMoyen\n");
      for(i=0;i<nbE;i++){
     
         printf("\n%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f",E[i].nom, E[i].prenom, E[i].note[0], E[i].note[1], E[i].note[2], E[i].note[3], E[i].note[4], E[i].note[5], calculMoyen(E,nbE));
     
         printf(" \nla moyenne des moyennes de %d Etudiant  est :%.2f\n",nbE,moyClasse(E,nbE));
         printf(" \nle nombre d'etudiants ayant la moyenne superieure a 10 est :%d\n",etudiantSup(E,nbE));
         printf(" \nle nombre d'etudiants ayant la moyenne inferieure a 10 est :%d\n",etudiantInf(E,nbE));
         printf("\n***************************************************************\n");
     
     
      }
      return 0;
    }
     
    float calculMoyen(Etudiant *E,int nbE){
        float somme;
    for(i=0;i<nbE;i++){
        somme=0.0;
        for(j=0;j<6;j++){
     
            somme+=E[i].note[j];
     
        }
         E[i].moyenne=somme/2;
     
       }
     
       return E[i].moyenne;
    }
    int etudiantSup(Etudiant *E,int nbE){
        int nbSup=0;
     
    for(i=0;i<nbE;i++){
     
        if(calculMoyen(E,nbE)>=10.0){
            nbSup++;
     
        }
     
    }
      return nbSup;
    }
    int etudiantInf(Etudiant *E,int nbE){
        int nbInf=0;
     
    for(i=0;i<nbE;i++){
     
        if(calculMoyen(E,nbE)<10.0){
            nbInf++;
     
        }
     
    }
      return nbInf;
    }
    float moyClasse(Etudiant *E,int nbE){
    float moyDemoy;
    float somme=0.0;
     for(i=0;i<nbE;i++){
        somme+=calculMoyen(E,nbE);
     }
     moyDemoy=somme/nbE;
     return moyDemoy;
    }
     
    int main()
    {
        Etudiant E[20];
        int nbE;
     
     
    printf("donner le nombre d'etudiant: ");
    scanf("%d",&nbE);
    saisie(E,nbE);
    system("cls");
    calculMoyen(E,nbE);
    etudiantSup(E,nbE);
    etudiantInf(E,nbE);
    affiche(E,nbE);
     
     
     
        return 0;
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    quel est le problème ?
    Retourner un tableau ? En C il va falloir retourner un truc alloué via malloc, et c'est l'appelant qui aura la responsabilité de le libérer via free.
    Ou bien tu peux passer en paramètre de la mémoire déjà allouée et que la fonction ne fera que remplir.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Le C ne permet pas de retourner un tableau. Pour la simple raison que lorsqu'une fonction retourne une variable, elle ne retourne en réalité que la valeur de la variable tandis que la variable (locale à la fonction) est libérée et donc disparait lorsque la fonction se termine. Donc une valeur retournée ça peut passer, tout un tableau ça ne passe pas.
    C'est aussi la même raison qui fait que retourner l'adresse d'une variable est source de bug puisque l'appelant récupère l'adresse d'un truc qui a été détruit.

    2 solutions de qualité pour qu'une fonction puisse modifier un tableau "extérieur"
    1. la fonction reçoit le tableau de l'appelant et peut alors le remplir => ce n'est donc pas un tableau local à la fonction et donc qui ne disparait pas quand la fonction se termine
    2. la fonction alloue une zone d'octets via malloc. Cette allocation se fait dans une zone mémoire globale au programme appelée "le tas". La zone n'est donc pas libérée lorsque la fonction se termine. La zone se comporte comme un tableau et donc peut y être assimilée. Ensuite la fonction peut retourner l'adresse de cette zone (une simple valeur) à son appelant qui a alors lui aussi accès à la zone (au tableau). Il faudra tout de même penser à libérer cette zone à un moment ou un autre => free()


    Il existe une 3° solution: définir le tableau en global. Mais cette solution n'est pas une solution de qualité.
    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]

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu peux passer un tableau par valeur s'il est membre d'un objet de classe struct en passant ledit objet.

  5. #5
    Membre du Club
    Homme Profil pro
    Lyceen
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Maroc

    Informations professionnelles :
    Activité : Lyceen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut
    Bonjour
    Merci de me donner un exemple pour mieux comprendre.
    une structure (char nom,float facture[2])
    une fonction qui calcule la somme
    une fonction d'affichage.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par aitlhaj1 Voir le message
    Merci de me donner un exemple pour mieux comprendre.
    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
    15
    16
    17
    18
    #include <stdio.h>
    #include <string.h>
     
    typedef struct {
    	char tab[10];
    } t_truc;
     
    t_truc fonction() {
    	t_truc machin;
    	strcpy(machin.tab, "Hello");
    	return machin;
    }
     
    int main() {
    	t_truc truc;
    	truc=fonction();
    	printf("%s\n", truc.tab);
    }

    C'est vrai que c'est une solution. Solution que je n'apprécie pas forcément (l'ensemble de la structure est recopiée => si la structure fait 500 000 octets et que la fonction est appelée 400 000 fois...)
    mais c'est aussi une possibilité...
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment retourner un tableau de double à VBA
    Par geminium dans le forum Général VBA
    Réponses: 2
    Dernier message: 01/06/2007, 19h11
  2. Réponses: 4
    Dernier message: 23/03/2007, 09h40
  3. Comment retourner un tableau de valeurs?
    Par DOC doc doc dans le forum C++
    Réponses: 6
    Dernier message: 20/03/2007, 16h28
  4. Débutant: Question sur l'utilisation des structures
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/10/2006, 13h03
  5. [plpgsql] comment retourner un tableau
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 21h09

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