Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité de passage
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Problème de programmation avec triage par extraction

    Bonjour,
    Je rencontre un problème avec mon programme qui à terme doit m'afficher la moyenne des 5 données les plus élevés de mon tableau (pouvant contenir entre 7 et 20 données rentrées par l'utilisateur) après avoir utilisé un méthode de triage par extraction du minimum.
    En effet lorsque je le lance, celui-ci ne s’exécute pas. Pourtant code::blocks ne détecte aucune erreur de saisie.
    Pourriez-vous m'aidez s'il vous plaît ?

    Voici mon programme:
    Code :
    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
     
    #include <stdio.h>
     
    #define VALMAX 20   // nombre max de valeurs
     
    int main(void)
    {
        int tab[VALMAX];   // le tableau des salaires
        int ind;          // indice de parcours du tableau
        int sal;        //salaire lu au clavier
        int nbval;      // nombre de valeurs dans le tableau (entre 7 et VALMAX)
        int aux;          // variable auxiliaire de permutation
        int nbtriees;       // nombre de cases trièes
        float moy;      //moyenne des salaires
        int min;
        int somme;      /* somme des mesures */
     
        // lire la série de valeur terminée par - 1
       /* lire la première valeur */
       printf("Donner le 1er salaire : ");
       scanf("%i", &sal);
       nbval = nbval++;
     
       /* tant que ce n'est pas la sentinelle */
       while(sal != -1)
       {
            /* c'est une "bonne" valeur : la compter dans le tableau */
          tab[sal]++;
          /* lire la valeur suivante (il reste au moins la sentinelle à lire */
          printf("Donner le salaire suivant : ");
          scanf("%i", &sal);
          nbval = nbval++;
       }
     
        /* méthode du tri par extraction du minimum */
        for(nbtriees = 0; nbtriees < nbval - 1; nbtriees++)
        {
            min = nbtriees;
            for(ind = nbtriees + 1; ind < nbval; ind++)
            {
                if(tab[ind] < tab[ind+1])
                    {
                        min = ind;
                    }
                if(min != nbtriees)
                {
                   aux = tab[nbtriees];
                   tab[nbtriees] = tab[min];
                   tab[min] = aux;
                }
                    }
     
                }
             /* calculer la moyenne des 5 plus grand salaires (somme puis division par 5) */
           somme = 0;
           for (ind = 0 ; ind < 5 ; ind++)
           {
               somme = somme + tab[ind];
           }
           moy = somme * 1.0 / 5;
     
         /* afficher la position du min au dessus de la moyenne */
           printf("Moyenne des 5 salaires les plus élevés : %d", moy);
     
           return 0;
        }

  2. #2
    Expert Confirmé Sénior

    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 13 489
    Points
    13 489

    Par défaut

    - nbval non initialisé
    - nbval = nbval++; a un comportement indéfini. ici nbval++; suffit

  3. #3
    Invité de passage
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Programme se ferme pendant son exécution

    Merci pour votre réponse.
    Lorsque j'exécute mon programme et que je rentre une valeur négative (valeur sentinelle) afin d'arrêter la saisie, le programme se ferme.
    Seulement je n'arrive pas à voir où se situe l'erreur.

  4. #4
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 127
    Points : 35 206
    Points
    35 206

    Par défaut

    Es-tu sûr que le programme ne se termine pas normalement? Je ne sais pas si Code::Blocks rajoute une pause à la fin des programmes console comme le fait Visual.

    Si tu n'est pas sûre, ouvre un invite de commandes et exécute ton programme dedans.
    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.

  5. #5
    Invité de passage
    Profil pro Victor Constantin
    Inscrit en
    avril 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Nom : Victor Constantin

    Informations forums :
    Inscription : avril 2010
    Messages : 1
    Points : 1
    Points
    1

    Par défaut

    Salut,

    Premièrement dans le while tu ne teste jamais le nombre de fois que tu as déjà écris. Il faudrait avoir quelque chose comme ca par exemple :
    Code :
    while (sal != -1 && nbval < VALMAX)
    Deuxièmement, pour assigner la valeur sal dans ton tableau, il faudrait faire comme ca :
    où indice est l'endroit dans lequel il faut placer sal

    A ma connaissance, quand tu fais tab[sal]++ ca retourne l'espace mémoire situé à (sal + 1) ints du début du tableau

    Donc je mettrais un while qui ressemblerait à ca :
    Code :
    1
    2
    3
    4
    5
    while (sal != -1 && nbval < VALMAX){
         tab[nbval] = sal;
         nbval++;
         ...
    }
    avec nbval initialisé à 0.

    J'ai pas regardé plus loin, mais commence déjà avec ca.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •