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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 41
    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.

+ 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