Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/12/2012, 17h38   #1
scarfacegirl
Invité de passage
 
Femme
Inscription : 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;
    }
scarfacegirl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 18h03   #2
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 435
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 435
Points : 12 967
Points : 12 967
- nbval non initialisé
- nbval = nbval++; a un comportement indéfini. ici nbval++; suffit
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 18h51   #3
scarfacegirl
Invité de passage
 
Femme
Inscription : 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.
scarfacegirl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h15   #4
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 395
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

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

Informations forums :
Inscription : septembre 2005
Messages : 22 395
Points : 32 045
Points : 32 045
Envoyer un message via MSN à Médinoc
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.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 20h51   #5
MrRelodeable
Invité de passage
 
Victor Constantin
Inscription : avril 2010
Messages : 1
Détails du profil
Informations personnelles :
Nom : Victor Constantin

Informations forums :
Inscription : avril 2010
Messages : 1
Points : 1
Points : 1
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.
MrRelodeable est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h33.


 
 
 
 
Partenaires

Hébergement Web