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 :

Supprimer les valeurs nulles d'un tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut Supprimer les valeurs nulles d'un tableau
    Bonjour à tous,

    Je suis en 1ère année d'IUT informatique et je dois réaliser un petit programme qui permet de saisir des valeurs dans un tableau puis de supprimer les valeurs négatives. C'est là que je bloque...
    Voici ce que j'ai réussi à faire :

    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
     
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        const float STOP=-999.0;
        const int MAXR=10;
        float tab[MAXR], val;
        int i, j=0, nbVal=0;
        cout << "Entrez un reel " << STOP << " pour finir." << endl;
        cin >> val;
        while (val!=STOP && (nbVal < MAXR))
        {
            tab[nbVal]=val;
            nbVal++;
            cin >> val;
        }
        if (val != STOP)
        {
            cout << "Il n'est pas possible d'enregistrer la derniere valeur saisie (" << val << ")." << endl;
        }
        for (i=0 ; i < nbVal; i++)
        {
            cout << tab[i] << " ";
        }
        for (i=0 ; i < nbVal ; i++)
        {
            if (tab[i]!=0)
            {
                tab[j] = tab[i];
                j = j++;
            }
        }
        cout << endl << "Voici vos valeurs nettoyees des valeurs nulles (" << nbVal << ") :" << endl;
        for (i=0 ; i < nbVal ; i++)
        {
            cout << tab[i] << " ";
        }
        return 0;
    }
    Le problème est que je n'arrive pas à arrêter la boucle au bon moment.
    En effet, en entrant 14 0 -5 2 0 0 1 -2 j'obtiens :
    "Voici vos valeurs nettoyees des valeurs nulles (8) :
    14 -5 2 1 -2 0 1 -2"
    J'ai fait d'autres tentatives mais rien de concluant...
    J'espère donc que vous voudrez bien m'aider ou me donner des pistes

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Ton algorithme fonctionne. Tu as bien 3 0, et si tu ne regardes que les 6 premières valeurs, tu as bien ton résultat.

    Ton seul problème est le comptage des valeurs valides. A un moment donné, il faut bien dire qu'une valeur n'est pas gardée - du coup, la taille de l'ensemble des données diminue. Elle ne peut pas diminuer pendant la vérifications des valeurs, mais c'est à ce moment là que tu sais s'il faut en supprimer une ou non. Une solution possible : passe par un index supplémentaire, qui compte les valeurs supprimées.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Merci j'ai maintenant compris mon erreur.
    Mais je ne vois pas du tout comment supprimer les valeurs en trop

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Ton code marche, tu as seulement fait une erreur d’inattention à la fin. Je me suis permis de récrire ton code pour la trouver (j'ai commenté pour que tu comprennes bien tout) :

    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
    #include <iostream>
     
    #define STOP		-999
    #define MAX_COUNT	10
     
    using namespace std;
     
    int main ()
    {
    	int tab1[MAX_COUNT], // Tableau qui contient les valeurs utilisateurs
    	tab2[MAX_COUNT], // Tableau qui contiendra uniquement les valeurs != 0
    	input_value = 0, // valeur utilisateur
    	input_count = 0, // compteur de valeur utilisateur
    	tab2_size = 0; // compteur pour la taille du tableau 2
     
    	while (input_count < MAX_COUNT) // Tant qu'on a pas entré 10 valeurs
    	{
    		cin >> input_value;
     
    		if (input_value == STOP) // Si la valeur est un STOP, on sort de la boucle while()
    			break;
     
    		tab1[input_count++] = input_value; // Insère la valeur à l'index numéroté "input_count" puis incrémente l'index
    	}
     
    	for (int i = 0 ; i < MAX_COUNT ; ++i) // Tant qu'on a pas atteint la dernière valeur de tab1
    	{
    		cout << "tab [" << i << "] = " << tab1[i] << endl; // On affiche : "tab [1] = X"
     
    		if (tab1[i] != 0) // Si la valeur est != 0
    		{
    			tab2[i] = tab1[i] // On la copie dans tab2
    			++tab2_size; // On a bien ajouté une valeur à tab2, on augmente donc son compteur
    		}
    	}
     
    	cout << "Voici vos valeurs nettoyees de " << tab2_size << " valeurs nulles :" << endl;
     
    	for (int i = 0 ; i < tab2_size ; ++i) // On affiche tab2
    		cout << "tab2 [" << i << "] = " << tab2[i] << endl;	
     
    }
    Dans ton propre code, dans cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i=0 ; i < nbVal ; i++)
        {
            if (tab[i]!=0)
            {
                tab[j] = tab[i];
                j = j++;
            }
        }
    Mettons que tu as mis 10 valeurs dans ton tableau, dont 2 égales à 0 : { 10, 54, 13, 0, -68, 0, 78, 99, 151, -42 }.

    Avec cette boucle, tu vas vérifier chaque valeur et si elle est égale à 0 tu la remplaces par la valeur suivante si elle-même est != 0. Tu vas donc pour finir te retrouver avec : { 10, 54, 13, -68, 78, 99, 151, -42, 151, -42 }.
    Pour finir ça remplit la fin du tableau avec les dernière valeurs possibles, sans tester si un 0 est présent (d'où ton résultat).

    Ton erreur est donc de vouloir remplacer les valeur à l'intérieur du même tableau ! La solution serait simplement de créer un deuxième tableau.
    Dans ta boucle, tu testes si la valeur est != 0, si oui tu copies la valeur dans le 2ème tableau, sinon tu passes à la suivante (il faut garder un compteur pour connaître la taille finale du deuxième tableau puisqu'il dépendra des entrées utilisateurs). Tu peux voir ça dans mon code, d'ailleurs.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    J'hallucine.
    La liste des trois problèmes a déjà été donnée (sans parler des corrections)
    - incrément
    - MAJ du nombre d'éléments
    - nullité des float
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    @Nekkro : Merci mais je ne dois pas utiliser de tableau secondaire.

    @Luc Hermitte : Je cherche sur plusieurs forums pour obtenir une solution plus rapidement, où est le mal ? Il n'y a aucun problème au niveau de l'incrémentation ni du test de nullité, le programme se comporte de manière prévisible. Le problème, c'est juste la suppression des valeurs en trop dans le tableau final.

Discussions similaires

  1. Comment supprimer les valeurs nulls dans un champ
    Par souhail72 dans le forum Formules
    Réponses: 3
    Dernier message: 15/01/2014, 10h13
  2. Supprimer les valeurs nulles d'un graphe
    Par usul3 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/03/2012, 18h05
  3. [XL-2007] supprimer les valeurs nulles
    Par iliesss dans le forum Excel
    Réponses: 3
    Dernier message: 06/02/2011, 18h47
  4. Masquer les valeurs nulles dans un tableau
    Par cabville dans le forum Débuter
    Réponses: 9
    Dernier message: 24/10/2010, 21h00
  5. Réponses: 7
    Dernier message: 02/06/2009, 09h32

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