for (i = 1; i<lgMot; i++);
strcpy(motMorse,monCode[mot[0] - 'a'].ch); for (i = 1; i < lgMot; ++i) { strcat(motMorse,monCode[mot[i] - 'a'].ch) ;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAILLECODAGE 5 typedef struct { char c; char ch[TAILLECODAGE]; } Codage; static const Codage morse[] = { {'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',"--.."} }; char* morseEnCode(char* mot) { char* motMorse = NULL; char* res = NULL; int i = 0; int lgMot = 0; lgMot = strlen(mot); motMorse = malloc(lgMot * TAILLECODAGE * sizeof (char)); if (motMorse == NULL) return NULL; for (i = 0; i < lgMot; ++i) { const unsigned int pos = (mot[i] | 32) - 'a'; if (pos < (sizeof (morse) / sizeof (*morse))) { strcat(motMorse, morse[pos].ch); if (i < lgMot - 1) strcat(motMorse, " "); } } res = realloc(motMorse, strlen(motMorse)); if (res == NULL) { free(motMorse); return motMorse; } return res; } int main(void) { int encore = 1; char mot[50] = {0}; do { printf("Tapez une phrase : "); scanf("%50s", mot) ; if (mot[0] != '.' || mot[1] != '\0') { char* motMorse = NULL; motMorse = morseEnCode(mot); printf("Codage Morse : %s\n", motMorse); free(motMorse); } else { encore = 0 ; printf("Au revoir !\n"); } } while (encore); return 0; }
if (pos<(26-'a'))
En ce qui concerne l'initialisation des variables, il est vrai que j'ai tendance à ne pas le faire quand je sais que de toute façon elles seront initialisées dans ma fonction. Qu'est-ce que cela apporte comme sécurité supplémentaire ?Ca te protège de toi même :). On se dit souvent: "Non, mais je sais ce que je fais, pas besoin". Or un bug, est par définition une erreur involontaire, voir une petite étourderie. Quand tu oublies d'initialiser un pointeur par exemple, la valeur est alors aléatoire (en fait pas tout à fait, ça vaut la valeur du résidu mémoire où tu pointes).
Pour le type tableau de codage, à quoi sert le static ?En C et en C++, les mots clés ont souvent plusieurs significations. "static" en dehors d'une fonction signifie: "J'assure que ce morceau de code ne sera pas visible en dehors du fichier où il est utilisé". Si je devais faire les choses proprement, je changerais d'ailleurs le code posté pour mettre un "static" devant toutes les fonctions (sauf le main). C'est une habitude que j'ai perdu en C++ (le mécanisme est différent).
Par contre comment fonctionne le | de |32 ? 32 c'est le décalage de code ASCII entre 'A' et 'a' si je me trompe pas, le | effectue ce décalage dans le cas des majuscules ?C'est une astuce un peu compliqué, qui fait appel au calcul binaire. Je vais essayer de t'expliquer, mais c'est peut être un peu en avance sur ton apprentissage.
1 0
--------
1 | 1 1
0 | 1 0
97 => 0110 0001
65 => 0100 0001
32 => 0010 0000
Donc: 'a' | 32 => 'a'
97 => 0110 0001
OR
32 => 0010 0000
-------------------
0110 0001 => 97
Donc: 'A' | 32 => 'a'
65 => 0100 0001
OR
32 => 0010 0000
-------------------
0110 0001 => 97
Du coup je me demandais si cela fonctionnait ? :Vu que 'a' vaut 97, tu auras une valeur négative (-71). Comme pos est non signé, tu passe à (2^32 - 71), donc pos a de grande chance d'être inférieur à cette immense valeur.
if (pos<(26-'a'))
Si je me trompe pas ça fonctionne parce que dans les majuscules la case 32 vaut toujours 0 !Ce n'est pas la case 32, mais la case 5 en partant de la droite (si 0 est la première case). 32 s'écrit d'ailleurs aussi (1 << 5).
Est-ce que tu aurais un équivalent pour l'autre sens (transformer les min en maj et garder les maj ?
97 => 0110 0001
ET
32 => 0010 0000
-------------------
0010 0000 => 32
Donc, si tu avais 2145 (Juste un 1 devant le premier 1 binaire de 97), alors 2145 & 32 te donnera 32 aussi !
97 => 0000 0000 0000 0000 0000 0000 0110 0001
ET
32 => 0000 0000 0000 0000 0000 0000 0010 0000
-------------------
0000 0000 0000 0000 0000 0000 0010 0000 => 32
0 => 000Donc if (a & 1 == 0) printf("a est pair\n");
1 => 001
2 => 010
3 => 011
4 => 100
97 => 0000 0000 0000 0000 0000 0000 0110 0001
ET
~32=> 1111 1111 1111 1111 1111 1111 1101 1111
-------------------
0000 0000 0000 0000 0000 0000 0100 0001 => 65