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++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    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
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    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 du Club
    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
    Points : 65
    Points
    65
    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 éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    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.

  7. #7
    Membre du Club
    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
    Points : 65
    Points
    65
    Par défaut
    Dans un tableau de type int[], on ne peut simplement pas effacer/supprimer les valeurs.

    Si vous avez 10 valeurs de base dont 2 zéros, gardez le code initial mais n'affichez que les 8 premières valeurs.

    Pouvez-vous utiliser un vector ? Si oui vous pourrez les effacer.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Non je ne peux pas utiliser de vector.
    Mais je vais me contenter de n'afficher que les valeurs correctes. Merci de ton aide

  9. #9
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Une fois de plus, un bel exemple du fait qu'il est presque toujours meilleur d'utiliser un vecteur plutôt qu'un tableau ! Mais j'imagine que c'est l'enseignant qui l'a interdit...

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par Pumataghju Voir le message
    @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.
    La solution t'a pourtant bien été donnée à moult reprises.
    hum ... j'essaie de voir pourquoi tu ne la vois pas ...
    J'ai deux pistes:
    - soit ta définition d'un tableau (à la C) n'est pas correcte. Du coup donne nous la tienne.
    - soit tu n'as pas encore fait de simulation papier-crayon (cette étape peut paraitre ridicule, mais elle est très importante au début de l'apprentissage -- une fois expérimentés, on devient capable de la reproduire dans la tête sans rien poser par écrit, quoique parfois on y revient pour les algos les plus complexes)


    PS: je t'assure que j=j++; est une écriture à bannir définitivement! Je laisse à d'autre le soin d'enfoncer le clou sur les points de séquence s'ils s'ennuient.
    PPS: et que le test ==0/!=0 est également incorrect -- chose que tu ne verras pas avant quelques calculs sur les floats il est vrai, d'où ton faux sentiment de sécurité pour l'instant.

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Chercher des réponses sur différents forum pour que ton exo soit rapidement fait... sans même que tu comprennes pourquoi ni essayer de corriger ses erreurs soit même... Tu ne vas jamais progresser dans cette optique la...

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