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 :

tableau et structure


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut tableau et structure
    Bonjour et merci d'avance pour votre aide précieuse.
    je debute a peine le semestre 2 de L1..
    essayer de faire un truc pas trop compliqué
    Ne vous inquietez pas si c'est si long c'est juste quelques points qui me pose probleme dans ces exos.

    Dans le premier exo, je sais comment faire pour determiner le plus petit et le plus grand salaire.

    L’objectif de cet exercice est de vous faire manipuler un tableau de structure. Pour cela on
    utilisera un tableau personnel de 30 personnes, pour décrire le personnel d’une entreprise.
    Constante N = 30
    Type salarie = Structure
    nom : Chaîne
    salaire : Réel
    FinStructure
    variable personnel : Tableau[1..N] de salarie
    Le programme que vous devez réaliser en langage C devra, à partir du tableau personnel,
    afficher :
    a) les noms de tous les salariés qui ont un salaire strictement supérieur au SMIC (qui est de
    12541,31 €)
    b) le salaire moyen
    c) le nom du salariés ou des salariés ayant le salaire minimal et les noms de celui ou ceux
    ayant le salaire maximal.
    Réaliser un programme qui réponde à ce cahier des charges en adoptant une approche modulaire :
    décomposer le problème en sous problèmes (procédure ou fonction), test unitaire, test
    d’intégration, séparation en plusieurs fichiers, etc.
    Dernière modification par Invité ; 03/02/2007 à 13h00.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Tu ne veux pas 100€ et un mars, en plus.

    Personne n'est ici pour faire ton travail, encore moins quand il s'agit d'exercices.

    Montre-nous où tu en es, dis-nous sur quoi tu bloques, montre-nous ce que tu as déjà fait.

  3. #3
    Invité
    Invité(e)
    Par défaut
    çà fait trois jours que j'essaie non stop à coup de tutoriel et de recherche sur google ..
    le probleme c'est que je debute à peine en prog et la le coup de l'histo je vois pas comment je peux le faire
    surtout que là j'ai plus le temps vu que je dois le rendre lundi
    donc bon si vous pouviez m'aider ce serait vraiment honorable de votre part

  4. #4
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Okay mais montre nous déjà le bout de code que tu as fait

  5. #5
    Invité
    Invité(e)
    Par défaut
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void SaisirHisto (int t[5]) ;
     
    int main()
    {
     
    int tableau[5];
    SaisirHisto(tableau);
     
    system("pause");
    return 0;
    }
     
     
     
    /* procédure  */
    void SaisirHisto (int t[5]) 
    {
    float n ;
     
    do  {  
    printf("veuiller entrer des mesures reellles positives comprises entre 0,0 et 10,0 et pour terminer la saisie entrer un nombre negatif\n",n);
    scanf("%g", &n);  
    }while (10.0>n>0.0);
     
    if (n<0) {
     
             int i;
     
                    for (i=0;i<5;i++) {
                    printf("]%d,%d]:",2*i,2*(i+1));
                    } 
     
     
      }}

    donc la je comprend pas pourquoi quand je met un nbre negatif çà s'arete pas
    et quand je teste avec while ben çà bug si je met un nbre a virgule
    Dernière modification par Thierry Chappuis ; 03/02/2007 à 00h38.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nuleninfo
    Hum, ceci ne fait pas ce que tu crois. Le C, ça ne s'improvise pas, ça s'apprend.

    Ouvre ton livre de C à 'expression'.

    Au hasard : K&R2 page 43 ...

  7. #7
    Invité
    Invité(e)
    Par défaut
    j'ai pas de livre...

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nuleninfo
    j'ai pas de livre...
    C'est un tord...

    Il y a des références de tutoriels sérieux et de livres sur mon site.

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par nuleninfo
    j'ai pas de livre...
    Salut,

    Tu trouveras des ressources d'apprentissage utiles sur Developpez.com avec:
    Des cours http://c.developpez.com/cours/
    Une FAQ http://c.developpez.com/faq/c

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Invité
    Invité(e)
    Par défaut
    c'est bon j'ai reussi l'exo 1 me reste plus que le 3

    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
    #include<stdio.h>
    #include<stdlib.h>
    #define TAILLE 30
     
     
    struct MaStructure {
    	int salaire[TAILLE];
     
    	char noms[TAILLE];
     
     
    };
     
    void salaireSupSmic (int tab[TAILLE]) ;
    void moyenneSalaire (int tab[TAILLE]) ;
     
     
    int main ()
    {
    int tab[TAILLE];
     
    salaireSupSmic (tab);
    moyenneSalaire (tab);
     
     
    system("pause") ;
        return 0 ;
    }
     
    void salaireSupSmic (int tab[TAILLE])
    {
         int i;
         float salaire;
        float moyenne;
         char noms;
     
    for(i=0;i<TAILLE;i++)
         {
     
     
    if(salaire>12541,31)
    {
    scanf("%s",&noms);
    printf("les personnes dont le salaire est superieur au smic sont :\n",noms);
    }}}
     
    void moyenneSalaire (int tab[TAILLE])
    {
    int i;
    float salaire;
    float moyenne;
    float somme;
     
      somme=0 ;     
    for(i=0;i<TAILLE;i++)
     
         {
     somme=somme+salaire;
    }
    moyenne=somme/TAILLE;
    scanf("%f",&moyenne);
    printf("le salaire moyen est de :\n",moyenne);
    }
    Pourquoi çà ne marche pas ?
    Dernière modification par Invité ; 03/02/2007 à 15h37.

  11. #11
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    oulala… c'est plutôt horrible…

    Je ne compte pas faire le travail à ta place, mais je vais t'expliquer certains points.

    a. Tout d'abord, lorsque tu créés un objet comme int tableau[TAILLE], l'objet tableau est un pointeur. Un pointeur contient l'adresse d'un objet, et non pas l'objet lui-même.

    b. Ensuite, if(salaire>12541,31) n'a pas de sens en C. Tu dois l'écrire de cette façon : if((salaire>12541) && (salaire>31)).



    c.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char noms;
    /* ... */
    scanf("%s",&noms);
    Lorsque tu utilises scanf(), l'objet dans lequel la saisie de l'utilisateur va être placé DOIT avoir été alloué avant.
    Tu peux déclarer noms de cette façon :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    char noms[BUFFER_SIZE]
    BUFFER_SIZE représentant une taille suffisament importante pour que l'utilisateur puisse entrer le nom en entier sans créer d'erreur de mémoire. BUFFER_SIZE est la taille limite de caractères que l'utilisateur pourra entrer.
    Comme je l'ai dit plus haut, l'objet déclaré ici sera donc un pointeur (puisque l'on vient de créer un tableau), donc plus besoin d'ajouter le & dans ta fonction scanf():


    d. Continuons…
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("les personnes dont le salaire est superieur au smic sont :\n",noms);
    Lorsque tu utilises printf() et que tu rajoutes des arguments (ici tu as mis noms), tu dois expliquer où est-ce qu'il doit insérer cet argument. Je précise que non, il n'est pas ajouté automatiquement à la fin.
    À l'intérieur de ta chaîne de caractère ("les personnes dont le salaire est superieur au smic sont :\n"), tu dois rajouter un indicateur correspondant au type de l'argument ajouté. Si tu en utilises plusieurs, tu dois rajouter les arguments dans l'ordre respectif où ils sont indiqués dans ta chaîne de caractère par les indicateurs.
    Parmi les indicateurs, voici les plus courants:
    %s -> chaîne de caractère (char * ou char[])
    %c -> caractère (char)
    %d -> entier (int)
    %f -> nombre réel (float)

    Dans ton cas ce la donne:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("les personnes dont le salaire est superieur au smic sont :%s\n",noms);


    e. Je continue…
    Tu peux utiliser ce que tu as écrit, mais il y a plus simple:
    f. Lorsque je lis ton code, je remarque que plusieurs choses ne sont pas cohérentes.
    Tu as définis la structure MaStructure mais tu ne t'en sers pas.
    Tu déclares des variables que tu n'utilises pas.
    somme=somme+salaire; donne somme = 0 + 0;.
    Et essaie d'aérer et d'indenter correctement ton code, ça le rendra beaucoup plus facile à lire et à corriger.

    Bon bref, il te reste pas mal de choses à revoir.

    Bonne chance tout de même et bon développement

  12. #12
    Invité
    Invité(e)
    Par défaut
    j'ai pas encore fait les pointeurs ni vu BUFFER_SIZE
    Y a pas un moyen plus à ma portee ?
    Et comment je fais pour utiliser la structure ?

  13. #13
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par nuleninfo
    j'ai pas encore fait les pointeurs ni vu BUFFER_SIZE
    Je ne vois pas comment tu peux utiliser scanf() sans avoir vu les pointeurs… (alala les profs de nos jours…). Non vraiment je ne vois pas d'autre moyen que d'utiliser un pointeur, mais tu as le site que je t'ai indiqué pour comprendre ce que c'est.
    Quant à BUFFER_SIZE, c'est juste une macro que j'ai définie de la même façon que tu as défini TAILLE.
    Je définierais BUFFER_SIZE avec cette valeur:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BUFFER_SIZE 100

    Déjà, au lieu de passer un tableau de int comme argument, passe ta structure.

    Personnellement, j'ai l'habitude de déclarer mes structures de cette façon:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
         int salaire[TAILLE];
         char noms[TAILLE];
    } MaStructure;

    Comme ça tu peux utiliser le prototype suivant pour ta fonction (idem pour salaireSupSmic) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void moyenneSalaire (MaStructure tab);

    Et lorsque tu veux accéder à un objet de cette structure, tu utilises ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void moyenneSalaire (MaStructure tab)
         /* ... */
         int salaireDeLaPersonneX = tab.salaire[idDeLaPersonne]
         /* idDeLaPersonne étant une valeur comprise entre 0 et 29
            et désignant la personne n°X */
         /* ... */
    }

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Spootnik-Dev
    b. Ensuite, if(salaire>12541,31) n'a pas de sens en C. Tu dois l'écrire de cette façon : if((salaire>12541) && (salaire>31))
    En lisant un peu l'énoncé, tu aurais vu:
    Citation Envoyé par nuleninfo
    a) les noms de tous les salariés qui ont un salaire strictement supérieur au SMIC (qui est de
    12541,31 €)
    et par conséquent, certes la ligne n'est pas bonne pour du C, mais la seule erreur est d'avoir mis une virgule au lieu d'un point comme séparateur de la partie décimale, et ça n'a rien à voir avec ta proposition, qui est d'ailleurs complètement farfelue :
    si (salaire>12541), alors (salaire>31) est vrai.

    Corriger pour aider, c'est bien, mais un peu d'attention ne fait pas de mal

  15. #15
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    euh… oui, je me suis trompé en effet.
    Désolé pour cette erreur. Sur le coup j'ai pensé que ça avait un rapport avec la macro TAILLE.

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spootnik-Dev
    Personnellement, j'ai l'habitude de déclarer mes structures de cette façon:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
         int salaire[TAILLE];
         char noms[TAILLE];
    } MaStructure;
    Plutôt étrange... J'aurais dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct 
    {
       char nom[32];
       float salaire;
    } 
    MaStructure;
    Comme ça tu peux utiliser le prototype suivant pour ta fonction (idem pour salaireSupSmic) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void moyenneSalaire (MaStructure tab);
    Pour un accès en lecture seule, c'est techniquement possible, mais pas du tout efficace. Il est bien préférable de définir un pointeur sur la structure et de limiter l'accès avec const :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void moyenneSalaire (MaStructure const *p_tab);
     
    void moyenneSalaire (MaStructure const *p_tab)
         /* ... */
         int salaireDeLaPersonneX =  p_tab->salaire[idDeLaPersonne]
    }

  17. #17
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    J'ai utilisé ma façon afin d'éviter au maximum l'utilisation de pointeurs Emmanuel, vu que son professeur a décidément de drôles de méthodes, rien de plus. Quant à la façon dont tu définis la structure, ça ne permet pas d'attribuer un salaire différent à chaque personne, mais là ça dépend de l'énoncé de l'exo plutôt.

    Par contre j'ai fait une autre erreurdans la structure : char noms[TAILLE], ce qui donne une chaîne de 30 caractères au lieu de 30 chaînes de caractères, comportant chacune 100 (BUFFER_SIZE) caractères. Donc ça donne ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct 
    {
         char nom[TAILLE][BUFFER_SIZE];
         float salaire[TAILLE];
         // il est vrai que dans le cadre de ton exo, float est plus approprié
    } 
    MaStructure;

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Si ça le permet, mais en utilisant un tableau de structures plutôt qu'une structure contenant des tableaux...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Oui c'est vrai. À mon avis il faudrait déjà donner un nom plus explicite à cette structure (comme Fiche, ou Salarie) de façon à savoir plus exactement ce que l'on souhaite faire.

    Donc en résumé, ma version de la structure n'est valable que si l'on souhaite créer un structure contenant les tableaux plutôt qu'un tableau contenant les structures.

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spootnik-Dev
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct 
    {
         char nom[TAILLE][BUFFER_SIZE];
         float salaire[TAILLE];
         // il est vrai que dans le cadre de ton exo, float est plus approprié
    } 
    MaStructure;
    Ca, c'est horrible. Il faut utiliser un tableau de structures :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct 
    {
         char nom[BUFFER_SIZE];
         float salaire;
    } 
    MaStructure;
     
    MaStructure tab[TAILLE];
    ce qui simplifie considérablement le codage. Les fonctions peuvent avoir l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f (MaStructure tab[TAILLE]);
    comme ça, ni vu ni connu, j'tembrouille. Des pointeurs ? Quels pointeurs ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2006, 11h46
  2. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  4. Réponses: 9
    Dernier message: 13/02/2006, 08h39
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28

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