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 :

Conversion en morse


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut Conversion en morse
    Salut, je me suis remis à la programmation en C depuis peu et j'ai ressortis un ptit programme que j'avais codé à mes heures perdues, seulement, en le recompilant et en le testant il ne marche pas, il m'affiche les ?????? de mon else dans la boucle for.....

    Pourriez-vous m'aider à le faire fonctionner et peut-être m'indiquer comment l'améliorer un petit peu.........

    Voici le codeur morse :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37                                
     
    main()
    {
     
       struct code { char lettre ;
                     char * morse ;
                   } ;
       struct code table[NL] =                          
     
                   { 'A', ".-",       'B', "-...",       'C', "-.-.",
                     'D', "-..",      'E', ".",          'F', "..-.",
                     'G', "--.",      'H', "....",       'I', "..",
                     'J', ".---",     'K', "-.-",        'L', ".-..",
                     'M', "--",       'N', "-.",         'O', "---",
                     'P', ".--.",     'Q', "--.-",       'R', ".-.",
                     'S', "...",      'T', "-",          'U', "..-",
                     'V', "...-",     'W', ".--",        'X', "-..-",
                     'Y', "-.--",     'Z', "--..",
                     '.', ".-.-.-",
                     '0', "-----",    '1', ".----",      '2', "..---",
                     '3', "...--",    '4', "....-",      '5', ".....",
                     '6', "-....",    '7', "--...",      '8', "---..",
                     '9', "----.",
                   } ;
     
       char ligne[128] ;                              
       int i, j ;
     
       debut:          
     
       printf ("\n\n         LES CARACTERES SONT A ECRIRE EN MAJUSCULE    \n\n") ;
       printf ("                      128 caracteres maximum  \n") ;
       printf ("                   Introduisez une phrase : \n") ;
     
       gets (ligne) ;
     
       printf ("\n\n           Voici la traduction de votre message : \n\n") ;
     
       for (i=0 ; i<strlen(ligne) ; i++) 
     
          { j=0 ;
            while (ligne[i] != table[j].lettre && j++<NL-1) ;
            if (j<NL) printf ("%7s", table[j].morse) ;
                else  printf (" ??????") ;
            if ( ! ((i+1)%10) ) printf ("\n\n") ; 
     
          }
          goto debut ; 
    }
    Et voici le décodeur morse que je n'arrive pas à compiler avec code::blocks, ça marchais avec devc++ :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37                                 
    #define LG 127                                  
     
    main()
    {
       struct code { char lettre ;
                     char * morse ;
                   } ;
       struct code table[NL] =                 
     
                   { 'A', ".-",       'B', "-...",       'C', "-.-.",
                     'D', "-..",      'E', ".",          'F', "..-.",
                     'G', "--.",      'H', "....",       'I', "..",
                     'J', ".---",     'K', "-.-",        'L', ".-..",
                     'M', "--",       'N', "-.",         'O', "---",
                     'P', ".--.",     'Q', "--.-",       'R', ".-.",
                     'S', "...",      'T', "-",          'U', "..-",
                     'V', "...-",     'W', ".--",        'X', "-..-",
                     'Y', "-.--",     'Z', "--..",
                     '.', ".-.-.-",
                     '0', "-----",    '1', ".----",      '2', "..---",
                     '3', "...--",    '4', "....-",      '5', ".....",
                     '6', "-....",    '7', "--...",      '8', "---..",
                     '9', "----.",
                   } ;
       char ligne[LG+1] ;                       
       char code[7] ;                   
       int i, j ;
     
       debut:                            
     
       printf ("\n\n        Introduiser un code morse a traduire : \n") ;
       gets (ligne) ;
       printf ("\n\n   Le code morse traduit alphabetiquement veut dire : \n") ;
     
     
       i=0 ;
       while (i<strlen(ligne))
          {
            while (ligne[i] == ' ') i++ ;    
            if ( i<strlen(ligne) )          
              { sscanf (&ligne[i], "%6s", code) ;
                i += strlen(code) ;            
                j=0 ;                            
                while ( stricmp (code, table[j].morse) && j++<NL-1) ;
                if (j<NL) printf ("%2c", table[j].lettre) ;   
                    else  printf (" ?") ;           
              }
          }
          goto debut ;                
    }
    Bon évidemment, un bon codeur doit savoir coder sans son code.....mais, toutefois si un coup de pouce est possible...heu...bin, je dis pas non....


  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jao,

    En jetant un petit coup d'œil, je vois du goto, et je n'insiste pas.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Le premier code semble fonctionner, mais il y a plusieurs choses à revoir :
    * Il faut corriger les warning, c'est important.
    * Il est préférable de supprimer le "goto", ce n'est pas propre.
    * Utilise une variable au lieu d'appeler "strlen" à chaque fois (lorsque cela n'est pas nécessaire), cela consomme des ressources inutilement.
    * "gets" est une fonction dangereuse, elle présente une grosse faille de sécurité (elle permet un dépassement de tampon avec les conséquences qui y sont liées), il faut la bannir. Il faut utiliser "fgets" à la place.
    * La fonction "main" doit toujours renvoyer un int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
    (...)
       return EXIT_SUCCESS; /* si tout est OK */
    }
    Concernant le second code, mêmes remarques que précédemment. De plus, la fonction "stricmp" semble ne pas exister. Remplace-la par la fonction "strcmp".

  4. #4
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut merci
    Merci beaucoup pour ces renseignement précieux....

    Pour ce qui est du goto, je sais que j'aurais du changer ça avant, c'est une erreur ultra misérable de ma part mais à l'époque celà à du m'arranger pour une raison quelquonque.... je sais que ce n'est franchement pas très....algorithmique et que ça ne s'utilise plus depuis des lustres désolé.

    Je viens de me remettre à la programmation car j'ai un peu de temps et je te remercie pour tes conseils, il vont m'être très utiles.....

  5. #5
    Membre éclairé
    Inscrit en
    Août 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 68
    Par défaut
    Citation Envoyé par Ziarrow Voir le message
    et que ça ne s'utilise plus depuis des lustres désolé.
    Le noyau Linux en est truffé... mais le contexte d'utilisation n'est pas le même

  6. #6
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    J'ai solutionné les warnings et changer mes erreurs pour le codeur morse, merci en tout cas, ça fonctionne :


    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37
    #define MAXLONG 128                 
     
    int main(void)
    {
     
       struct code { char lettre ;
                     const char * morse ;
                   } ;
       struct code table[NL] =                         
                   { {'A', ".-"},       {'B', "-..."},       {'C', "-.-."},
                     {'D', "-.."},      {'E', "."},          {'F', "..-."},
                     {'G', "--."},      {'H', "...."},       {'I', ".."},
                     {'J', ".---"},     {'K', "-.-"},        {'L', ".-.."},
                     {'M', "--"},       {'N', "-."},         {'O', "---"},
                     {'P', ".--."},     {'Q', "--.-"},       {'R', ".-."},
                     {'S', "..."},      {'T', "-"},          {'U', "..-"},
                     {'V', "...-"},     {'W', ".--"},        {'X', "-..-"},
                     {'Y', "-.--"},     {'Z', "--.."},
                     {'.', ".-.-.-"},
                     {'0', "-----"},    {'1', ".----"},      {'2', "..---"},
                     {'3', "...--"},    {'4', "....-"},      {'5', "....."},
                     {'6', "-...."},    {'7', "--..."},      {'8', "---.."},
                     {'9', "----."}
                   } ;
     
     
       char ligne[MAXLONG] ;         
       unsigned int i, j ;
       size_t length;
      while (1)
      {
       printf ("\n\n         LES CARACTERES SONT A ECRIRE EN MAJUSCULE    \n\n") ;
       printf ("                    128 caracteres maximum  \n") ;
       printf ("        Introduisez une phrase ou un blanc pour quitter : \n") ;
     
       fgets (ligne, MAXLONG, stdin) ;
     
        if (ligne[0] == '\n')
        break;
     
       printf ("\n\n         Voici la traduction de votre message : \n\n") ;
     
     
       length = strlen(ligne);
     
       for (i=0 ; i<length ; i++)                        
     
          { j=0 ;
            while (ligne[i] != table[j].lettre && j++<NL-1) ;
            if (j<NL) printf ("%7s", table[j].morse) ;
            if ( ! ((i+1)%10) ) printf ("\n\n") ;         
          }
     }
    return 0;
    }
    Donc merci et n'hésiter pas à critiquer ce bout de code s'il y a lieu.

    Je changerai le décodeur de la même manière........


  7. #7
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par kiluak Voir le message
    Le noyau Linux en est truffé... mais le contexte d'utilisation n'est pas le même
    Oui mais là, il a fait un goto qui "remonte", c'est très dangereux !!! Je ne pense pas qu'il y en ait dans le noyau (j'espère).
    Un goto sert généralement à sortir (de boucles imbriquées), pas à boucler !!

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

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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