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

Algorithmes et structures de données Discussion :

Demande d'aide pour débuter mon premier algorithme


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut Demande d'aide pour débuter mon premier algorithme
    Bonjours tout le monde,

    Sous Windows, on peut cacher un ou plusieurs lecteurs de l'explorateur avec une valeur dans le registre. Une fois que j'ai récupéré cette valeur, je voudrais savoir quels sont le ou les lecteurs cachés à l'aide de cette valeur.

    Si on prend le problème à l'envers, quand on connais les lecteurs que l'on veut cacher, la demarche est la suivante pour trouver ce nombre :
    - pour cacher A, valeur=1, pour B, valeur=2, pour C, valeur=4, ... on double à chaque fois
    - pour cacher plusieurs lecteurs, on additionne les valeurs trouvés au dessus, par ex.: pour cacher A+C : valeur=5

    Donc là ou je bloque, c'est comment faire l'inverse avec une succession d'étapes qui soient toujours valides ?
    Windows le fait, donc c'est possible, mais je ne sais pas du tout comment partir ...

    Merci pour vos idées.
    Pierre.

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    il faut davantage d'informations sur la manière dont ces nombres sont créés.
    par exemple, si tu as un 5, il faut que tu puisses différencier le lecteur E, les lecteurs A+D, B+C

  3. #3
    Invité
    Invité(e)
    Par défaut
    c'est un simple masque de bits, tu prend ta valeur, et tu la transforme en binaire...

    par exemple, pour les cas que tu énnonce, tu aura :

    A => 1 => 0001
    B => 2 => 0010
    C => 4 => 0100

    voila pour le début... ensuite, pour en mettre plusieurs en même temps, tu fait un addition :

    A + C => 0101

    etc...

    donc, pour savoir si le lecteur n est disponible, tu fait tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    si ( (Variable & MASQUE_N) == 1 ) {
       // le lecteur N est disponible
    }
    le & est un addition binaire, bit à bit... et Masque N est de cette forme : 0001000 ou le 1 est placé au nieme bit.

    Le plus simple pour toi reste d'aller voir un petit cours sur les masques de bit et les codages en base n (2 en l'occurence)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Merci pour vos réponses.

    khayyam90, je ne peut pas en donner d'avantage, j'ai déjà donné toute les informations pour créer ce nombre, il n'y en as pas d'autres.

    bibi.skuk, ok, j'ai trouvé des cours, je regarde ça et je reviens.

    "pour savoir si le lecteur n est disponible, tu fait tout simplement :"
    => ce que je voudrais faire c'est lister tous ceux qui sont cachés.

    A+, Pierre.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    bibi.skuk, je viens d'essayer ce bout de code que je t'ai commenté, et ce petit programme renvoit NON, quèce que j'ai oublié ?

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        int variable=128;
        /*
        128 pour cacher le lecteur H,
        le 7ème lecteur si on commence par A=0
        soit : 2^7=128
        */
     
        int aTrouver=10000000;
        /*
        H est le huitième lecteur,
        donc le masque devrait être
        un 1 avec sept 0 derrière ...
        */
     
        if ( (variable&aTrouver) == 1 )
        {
            printf("OUI\n");
        }
        else
        {
            printf("NON\n");
        }
     
        system("PAUSE");
        return 0;
    }
    Merci.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
        int aTrouver=10000000;
    ton aTrouver devant valoir 128, ce pas la cas de ton initialisation, il vaut
    10000000 ...
    Par défaut, l'initialisation se fait en système décimal.

    Ta réflexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        /*
        128 pour cacher le lecteur H,
        le 7ème lecteur si on commence par A=0
        soit : 2^7=128
        */
    est exacte, mais en exprimant la valeur en binaire.

    il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int aTrouver=0x80;
    (0x80 = 128 en décimal)

    D'autre part, ton test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if ( (variable&aTrouver) == 1 )
    est faux, même si on admet que ton initialisation était bonne:
    un and entre 2 valeurs ne vaut 1 que pour 1 cas particulier: que les 2 valeurs aient le bit 0 à 1

    il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if ( (variable&aTrouver) != 0 )
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'avait effectivement oublié de préciser certaines choses...

    en C, la representation par defaut des nombres est en base 10, on peux avoir facilememnt un représentation hexadécimale avec 0x... ou ... est le nombre en hexadécimal, encore une fois rien de bien compliqué, chaque chiffre vaux entre 0 et 15 et va de 0 à f, de plus 1 chiffre hexa correspond à 4 chiffres en binaire, on a donc :

    0x0f => 0000 1111
    0x02 => 0000 0010

    etc...

    de plus dans le test que j'ai noté, j'ai oublié de faire le shift que je fait habituellement, d'ou une petite erreur. pour ne pas avoir à tester ce chiffre, il faut faire un test != 0, sinon, un shift de la bonne taille resout pas mal de choses... par exemple dans ton cas, il aurait fallu faire :

    ( (Val & 0x80)>>7 ) == 1

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par bibi.skuk
    de plus dans le test que j'ai noté, j'ai oublié de faire le shift que je fait habituellement, d'ou une petite erreur. pour ne pas avoir à tester ce chiffre, il faut faire un test != 0, sinon, un shift de la bonne taille resout pas mal de choses... par exemple dans ton cas, il aurait fallu faire :

    ( (Val & 0x80)>>7 ) == 1
    - 1 - Oui, ça marchera, mais j'appelle ça "faire compliqué alors qu'on peut faire simple".
    Avec l'inconvénient de connaitre précisément la valeur qu'on teste, pour savoir de combien décaler.

    - 2 - Et si tu veux tester plusieurs bits en même temps ? Seul le résultat global t'intéressant (c'est à dire : tous les bits qui t'intéressent sont à 1)
    Tu vas t'amuser à les tester 1 par 1, et à faire un test final qui contrôlera chacun des tests individuels ?
    (Ce n'est pas un cas rare. Dans l'exemple qui nous intéresse, on peut vouloir savoir si 2 disques (ou plus) disques sont visibles ou non même temps)

    En résumé, ta solution avec décalage marchera, mais c'est loin d'être la meilleure.

    Pourquoi ne pas faire ce que tout le monde fait ?
    ce qui en C, se résume généralement par
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

Discussions similaires

  1. [AC-2007] Demande d'aide pour exécuter mon état
    Par boumidou dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 24/04/2013, 13h07
  2. Demande d'aide pour débuter en Java-Configuration-EDI
    Par Java Informatica dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 12/02/2013, 13h20
  3. Demande d'aide pour mon premier programme
    Par ne2sbeal dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/01/2009, 21h53
  4. Besoin d'aide pour guider mon premier projet
    Par FabaCoeur dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 03/12/2007, 09h09

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