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 :

if instruction incontournable unique


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut if instruction incontournable unique
    Bonjour à Tous,
    Dans une boucle 1 à n je dois exclure des nombres.
    Comme la quantité de nombres a exclure est inconnue au départ
    le nombre des if à écrire est inconnu dans la boucle.
    Y a-t-il autre chose que les if pour gérer les exclusions d'une boucle?
    Une boucle dans une boucle qui s'arrête quand on ne lui demande plus d'exclusions. Jouable?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    do
    {
    ++i;
    cout<<i<< endl ;
    if (i...) {...;}///code 1..
    if (i...) {...;}///code 2..
    ///.....!!
    if(i.. && ou ||..)//quantité de codes inconnue.
    }
    while (...);
    Merci pour vos réponses.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne comprends pas trop où tu veux en venir... Pourrais-tu donner plus de détails sur ce qui fait qu'une valeur doit être gardée ou pas ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Suffit de mettre tous tes nombres dans un vecteur, tous les nombres que tu veux exclure dans un second et de faire un remove en parcourant le second vecteur.

    Quelque chose du style (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      std::vector<int> nombres = {{1,2,6,4,1,7,5}};
      std::vector<int> toRemove = {{1,4}};
      std::vector<int>::iterator end=nombres.end();
      for(int i : toRemove)
      {
          end= std::remove(nombres.begin(),end,i);
      }
      nombres.erase(end,nombres.end());
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    bonjour,
    Je ré-explique.
    Aujourd'hui les nombres de 3 à 7 sont bannis:ils n'apparaissent pas à l'écran.
    Après ou demain peu importe c'est une suite de nombres de 15 à 19 qui sont bannis et puis une autre série 21 à 22 dans la même session.
    S'il faut écrire un code if pour 3 à 7.Facile.
    Mais la fois d'après c'est 2 codes if pour 15 à 19 et 21 à 22.
    On peut continuer longtemps ainsi!!
    La quantité de séries à bannir est imprévisible donc le nombre de codes de if.. aussi.
    Je vais essayer la méthode suivante.
    Les séries à bannir sont envoyées par un programme générant des séries qui seront incluses dans un tableau les séries de nombres à bannir.
    La solution vecteur prévoit plusieurs séries mais fixes mais je suppose que les val.num. y sont paramétrables et que le programme générant les séries pourra les paramétrer.
    Mais toujours combien de if à prévoir? " Un certain nombre".
    Je pense à la solution suivante.
    Je vois une boucle avec un code if pour bannir une série ,
    boucle elle-même contenue dans une autre boucle
    qui elle s'arrête quand plus aucune série à bannir n'est présente soit quand le tableau arrive au bout ou soit quand le vecteur a été lu.
    La boucle externe lit le tableau et envoie la série du moment dans l'unique code if de la boucle interne.
    Ouf!

  5. #5
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    Peut-être qu'en créant deux boucle avec les deux parties à controler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            int i;
            int chiffreDebut = 5;
            int chiffreFin = 7;
     
            for(i = 0; i < chiffreDebut; i++)
            cout<<i<< endl ;
     
            for(i = chiffreFin + 1; i < fin; i++)
            cout<<i<< endl ;

  6. #6
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    oui mais 2 boucles imbriquées.. pas successives.
    Je viens de commencer à tester
    mais le problème est qu'il faut recharger la ligne de code if dès la fin de la première série de nombres bannis
    et reprendre le comptage qu'on vient d'interrompre.
    Je pense que je vais y arriver.
    Merci pour vos idées.
    J'attends la fin de la journée pour quelque chose de nouveau puis j'inscrirai "résolu".

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vector aTraiter;
    vector aExclure;
     
    pour chaque élément de aTraiter:
      si l'élément se trouve dans aExclure
        passer à l'élément suivant
      faire traitement sur l'élément
    Le if est irremplaçable. Ton problème n'est pas de remplacer un if mais d'avoir une idée correcte et un rangement adéquats des données.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    On peut s'en sortir avec un std::remove_if, suivi d'un .resize.

    Pour remove_if, un prédicat de ce style fait l'affaire:
    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
    // Contient un interval à ban
    struct Ban {
    	const int start;
    	const int end;
     
    	Ban(int s, int e): start(s), end(e) { }
    };
     
    // Prédicat pour remove_if
    struct predBan {
     
    	predBan(const std::vector<Ban>& banList): m_banList(banList) { }
     
    	bool operator()(int val) {
    		for(const Ban& b: m_banList) {
    			if(val >= b.start && val <= b.end) {
    				return true;
    			}
    		}
    		return false;
    	}
     
    private:
    	std::vector<Ban> m_banList;
    };
    L'utilisation après est simple:
    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
    std::vector<Ban> banlist;
    banlist.push_back(Ban(5, 7)); // ban 5 6 7
    banlist.push_back(Ban(10, 11)); // ban 10 11
     
    std::vector<int> values;
    for(int i=0; i<15; ++i) {
    	values.push_back(i);
    }
     
    // affichage avant suppression
    for(int i: values) {
    	std::cout << i << " ";
    }
    std::cout << std::endl;
     
    // suppression, remove_if ne supprime pas les valeurs, mais les place à la fin
    // resize permet de les supprimer, une fois qu'elle sont regroupées à la fin
    auto it = std::remove_if(values.begin(), values.end(), predBan(banlist));
    values.resize(it - values.begin());
     
    // affichage apres suppression
    for(int i: values) {
    	std::cout << i << " ";
    }
    std::cout << std::endl;
    Résultat:
    ira@linux-i7ac:~/projects> g++ -std=c++0x test.cpp -o test && ./test
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
    0 1 2 3 4 8 9 12 13 14

  9. #9
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    J'y travaille et çà avance bien:
    un tableau des nombres à bannir, tableau rempli automatiquement par un code maîtrisable,
    lecture du tableau ligne par ligne,
    modification des paramètres de la ligne de if(INCONTOURNABLE)
    arrêt de la boucle de liste des nombres à gérer dès que nécessaire
    retour au tableau des nombres à bannir
    donc nouveaux paramètres de la ligne de if
    reprise de la liste à gérer à la sortie précédente
    Et on espère une bonne fin!!!!
    Donc merci à vous tous.
    Je modifie le titre: if est incontournable.
    Je viens de relire des posts:la liste des nombres est une liste dont on suspend
    la lecture puis on la reprend à n+1.Il ne s'agit pas d'effacer les nombres de la liste.Je vais réfléchir à la faisabilité avec mes petits moyens:A+++

  10. #10
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    Et je ne vous avait pas tout dit..je résume:
    une suite continue de nombres de A à Z contient des bannis qui ne doivent pas reçevoir de correspondants..
    A B C D E F G H I J K
    * - *** - -*****-**
    ..d'une suite tournante 0 à x:arrivé au bout on recommence ici de 1 à 9.
    A B C D E F G H I J K
    1*2 - 3 4 - - 5 6 - 7
    Il fallait savoir que
    la liste A à Z commence quelque part tiens en B..
    et que la liste A à Z fini quelque part tiens en W..
    et que la liste 0 à x démarre quelque part tiens en 6..
    Donc je cherche à construire:
    B C D E F G H I J K
    * -*** - -***-
    6*- 7 8 - - 9 1- 2.
    Finalement c'est simple.
    C'est le coup du vecteur avec ses valeurs uniques
    et l'utilisation d'un tableau de chaîne de 2 caractères qui ont beaucoup simplié
    le code de cette version par rapport à la une.
    Mon code avec if est devenu plus lisible.
    Encore merci à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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