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 :

Décodage série chiffre


Sujet :

C

  1. #1
    Futur Membre du Club
    Décodage série chiffre
    Bonjour,

    Je suis en train de faire un programme pour coder un message en chiffre (avec la méthode de fibonacci) et ensuite j'essaie de décoder ces chiffres pour que cela redonne le message.
    Le problème est que je n'arrive pas à décoder mon message.

    Tout d'abord, la suite de fibonacci est la suivante (Fn=F(n-1)+F(n-2), les premiers termes sont 1 2 3 5 8 13 21 34 55 ...). Mon objectif était de pouvoir coder chaque lettre en fonction de ces termes et ensuite décoder cette série de termes pour que cela redonne le message. Par exemple, la lettre b=98=1+8+34+55, son codage s'écrit alors 100010011 et pour que le codage soit unique je rajoute un bit "terminateur" à la fin=1. Le codage de la lettre b suivant cette méthode est donc 1000100111. Nous sommes obligés d'utiliser les plus grandes valeurs possibles, on aurait pu écrire b=1+3+5+34+55 mais on peut simplifier 3+5 par 8 donc ce calcul était mauvais. Cette partie a été faite.

    Le problème est pour le décodage de cette série de terme. Normalement je devrais demander qu'elle est ma série de terme ,par exemple 1000100111 0100100111 et le programme devrait me renvoyer les lettres "bc" (Pour rappel, on ne prend pas en compte le dernier bit=1, il sert uniquement à avoir un code unique). Malheureusement le programme ne me renvoie rien du tout. Voici une capture où l'on peut voir que le programme ne renvoie aucune valeur pour le décodage.

    Je vous ai mis mon code en pièce jointe mais le voici ci-dessous si vous voulez

    Pourriez-vous donc m'aidez à résoudre ce problème svp?

    Merci d'avance

    Roro



    Code C :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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include<stdio.h>
    #include<string.h>
     
    int fibonaccicodage(char* ps);
    int fibonaccidecodage(int *ps);
     
    void main()
    {
     int i;
     
     char message[100];
     message[0]='\0';
     
     int message2[100];
     
     printf("What is the message ?\n");
     scanf("%s",&message);
     fibonaccicodage(message);
     
     printf("\n\nWhat was the message ? (You have to enter a message on 10 bits exemple : 01001101011)\n");
     scanf("%d",&message2);
     fibonaccidecodage(message2);
     
    }
     
    int fibonaccicodage(char* ps)
    {
    int b=0;
     
    while(ps[b]!='\0')
    {
        int i=0;
        int j=1;
        int a=0;
        int k=-1;
        int fibo=0;
        int diff;
        int array[9];
     
        do
        {
            fibo=i+j;
            i=j;
            j=fibo;
     
            k=k+1;
     
        }while(fibo<=55);
     
        fibo=i;
        diff=ps[b]-fibo;
        k=k-1;
     
        do
        {
            if(diff==0)
            {
               a=1;
               for(i=0;i<=k;i++)
               {
                   array[i]=0;
               }
            }
            else
            {
               diff=ps[b]-fibo;
               if(diff<0)
               {
                   array[k]=0;
               }
               else
               {
                   array[k]=1;
                   ps[b]=diff;
               }
     
            }
     
            fibo=j-i;
            j=i;
            i=fibo;
     
            k=k-1;
        }while(a!=1||k==-1);
     
        array[9]=1;
     
        for(i=0;i<=9;i++)
        {
            printf("%d",array[i]);
        }
        printf(" ");
     
        b++;
    }
     
    return 0;
    }
     
    int fibonaccidecodage(int *ps)
    {
     
    int i=0;
    char ch[200];
    int result=0;
    int total=0;
    int compteurlettre=0;
     
    for(i=0;i<strlen(ps);i++)
    {
    if(ps[i]==1)
    {
        if(i==0){result=1;}
        if(i%11==0 && i!=0){result=1;}      /// array[0] et multiple de 11
        if((i+10)%11==0 && i!=0){result=2;}
        if((i+9)%11==0 && i!=0){result=3;}
        if((i+8)%11==0 && i!=0){result=5;}    /// array[3] ou array [3+11*x]
        if((i+7)%11==0 && i!=0){result=8;}
        if((i+6)%11==0 && i!=0){result=13;}
        if((i+5)%11==0 && i!=0){result=21;}
        if((i+4)%11==0 && i!=0){result=34;}
        if((i+3)%11==0 && i!=0)             /// multiple de 11*x+8 dernier bit qui compte
           {
               result=55;
               total=total+result;
               ch[compteurlettre]=total;
               compteurlettre++;
               total=0;
           }
        if((i+2)%11==0 && i!=0){result=0;}  /// Dernier bit qu'il ne faut pas compter
        if((i+1)%11==0 && i!=0){result=0;}  /// Espace entre les lettres codées
     
        total=total+result;
    }
    else
    {
        total=total;
    }
     
    }
     
    for(i=0;i<compteurlettre;i++)
    {
        printf("%s",ch[i]);
    }
     
    return 0;
    }

  2. #2
    Expert éminent sénior
    Bonjour
    Citation Envoyé par Roro9876543210 Voir le message
    Pourriez-vous donc m'aidez à résoudre ce problème svp?
    Un problème de ce type se résout tout seul par des printf() placés aux points clefs du code, pour vérifier que les variables ont la bonne valeur. Tu penses qu'on va vérifier ça à ta place ? Surtout sur un code aussi mal indenté, indice patent que ça ne t'intéresse pas plus que ça d'écrire du code.
    Commence déjà par supprimer tous les warnings. Un warning c'est un message du compilo qui dit "la syntaxe est correcte mais je pense que vous vous trompez alors je le fais mais c'est à vos risques". Par exemple ligne17 scanf("%s",&message).
    Ensuite, si le code à déchiffrer c'est "01001101011" il ne faut pas le faire saisir en int car le premier "0" ne sera pas pris en compte.
    Accessoirement la fonction main() est int, pas void, il y a ce strlen(ps) alors que "ps" n'est pas une string et idem avec printf("%s",ch[i])

    Citation Envoyé par Roro9876543210 Voir le message
    Ca c'est du code
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Futur Membre du Club
    Bonjour,

    Je prends bien en compte vos remarques mais sachez que je débute seulement dans la programmation et que j'essaie de m'en sortir avec mes propres moyens. J'ai fait quelques modifications mais j'ai toujours un problème pour le décodage cette fois-ci j'arrive à afficher seulement la première lettre codée mais pas le reste des lettres.

    Pourriez-vous dire quelles seraient mes erreurs ? (je parle ici que de la fonction décodage et son appel)

    Merci d'avance


    ```
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    #include<stdio.h>
    #include<string.h>
     
    int fibonaccicodage(char* ps);
    int fibonaccidecodage(char *ps);
    int test(char * ps);
     
    int main()
    {
     int i;
     
     char message[100];
     message[0]='\0';
     
     char message2[100];
     message2[0]='\0';
     
     printf("What is the message ?\n");
     scanf("%s",&message);
     fibonaccicodage(message);
     
     printf("\n\nWhat was the message ? (You have to enter a message on 10 bits exemple : 01001101011)\n");
     scanf("%s",&message2);
     fibonaccidecodage(message2);
     
    }
     
    int fibonaccicodage(char* ps)
    {
    int b=0;
     
    while(ps[b]!='\0')
    {
        int i=0;
        int j=1;
        int a=0;
        int k=-1;
        int fibo=0;
        int diff;
        int array[9];
     
        do
        {
            fibo=i+j;
            i=j;
            j=fibo;
     
            k=k+1;
     
        }while(fibo<=55);
     
        fibo=i;
        diff=ps[b]-fibo;
        k=k-1;
     
        do
        {
            if(diff==0)
            {
               a=1;
               for(i=0;i<=k;i++)
               {
                   array[i]=0;
               }
            }
            else
            {
               diff=ps[b]-fibo;
               if(diff<0)
               {
                   array[k]=0;
               }
               else
               {
                   array[k]=1;
                   ps[b]=diff;
               }
     
            }
     
            fibo=j-i;
            j=i;
            i=fibo;
     
            k=k-1;
        }while(a!=1||k==-1);
     
        array[9]=1;
     
        for(i=0;i<=9;i++)
        {
            printf("%d",array[i]);
        }
        printf(" ");
     
        b++;
    }
     
    return 0;
    }
     
    int test(char * ps)
    {
        int i;
        int result=98;
     
        for(i=0;i<8;i++)
        {
            if(ps[i]=='1')
            {
                result=result+1;
            }
        }
     
        printf("%c",result);
    }
     
     
    int fibonaccidecodage(char *ps)
    {
     
    int i=0;
    int result=0;
    int total=0;
     
     
    while(ps[i]!='\0')
    {
     
    if(ps[i+1]==' ' || ps[i]==' ')
    {
        result=0;
        total=0;
    }
    else if(ps[i]=='1')
    {
        if(i==0){result=1;}
        if(i%11==0 && i!=0){result=1;}      /// array[0] et multiple de 11
        if((i+10)%11==0 && i!=0){result=2;}
        if((i+9)%11==0 && i!=0){result=3;}
        if((i+8)%11==0 && i!=0){result=5;}    /// array[3] ou array [3+11*x]
        if((i+7)%11==0 && i!=0){result=8;}
        if((i+6)%11==0 && i!=0){result=13;}
        if((i+5)%11==0 && i!=0){result=21;}
        if((i+4)%11==0 && i!=0){result=34;}
        if((i+3)%11==0 && i!=0)             /// multiple de 11*x+8 dernier bit qui compte
           {
               result=55;
               total=total+result;
               printf("%c",total);
               total=0;
           }
        if((i+2)%11==0 && i!=0){result=0;}  /// Dernier bit qu'il ne faut pas compter
        if((i+1)%11==0 && i!=0){result=0;}  /// Espace entre les lettres codées
     
        total=total+result;
    }
     
     
     
    i++;
    }
     
    return 0;
    }

    ```

  4. #4
    Expert éminent sénior
    Citation Envoyé par Roro9876543210 Voir le message
    Bonjour,
    Pas besoin au second post. Quand tu parles avec quelqu'un, tu ne lui redis pas "bonjour" à chaque phrase... si ?
    Citation Envoyé par Roro9876543210 Voir le message
    mais sachez que je débute seulement dans la programmation
    Mouais. Généralement quand on débute, on commence par des trucs simples style "plus petit/plus grand", Fibonacci éventuellement mais juste le calcul de la suite, pas le codage, en revanche on peut s'attaquer au codage de César qui sont autant d'exercices simples qui apprennent la syntaxe.
    Déjà, pour qu'on puisse lire un code, il faut des balises - Je ne pige pas que tu les aies mises au premier post et pas au second. Et débuter en prog n'empêche pas une indentation propre. Parce que si toi tu arrives à te relire, déjà ce ne sera plus le cas dans 6 mois et moi personnellement, ce type de code...
    Code c :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
    do
    {
    if(diff==0)
    {
    a=1;
    for(i=0;i<=k;i++)
    {
    array[i]=0;
    }
    }
    else
    {
    diff=ps[b]-fibo;
    if(diff<0)
    {
    array[k]=0;
    }
    else
    {
    array[k]=1;
    ps[b]=diff;
    }
     
    }

    ... ben voilà quoi. Indenter c'est aussi pour son propre confort. Essaye de rajouter ensuite un truc quelque part et tu ne sauras pas où le mettre. Et il y a toujours ce putain de scanf("%s",&message) (pas de "&" quand la variable est un tableau, et une string c'est à la base un tableau de caractères).
    Ensuite i=0; while (ch[i] != '\0') { ...; i++} peut se mettre dans un for(). Et si dans tous tes tests tu regardes && i != 0 tu as alors peut-être avantage à faire commencer i à 1. Et pas de nombre en dur (ex 98, 55) qui ne représentent rien de visuel (si tu crois que je connais la table ascii par coeur !!!) alors que tu as l'écriture littérale 'b' ou '7'. En plus tu la connais puisque tu écris ... != '1'. Et à ce propos, pourquoi 'b' et pas 'a' ???

    Il me semble aussi en déchiffrant ce... truc que tu cherches à la fois à séparer le flot "01001101011 01001101011 01001101011" en 3 items (tu cherches l'espace) plus décoder chaque item et tout ça en un coup. Ok ça peut le faire mais généralement on préfère de petites fonctions simples, faciles à tester. Si tu sais décoder "01001101011" proprement, ce sera alors moins difficile de faire une autre fonction qui se contente de séparer "01001101011 01001101011 01001101011" et de d'appeler la fonction de décodage 3 fois. D'autant plus que cette autre fonction de découpage existe déjà => strtok_r
    Exemple:
    Code c :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <string.h>
     
    void decodage(char *s) {
    	printf("s=[%s]\n", s);
    }
     
    int main() {
    	char str[]="toto titi tata";
    	char *work;
    	char *res;
    	for (res=strtok_r(str, " ", &work); res != NULL; res=strtok_r(NULL, " ", &work)) {
    		decodage(res);
    	}
    }
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Futur Membre du Club
    Je comprends vos explications mais je ne vois toujours pas comment faire ma fonction qui permet de transformer 1000100111 0100100111 en terme bc en faisant l'appel d'une seule fonction

  6. #6
    Expert éminent sénior
    Citation Envoyé par Roro9876543210 Voir le message
    Je comprends vos explications mais je ne vois toujours pas comment faire ma fonction qui permet de transformer 1000100111 0100100111 en terme bc en faisant l'appel d'une seule fonction
    Ce n'est pas vraiment ça la définition de "comprendre"...

    Code c :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
    #include <stdio.h>
    #include <string.h>
     
    void decodage(char *s, char *work) {
    	size_t i;
    	i=strlen(work);
    	if (s[0] == '0') work[i]='c';
    	else work[i]='b';
    }
     
    int main() {
    	char str[]="1000100111 0100100111";
    	char *work;
    	char *split;
    	char final[100]="";
    	for (split=strtok_r(str, " ", &work); split != NULL; split=strtok_r(NULL, " ", &work)) {
    		decodage(split, final);
    	}
    	printf("%s\n", final);
    }

    Voilà, programmé selon ma conception perso du décodage. Au final, j'ai bien "bc".
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  7. #7
    Rédacteur/Modérateur

    C'est quoi le rapport entre fibonacci et B=98 ?
    Si B=98, tu crées un tableau associatif qui lie chaque lettre à sa valeur et c'est tout ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Futur Membre du Club
    Mon objectif est que coder une lettre qu'avec les termes de fibonacci (1 2 3 5 8 13 21 34 55)
    la lettre b=98=100010011 avec un bit terminateur à la fin donc au final 1000100111

    Ensuite je dois retrouver la valeur b à partir du code 1000100111 et c'est ici que j'ai des problèmes

  9. #9
    Futur Membre du Club
    En essayant de suivre ton dernier programme, j'ai essayé d'y ajouter le mien car mon objectif n'est pas de coder que b et c mais toutes les lettres avec la méthode de fibonacci.

    Mon raisonnement est que je fait une boucle qui parcourt la lettre exemple (b=1000100111), si je rencontre des 1, j'ajoute au total la valeur du(a ème) terme de fibonacci sinon je fais rien. Ensuite je voudrais l'affichage de la lettre correspondant au total (exemple si total=100 je veux la lettre d)

    Le problème est que le message ne s'affiche pas car j'ai encore du faire des erreurs

    Dans l'exemple, je veux retrouver le mot tomate avec cette méthode

    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
     
    #include <stdio.h>
    #include <string.h>
     
    void decodage(char *s, char *work) {
        int a;
        int result=0;
        int total=0;
    	size_t i;
    	i=strlen(work);
     
        if(s[0]=='1'||s[0]=='0')
        {
        for(a=0;a<strlen(work);a++)
    	{
            if(a==0){result=1;}
            if(a==1){result=2;}      
            if(a==2){result=3;}
            if(a==3){result=5;}
            if(a==4){result=8;}    
            if(a==5){result=13;}
            if(a==6){result=21;}
            if(a==7){result=34;}
            if(a==8){result=55;}
            if(a==9){result=0;} 
     
            total=total+result;
        }
            work[i]=total; /// Ici je ne suis pas sur que cela fonctionne
        }
    }
     
    int main() {
    	char str[]="1001001111 1000001111 0101010111 0000100111 1001001111 1010100111";
    	char *work;
    	char *split;
    	char final[100]="";
     
    	for (split=strtok_r(str, " ", &work);
    	split != NULL;
    	split=strtok_r(NULL, " ", &work))
    	{
    		decodage(split, final);
    	}
    	printf("%s\n", final);
    }

  10. #10
    Expert éminent sénior
    Citation Envoyé par Roro9876543210 Voir le message
    car mon objectif n'est pas de coder que b et c mais toutes les lettres avec la méthode de fibonacci
    C'était juste un exemple. L'important dans cet exemple ce n'est pas l'algo (lui il est interchangeable), c'est juste que je passe chaque suite "101101101" à la fonction et elle me construit le résultat petit à petit.

    Citation Envoyé par Roro9876543210 Voir le message
    Dans l'exemple, je veux retrouver le mot tomate avec cette méthode for(a=0;a<strlen(work);a++)
    As-tu compris l'utilité de "work" ? Sans déconner c'est quoi de vouloir courir quand on n'a pas encore appris à marcher ?

    Citation Envoyé par Roro9876543210 Voir le message
    work[i]=total; /// Ici je ne suis pas sur que cela fonctionne
    Ah ben copier un int (nombre de 4 octets) dans un char (nombre de 1 octets) ça le fait. Mais déjà il y a troncature (parce que 4 octets ça ne rentre pas dans un octet). Et le résultat de cette troncature (qui équivaut à un modulo) est-il à la bonne valeur (un caractère alphabétique pris parmis ceux qui composent le mot "tomate") ?

    Citation Envoyé par Roro9876543210 Voir le message
    Mon objectif est que coder une lettre qu'avec les termes de fibonacci (1 2 3 5 8 13 21 34 55)
    la lettre b=98=100010011

    Ensuite je dois retrouver la valeur b à partir du code 1000100111 et c'est ici que j'ai des problèmes
    Comment tu passes de (par exemple) 421 à quatre cent ving-et un ? Tu fais 4 * 10^2 + 2 * 10^1 + 1 * 10^0 (c'est la base de la numération). C'est peut-être implicite, mais c'est quand-même ainsi que ça se passe.
    Pareil pour 1010 en base 2 à convertir en base 10, c'est 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 soit 10.
    Donc pour 100010011 en base Fibonacci à convertir en base 10, ce sera 1 * 1 + 0 * 2 + 0 * 3 + 0 * 5 + 1 * 8 + 0 * 13 + 0 * 21 + 1 * 34 + 1 * 55=98.

    Citation Envoyé par Roro9876543210 Voir le message
    et pour que le codage soit unique je rajoute un bit "terminateur" à la fin=1
    Je ne vois pas en quoi rajouter une valeur constante à un truc rendra ce truc unique
    Prenons trucA et trucB. Soit trucA et trucB sont différents et ne pourront jamais être identiques, et dans ce cas ils sont déjà uniques sans avoir besoin de rajouter quoi que ce soit, soit ils sont identiques et dans ce cas, trucA+1 sera aussi identique à trucB+1 (principe des équations dans lesquelles on effectue des opérations identiques de chaque partie de l'égalité pour simplifier une des deux parties).

    Citation Envoyé par Bousk Voir le message
    Si B=98, tu crées un tableau associatif qui lie chaque lettre à sa valeur et c'est tout ?
    Attention, il a écrit b=98 et non B=98. La nuance est importante car il existe déjà un tableau qui associe 'b' et 98, il se nomme "table ascii"
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  11. #11
    Membre averti
    Bonjour,

    Citation Envoyé par Roro9876543210 Voir le message

    Le problème est que le message ne s'affiche pas car j'ai encore du faire des erreurs
    C'est pas forcément de ta faute, il y des notions que tu n'as peut-être pas encore étudiés.

    Citation Envoyé par Roro9876543210 Voir le message

    Dans l'exemple, je veux retrouver le mot tomate avec cette méthode

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdio.h>
    #include <string.h>
     
    void decodage(char *s, char *work) {
    Tu y es presque, à ceci près que c'est "s" qu'il faut parcourir et lire, et ce n'est pas ce qui ressort dans le code.
    Mais avant d'aller plus loin, il faut que je m'assure que tu suis toujours la discussion.

  12. #12
    Futur Membre du Club
    Oui je suis toujours la discussion

  13. #13
    Expert éminent sénior
    Code c :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
    #include <stdio.h>
    #include <string.h>
     
    int decodage(char *s, char *work, size_t lim) {
    	size_t w=strlen(work);
    	if (w >= lim) return -1;
     
    	static unsigned short fib[]={1, 2, 3, 5, 8, 13, 21, 34, 55, 0};
    	unsigned short *pt_f;
    	char *pt_s;
     
    	for (pt_f=fib, pt_s=s; *pt_f > 0; pt_f++, pt_s++)
    		work[w]+=(*pt_s - '0') * (*pt_f);
    	return 0;
    }
     
    int main() {
    	char str[]="1000100111 0100100111";
    	char *work;
    	char *split;
    	char final[100]="";
    	for (split=strtok_r(str, " ", &work); split != NULL; split=strtok_r(NULL, " ", &work)) {
    		if (decodage(split, final, 100) < 0) {
    			fprintf(stderr, "Erreur décodage [%s], la zone réceptrice n'est pas assez grande\n", split);
    			break;
    		}
    	}
    	printf("%s\n", final);
    }

    Voilà. La prochaine fois, attaque-toi à des notions plus simples. Et puis si les tutos existent, c'est aussi pour qu'ils soient lus.

    PS: la suite de Fibonacci, c'est 1 1 2 3 5 ... et non 1 2 3 5 ... Et comme je l'ai dit précédemment, ce "1" final sert absolument à que dalle.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  14. #14
    Futur Membre du Club
    Merci pour l'aide apporter, votre programme fonctionne bien

  15. #15
    Expert éminent sénior
    Citation Envoyé par Roro9876543210 Voir le message
    Merci pour l'aide apportée
    As-tu compris le principe ? Es-tu capable de le refaire ? Donne un poisson à un homme et il mangera un jour, apprends-lui à pêcher et il mangera tous les jours. J'ai d'abord tenté de t'apprendre à pêcher mais tu n'as même pas la notion de ce qu'est une canne à pêche. Ensuite tout ce que j'ai fait c'est te donner un poisson car c'était ça ou rien mais je sais pertinemment qu'en réalité, entre ça ou rien c'est en réalité pareil. La seule différence c'est que "peut-être" ça te donnera un coup de boost pour t'y mettre sérieusement parce que si tu veux en faire ton métier, tu ne pourras pas le faire faire par les autres sur des forums.

    PS: au cas où il s'agirait d'un TP à rendre, j'ai quand-même introduit dans ce programme des notions assez poussées afin que ton prof voit immédiatement qu'il ne peut pas être de toi et puisse en tirer les conclusions adéquates.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  16. #16
    Membre averti
    Citation Envoyé par Roro9876543210 Voir le message
    Oui je suis toujours la discussion
    Ah ! Mais tu as signalé la discussion comme résolue. Es-tu toujours à la recherche d'une solution plus personnelle ou ce qui t'as été proposé te suffit ?

  17. #17
    Membre averti
    Citation Envoyé par Roro9876543210 Voir le message
    les premiers termes sont 1 2 3 5 8 13 21 34 55 ...). Mon objectif était de pouvoir coder chaque lettre en fonction de ces termes et ensuite décoder cette série de termes pour que cela redonne le message. Par exemple, la lettre b=98=1+8+34+55, son codage s'écrit alors 100010011 et pour que le codage soit unique je rajoute un bit "terminateur" à la fin=1. Le codage de la lettre b suivant cette méthode est donc 1000100111. Nous sommes obligés d'utiliser les plus grandes valeurs possibles, on aurait pu écrire b=1+3+5+34+55 mais on peut simplifier 3+5 par 8 donc ce calcul était mauvais. Cette partie a été faite.
    Bon, juste un dernier message pour notifier une potentielle erreur dans le sujet et j'en reste là.
    En effet, dans le message cité, pour l'ascii 98 (caractère b), 3+5 pour faire 8 c'est interdit, mais 34+55 pour faire 89 ne l'est pas. Ce n'est pas cohérent. Comme le calcul se fait en ordre descendant, ça veut dire que pour b l'impasse a été faite sur le 89, donc le tableau est incomplet. Pour la même raison, avec ce mode de calcul, c'est impossible d'avoir deux 1 consécutifs, et c'est en codant des caractères ascii de faible valeurs (alert: 7, saut de ligne; 10, espace: 32) que l'ajout de ce 1 terminal prend tout son sens et est pertinent, il sert à marquer la fin d'un mot binaire de longueur variable.

  18. #18
    Expert éminent sénior
    Citation Envoyé par kaitlyn Voir le message
    En effet, dans le message cité, pour l'ascii 98 (caractère b), 3+5 pour faire 8 c'est interdit, mais 34+55 pour faire 89 ne l'est pas. Ce n'est pas cohérent.
    Ben si, ça l'est dans la mesure où sa plage de codage à 9 bits ne contiendra alors que 9 termes de la suite de Fibonacci (1, 2, 3, 5, 8, 13, 21, 34, 55). Et dans cette plage fermée, il est alors interdit d'avoir deux "1" consécutifs (ex 5+8=13) car le terme "13" est déjà présent... sauf pour la fin car 89 ne fait pas partie de la plage des valeurs disponibles donc ne peut être obtenue que par 34+55.
    Mais ceci m'a fait réfléchir car avec seulement 9 valeurs pour représenter chaque bit, on ne peut coder que sur la somme totale de ces termes soit jusqu'au nombre 142. Et toute valeur ascii dépassant ce nombre ne sera pas traduisible.
    Ou alors j'ai rien compris au codage qui peut éventuellement créer une suite de plus de 9 bits selon la valeur du caractère ascii. Mais comme les exemples du PO étaient tous à 9 bits (plus ce "1" final)...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  19. #19
    Membre averti
    En fait il manque une phrase dans mon précédent post et dans laquelle je faisais aussi référence au message #9. Le t (ascii 116) y vaut 1+5+21+34+55 or 21+34=55, d'où ma remarque.

  20. #20
    Expert éminent sénior
    Citation Envoyé par kaitlyn Voir le message
    En fait il manque une phrase dans mon précédent post et dans laquelle je faisais aussi référence au message #9. Le t (ascii 116) y vaut 1+5+21+34+55 or 21+34=55, d'où ma remarque.
    Ok. Donc on pourra utiliser deux consécutifs (ex "3" et "5") si sa somme ("8") est déjà elle-aussi utilisée.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

###raw>template_hook.ano_emploi###