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 :

Pair et impair


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 239
    Par défaut Pair et impair
    salut

    en faite je voulez savoir est ce que quelque peux m'aider à résoudre mon problème. je vais m'expliquer:
    apres avoir allouer une zonne mémoire dans la ram (GlobalAlloc) je voudrais transferer les pixel d'une image dans cette zone.mais le problème ce pose maintenent: car je voulais charger les pixel a indice pair (ie: 0 2 4 6 8 10 ) et les nommé S0 et les pixel a indices impair nommés D0, la premiere aide est d'ecrire:
    for(int i=0;i<wd;i++){
    for(int j=0;j<ht;j++)
    {
    verefier la parite de i

    si i est pair

    ecrire S0 ds la valeur dans la ram
    sinon ecrire D0 ds la ram
    }

    et mon probleme j'arrive a ecrire un programme qui fait verifier la parité de i, est ce quelque un peut m'aider.

    merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Bonjour,

    je ne suis pas sûr d'avoir bien cerné le problème, mais si ton problème est de savoir si un nombre est pair, le test suivant fais l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // soit un int i
    if (i%2==0)
    {
        std::cout << "i est pair: i = " << i << std::endl;
    }
    else
    {
        std::cout << "i est impair: i = " << i << std::endl;
    }
    hope it helps.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    Il utilise l'opérateur modulo '%' ( reste de la division entière par )
    pour connaître la parité de i.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 239
    Par défaut
    j'ai déja utiliuser cette méthodes mais le programme est tres lent.

    une fois j'ai trouvé sur un forum c++, un forumer a donner une instruction qui permet de charger les pixels pair puis les pixel impair.mais j'ai pas encore réussi a l'avoir.

    NB
    a savoir moi je veux réaliser une décimation, ie: déviser la résolution de l'image par deux.(prendre un pixel sur deux)

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    A ce moment là, le plus efficace serait quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int len = (int) (wd*ht/2);
    alloc(manouvelleimage); //allocation de na nouvelle image avec 'len' pixels
    for(int i=0; i<len; i++)
    {
        manouvelleimage[i] = monancienneimage[i*2]; //inutile de chercher à optimiser en se servant de décalages, le compilateur s'en charge trés bien
    }

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Pour vérifier qu'un entier est pair, je pense qu'un et binaire est beaucoup plus économique qu'un modulo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( !(i & 1) )
    {
    // entier pair
    }
    else
    {
    // entier impair
    }

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je pense que le compilo est suffisamment intelligent pour transformer un modulo 2 en ce qu'il y a de plus rapide.

  8. #8
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Soit je ne comprends pas ce que cherche a faire le PO, soit avant d'optimiser certains calculs, il serait bon d'optimiser l'algorithme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(int i=0;i<wd;i++)
    {
       for(int j=0;j<ht;j++)
       {
           verefier la parite de i
     
           si i est pair
           {
               ecrire S0 ds la valeur dans la ram
               sinon ecrire D0 ds la ram
           }
       }
    }
    Cet algorithme est mauvais : Il verifie la parité de i pour chaque itération de j ce qui fait (ht-1)*(wd) opérations inutiles.

    Deja une amélioration simple serait ceci :
    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
     
    for(int i=0;i<wd;i++)
    {
       verefier la parite de i
       si i est pair
       { 
            for(int j=0;j<ht;j++)
            {
            ecrire S0 ds la valeur dans la ram
            }
        }
       sinon
       { 
            for(int j=0;j<ht;j++)
            {
            ecrire D0 ds la ram
            }
        }
    }
    Mais une solution encore meilleure serait :

    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
     
    int i;
    for(i = 0;i<wd-2;i++)
    {
        for(int j=0;j<ht;j++)
        {
            ecrire S0 ds la valeur dans la ram
        }
       i++;
       for(int j=0;j<ht;j++)
       {
            ecrire D0 ds la ram
       }
    }
    Si wd est impair
    alors
    {   
        for(int j=0;j<ht;j++)
        {
            ecrire S0 ds la valeur dans la ram
        }
    }
    Ce dernier algorithme prend en compte le fait qu'on part d'une colonne paire (0) et qu'ensuite on a toujours une alternance paire/impaire (logique )
    Attention au wd-2 dans le for pour eviter de sortir du tableau ainsi qu'au traitrement effectué a la sortie qui tient compte du fait que wd peut etre impair et donc qu'il reste une colonne paire non traitée.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 239
    Par défaut
    Citation Envoyé par Ksempac
    Cet algorithme est mauvais : Il verifie la parité de i pour chaque itération de j ce qui fait (ht-1)*(wd) opérations inutiles.

    .
    en faite je voulais faire cette décimation suivant les i (suivant les x).

  10. #10
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Citation Envoyé par madjidri
    en faite je voulais faire cette décimation suivant les i (suivant les x).
    Si je comprends bien tu veux juste garder les pixels avec x pair(ou impair) ?
    En quoi ca justifie que tu te fixes un x (premiere boucle) puis que tu parcours tous les y (seconde boucle) et verifie a chaque fois que x est pair alors qu'il n'a pas bougé (tant que t'es dans ta seconde boucle, i bouge pas) ?

    Moi je te propose de fixer x, de verifier sa parité, puis en fonction de ca de choisir une des 2 boucles. (premiere algo).
    Ou bien comme de toute facon tu sais que tu pars d'un x pair (0), et qu'ensuite on enchaine pair/impair/pair/impair... tu peux parcourir tes colonnes 2 a 2 pour carrement supprimer le test de parité. (second algo)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 239
    Par défaut
    Citation Envoyé par Ksempac
    Si je comprends bien tu veux juste garder les pixels avec x pair(ou impair) ?
    En quoi ca justifie que tu te fixes un x (premiere boucle) puis que tu parcours tous les y (seconde boucle) et verifie a chaque fois que x est pair alors qu'il n'a pas bougé (tant que t'es dans ta seconde boucle, i bouge pas) ?

    Moi je te propose de fixer x, de verifier sa parité, puis en fonction de ca de choisir une des 2 boucles. (premiere algo).
    Ou bien comme de toute facon tu sais que tu pars d'un x pair (0), et qu'ensuite on enchaine pair/impair/pair/impair... tu peux parcourir tes colonnes 2 a 2 pour carrement supprimer le test de parité. (second algo)

    oui ta raison mon ami, mais lors de l'ecriture de message j'ai fais une grande erreur, voici ce que j'ai fait dans mon programme et il fonctionne sans pb:

    for(int j=0;j<hth;j++){
    for(int i=0;i<wdh;i++)
    {
    faire le calcul
    }
    }

    merci beaucoup pour ton aide

  12. #12
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Pas efficace.

    Avec ton code tu te retrouves effectivement obligé de tester la parité de i dans la seconde boucle. Donc tu fais un test pour chaque couple (i,j) soit ht*wd tests. Ca marche sans probleme, mais c'est pas efficace : Si tu avais pris i comme premiere boucle, tu n'aurais que ht tests a faire (et meme 0 fois en parcourant les colonnes 2 a 2).

    Tu te plains toi meme que ton code est trop lent :
    j'ai déja utiliuser cette méthodes mais le programme est tres lent.
    Si ton programme est rempli d'algo pas optimum comme celui-ci c'est sur que tu augmentes la charge. Donc il serait peut etre bon de reprendre cela, en commencant par ces 2 boucles

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

Discussions similaires

  1. Impression pages paires et impaires
    Par ely dans le forum Access
    Réponses: 1
    Dernier message: 26/01/2006, 09h44
  2. récupérer que les lignes paires ou impairs d'une proc ,?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 5
    Dernier message: 16/11/2005, 18h03
  3. problème de suite pair et impair
    Par florane dans le forum C
    Réponses: 13
    Dernier message: 18/10/2005, 13h51
  4. VB Comment savoir si un chiffre est pair ou impair ?
    Par PRACH dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/09/2005, 18h02
  5. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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