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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut 7210110810811132119111114108100 -> Hello world !

    Bonjour,

    Seul, je galère encore et encore pour n'avancer que trop peu.
    Bref, j'aimerai beaucoup avoir votre aide.

    Auriez vous une proposition de code pour pouvoir lire/scanner la chaîne suivante
    7210110810811132119111114108100 ( chaîne de caractères saisie par l'utilisateur (récupérée via un cin >>))
    et lire/reconnaître les caractères ASCII qui la composent pour la "re-transformer" en "Hello world!" ..que l'on affichera?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 605
    Points : 10 680
    Points
    10 680

    Par défaut

    Lire caractère par caractère et décoder.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 121
    Points : 16 852
    Points
    16 852

    Par défaut

    C'est assez simple, tu lis la documentation/spécification du format de cette chaine de chiffres et, espérons-le, de sa traduction en ASCII.
    Ceci fait, tu pourras la traduire facilement.

    En l'état, moi, je ne sais pas comment décider si "7210110810811132119111114108100" correspond à "72 101 108 108 111 32 119 111 114 108 100" ou "72 10 1 10 8 108 etc".
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Citation Envoyé par bacelar Voir le message
    Lire caractère par caractère et décoder.
    Oui cela m'avait été suggéré par ailleurs.
    C'est juste que je vois pas quel code faire pour y arriver.
    Car je ne saurais pas lui faire reconnaître les différents caractères ascii dans cette chaîne continue.

    J'aurais besoin d'exemples pratiques que je puisse ensuite refaire et essayer de comprendre à tête reposée.
    En somme comme je débute an partant de rein, j'ai besoin d'apprendre par l'exemple (plus que par le conceptuel)
    Merci en tous cas :-)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 605
    Points : 10 680
    Points
    10 680

    Par défaut

    Commences par lire caractère par caractère.
    Après, sans plus de détail sur l'encodage, comme l'indique @ternel, on ne pourra pas t'aider.
    Il faut aussi que tu comprennes l'énoncé et que tu nous donnes les infos nécessaires, (ou le comprendre assez pour voir qu'il manque des informations).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Citation Envoyé par ternel Voir le message
    En l'état, moi, je ne sais pas comment décider si "7210110810811132119111114108100" correspond à "72 101 108 108 111 32 119 111 114 108 100" ou "72 10 1 10 8 108 etc".
    C'est justement cette problématique qui me bloque..
    Si j'avais la chaîne écrite avec des espaces comme séparateurs (ou des points ou..) comme ton exemple "72 101 108 108 111 32 119 111 114 108 100" ,
    y aurait il alors un moyen de déchiffrer cette chaine en recomposer le "Hello world!" ?

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 934
    Points : 10 881
    Points
    10 881
    Billets dans le blog
    1

    Par défaut

    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
    #include <iostream>
     
    int main() {
     
        char c = 72;
        std::cout << c;
     
        c = 101;
        std::cout << c;
     
        c = 108;
        std::cout << c;
     
        c = 108;
        std::cout << c;
     
        c = 111;
        std::cout << c;
     
        c = 32;
        std::cout << c;
     
        c = 119;
        std::cout << c;
     
        c = 111;
        std::cout << c;
     
        c = 114;
        std::cout << c;
     
        c = 108;
        std::cout << c;
     
        c = 100;
        std::cout << c;
    }
    affiche :
    Hello world
    A partir de là, tu as déjà bien avancé...

  8. #8
    Membre confirmé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2011
    Messages : 229
    Points : 574
    Points
    574

    Par défaut

    Bonjour,

    A partir des prémices on peut supposer que la chaine est composée de caractères imprimables

    Dans ce cas, tous les caractères que tu dois lire doivent être être supérieurs à 32 (sauf le zéro final)

    Donc

    On lit le 7 => en numérique ('7' - '0' = 7) < 32 on continue
    On lit le 2 => en numérique 2 on obtient alors 72 (7 * 10 + 2)>= 32 on décode le caractère => 'H'
    On lit le 1 => en numérique 1 < 32 on continue
    On lit le 0 => En numérique 0 on obtient 10 (1 * 10 + 0) < 32 on continue
    On lit le 1 => en numérique 1 on obtient 101 (10 * 10 + 1) >= 32 on décode le caractère => 'e'
    ...

    Cela se fait simplement avec une boucle et décodera ton texte

    Cordialement

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 813
    Points : 39 482
    Points
    39 482

    Par défaut

    Acaumes a raison, si on se limite aux codes 32 à 127 (ou même 32 à 255, en fait) l'encodage devient lisible car aucun symbole possible n'est préfixe d'un autre.
    Si on suppose que les caractères 1 à 255 sont autorisés, là on tombe sur un os (les codes 1 à 25 étant préfixes de codes 10 à 255)

    Edit: Pour des raisons qui m'échappent, un de mes profs appelait ça un code déchiffrable, alors que le vrai terme est code préfixe.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Merci à tous pour vos conseils.

    Il y aurait donc bien un moyen, si je vous lis bien, de lire cette chaîne de caractères (représentant des chiffres) caractère par caractère via une boucle,
    et, se faisant, faire "comprendre" au programme qu'il doit reconnaître des "32<valeurs<255" puis les transformer en leurs équivalents ASCII-glyphes/lettres (affichable et lisible pour un humain)..

    Je suis sur cplusplus.com devant la fonction transform() ... pensez vous qu'elle puisse être utile pour ce cas?
    Vais jouer avec et découvrir ce qu'elle fait, ce que ça donne .. ça me donnera peut être une idée de code :-)

  11. #11
    Membre confirmé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2011
    Messages : 229
    Points : 574
    Points
    574

    Par défaut

    Bonjour

    Je suis sur cplusplus.com devant la fonction transform() ... pensez vous qu'elle puisse être utile pour ce cas?
    De mon point de vue non dans ce cas.

    Il te suffit de déclarer un caractère non signé (Unsigned char) et de faire les calculs dessus

    Un peu comme ceci (pseudo code qui reprends ce que j'ai écrit dans mon précédent message)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Variable LeCaractereLu, LeCaractereAImprimer 
     
    LeCaractereAImprimer  <- 0
    Pour chaque LeCaractereLu
      LeCaractereLu<- LeCaractereAImprimer  * 10 + (LeCaractereLu - '0') 
      si LeCaractereAImprimer  >= 32 alors
         imprimer LeCaractereAImprimer 
         LeCaractereAImprimer  <- 0
      FinSi
    FinPour
    A tester éventuellement les dépassement (> 127) mais de toutes façons si tu utilises des caractères non signés tu ne pourra pas dépasser les 255 (du moins sur les architectures courantes)

    Cordialement

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Sur la base du pseudo code, j'ai essayé comme ca...
    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string msgChiffre;
        cout << "Donnez la serie de chiffre a traduire >";
        getline(cin, msgChiffre);
     
        unsigned char readChar;
        unsigned char char2Print='0';
     
        for (string::iterator it = msgChiffre.begin(); it < msgChiffre.end(); ++it){
            readChar = *it;
            cout << readChar <<endl;
            char2Print = char2Print * 10 +(readChar - '0');
            if (char2Print >= 32){
                cout << char2Print;
                char2Print ='0';
            }
        }
        return 0;
    }
     
    /*7210110810811132119111114108100
    Variable LeCaractereLu, LeCaractereAImprimer
     
    LeCaractereAImprimer  <- 0
    Pour chaque LeCaractereLu
      LeCaractereLu<- LeCaractereAImprimer  * 10 + (LeCaractereLu - '0')
      si LeCaractereAImprimer  >= 32 alors
         imprimer LeCaractereAImprimer
         LeCaractereAImprimer  <- 0
      FinSi
    FinPour
    */
    Quand on rentre :
    7210110810811132119111114108100
    ca donne pas :
    Hello world
    mais :
    þÔßÓßßÓÞßÓÞßßßÒÔßßÚßßßßßõßÓÞßÓÓ
    comment dire...? y a un truc que j'ai mal fait..

  13. #13
    Modérateur

    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    10 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 064
    Points : 47 700
    Points
    47 700

    Par défaut

    Hint: quelle est la valeur du caractère '0' dans le tableau ASCII ?
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  14. #14
    Membre confirmé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2011
    Messages : 229
    Points : 574
    Points
    574

    Par défaut

    Bonjour

    Hint: quelle est la valeur du caractère '0' dans le tableau ASCII ?
    Est que j'ai mis 0 ou '0' pour initialiser LeCaractereAImprimer ?

    Du coup quand tu lis '7' tu obtiens 231 (E7 en hexadécimal soit 48 * 10 = 480 (1E0 ramené à E0 en raison du dépassement de capacité) + 7 soit E7 dans ton caractère non signe) et de même pour tous les caractères lus

    Cordialement

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Bonjour,

    En effet ça fonctionne bien mieux (parfaitement même) avec
    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string msgChiffre;
        cout << "Donnez la serie de chiffre a traduire >";
        getline(cin, msgChiffre);
     
        unsigned char readChar;
        unsigned char char2Print=0;
     
        for (string::iterator it = msgChiffre.begin(); it < msgChiffre.end(); ++it){
            readChar = *it;
            char2Print = char2Print * 10 +(readChar - '0');
            if (char2Print >= 32){
                cout << char2Print;
                char2Print =0;
            }
        }
        return 0;
    }
    Mais pouvez vous m'en dire plus sur ce qui fait la différence entre une déclaration d'une char var =0; et d'une char var='0' ?
    Et aussi, pourquoi on doit faire l'opération -'0' sur char2Print = char2Print * 10 +(readChar - '0');

    Désolé si mes questions sont si naïves,
    pour moi, c'est un peu comme si j'apprenais le chinois en supposant la forme de la plupart des symboles tout en devant deviner la structure des phrases pour transmettre un message parfois complexe.

    En tous cas merci beaucoup car grâce à vous tous, et à vous acaumes, j'ai appris de ce topic!

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 934
    Points : 10 881
    Points
    10 881
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Nopal06 Voir le message
    Mais pouvez vous m'en dire plus sur ce qui fait la différence entre une déclaration d'une char var =0; et d'une char var='0'
    La même différence qu'entre char c = 72; et char c = 'H'; (*). Un caractère (un machin placé entre guillemet simple) est remplacé par une valeur numérique, car en C tout est nombre : les char sont des nombres et c'est pour ça que qu'on peut y mettre la valeur 72 sans problème.

    Ainsi, char var =0; initialise var avec la valeur numérique 0, alors que char var='0'; initialise var avec la valeur numérique correspondant au caractère '0'. Typiquement, cette valeur est le code ASCII de ce caractère. Une table ASCII nous indique que la valeur 0 correspond au caractère '\0' (l'antislah est TRÈS important !) (on parle aussi du caractère NUL) et que le caractère '0' correspond à la valeur numérique 48.


    (*) du coup, ce n'est pas exactement la même différence car 'H' == 72 alors que '0' != 0, mais on se comprend

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Curieux acharné
    Inscrit en
    octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Curieux acharné
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2018
    Messages : 13
    Points : 8
    Points
    8

    Par défaut

    Merci

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

Discussions similaires

  1. hello world
    Par floorfille dans le forum CORBA
    Réponses: 3
    Dernier message: 26/07/2007, 15h34
  2. Hello world avec JCreator
    Par skunkies dans le forum Autres EDI
    Réponses: 4
    Dernier message: 22/09/2006, 13h54
  3. [Débutant] Hello World
    Par Ultiny dans le forum C++
    Réponses: 2
    Dernier message: 25/02/2006, 13h57
  4. [Débutant] hello world jsp tomcat
    Par RENAULT dans le forum Tomcat et TomEE
    Réponses: 24
    Dernier message: 13/05/2004, 17h29
  5. [STRUTS] hello world, bonjour le monde
    Par Celina dans le forum Struts 1
    Réponses: 3
    Dernier message: 19/04/2004, 16h41

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