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

Nom : problème.PNG
Affichages : 267
Taille : 8,7 Kofibo.c

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;
}