View difference between Paste ID: 906witQc and A43RuVxh
SHOW: | | - or go back to the newest paste.
1
#include<iostream>
2
#include<string>
3
#include<queue>
4
#include<stack>
5
#include<cmath>
6
 
7
using namespace std;
8
 
9
/* Fonction gamma
10
Renvoi le numéro d'un couple d'entier
11
Entrée : 2 entiers correspondant au couple
12
Sortie : 1 entier, le numéro du couple
13
*/
14
int gamma(int,int);
15
 
16
/* Fonction degamma
17
A partir d'un entier renvoi le couple d'entier correspondant
18
Entrée : un entier, le numéro du couple recherché
19
Sortie : une file d'entiers contenant les 2 entiers du couple
20
*/
21
queue<int> degamma(int);
22
 
23
/* Fonction codage version récursive
24
Renvoi le numéro (un entier) d'un schéma et d'une liste d'entier associé à ce schéma
25
Entrée : une file de caractère contenant le schéma
26
                 une file d'entier contenant la liste d'entier
27
Sortie : un entier correspondant au numéro recherché
28
*/
29
int codageRecur(queue<char>,queue<int>);
30
 
31
/* Fonction codage version itérative
32
Renvoi le numéro (un entier) d'un schéma et d'une liste d'entier associé à ce schéma
33
Entrée : une pile de caractère contenant le schéma
34
                 une pile d'entier contenant la liste d'entier
35
Sortie : un entier correspondant au numéro recherché
36
*/
37
int codageIte(stack<char>,stack<int>);
38
 
39
/* Fonction décodage version itérative
40
Renvoi une liste d'entier à partir d'un schéma et d'un entier
41
Entrée : une file de caractère contenant le schéma
42
                 un entier correspondant à un numéro
43
Sortie : une file d'entier
44
*/
45
queue<int> decodageIte(int, queue<char>);
46
 
47
/* Fonction décodage version récursive
48
Renvoi une liste d'entier à partir d'un schéma et d'un entier
49
Entrée : une file de caractère contenant le schéma
50
                 un entier correspondant à un numéro
51
Sortie : une file d'entier
52
*/
53
queue<int> decodageRecur(int,queue<char>);
54
 
55
int main(){
56
        queue<char> schema,schemaDec;
57
        queue<int> liste,couple,resultdi,resultdr;
58
        stack<char> schemaIt;
59
        stack<int> listeIt;
60
        int i,j,tsch=0,nbrep=0,c=0,e,n;
61
        string sch,schd;
62
       
63
       
64
        //------------------------------------------------------------------------------
65
        /* Test de la fonction gamma */
66
        // Affection des valeurs des paramètres pour gamma
67
        cout << "GAMMA ET DEGAMMA" << endl << "Pour gamma : ";
68
        cout << "Donner i et j" << endl << "i = ";
69
        cin >> i;
70
        cout << "j = ";
71
        cin >> j;
72
        // Affichage du résultat
73
        cout << "Le couple ("<<i<<","<<j<<") a pour numéro : "<<gamma(i,j)<<endl;
74
 
75
        /* Test de la fonction degamma */
76
        // Affection de la valeur du paramètre de degamma
77
        cout << "Entrez un numéro n : ";
78
        cin >> n;
79
        couple = degamma(n);
80
        // Affichage du résultat
81
        cout << n << " est le numéro du couple (" << couple.front() <<","<< couple.back() <<")" << endl;
82
        cout << "----------------------------" << endl;
83
       
84
        //------------------------------------------------------------------------------
85
        /* Test des fonctions codage récursive et itérative */
86
        // Affection des valeurs des paramètres pour codage
87
        cout << "CODAGE ITERATIF ET RECURSIF" << endl;
88
        cout << "Entrez le schéma (ex : g.. ou gg...): ";
89
        cin >> sch;
90
        while(true){
91
                if(tsch == sch.size()) break;
92
                if(sch[tsch] == '.') nbrep++; //On compte le nombre de point pour controler le nombre d'entier présent dans la liste
93
                schema.push(sch[tsch]);
94
                schemaIt.push(sch[tsch]);
95
                tsch++;
96
        }
97
       
98
        cout << "Il y a dans votre schéma "<<nbrep<<" '.'. Vous pouvez donc entrer "<<nbrep<<" entiers dans votre liste :"<<endl;
99
        while(true){
100
                if(c==nbrep) break;
101
                cout << "Entrez un entier : ";
102
                cin >> e;
103
                liste.push(e);
104
                listeIt.push(e);
105
                c++;
106
        }
107
        // Affichage du résultat de codage récursif
108
        cout << "Version récursive : le numéro correspondant au schéma avec la liste d'entiers est = " << codageRecur(schema,liste)<< endl;
109
 
110
        // Affichage du résultat de codage récursif
111
        cout << "Version itératif : le numéro correspondant au schéma avec la liste d'entiers est = " << codageIte(schemaIt,listeIt)<< endl;
112
        cout << "----------------------------" << endl;
113
       
114
        //------------------------------------------------------------------------------
115
        /* Test des fonctions décodage récursive et itérative */
116
        // Affection de la valeur des paramètres
117
        cout << "DECODAGE ITERATIF ET RECURSIF" << endl;
118
        cout << "Entrez un numéro n : ";
119
        cin >> n;
120
 
121
        cout << "Entrez le schéma (ex : g.. ou gg...): ";
122
        cin >> schd;
123
 
124
        tsch = 0;
125
        while(true){
126
                if(tsch == schd.size()) break;
127
                schemaDec.push(schd[tsch]);
128
                tsch++;
129
        }
130
 
131
        // Affichage du résultat
132
 
133
        resultdi = decodageIte(n,schemaDec);
134
        resultdr = decodageRecur(n,schemaDec);
135
 
136
        cout << "Le resultat de decodage version itératif est l'ensemble d'entier: (" << resultdi.front();
137
        resultdi.pop();
138
        while(true){
139
                if(resultdi.empty()) break;
140
                cout << "," << resultdi.front();
141
                resultdi.pop();
142
        }
143
        cout << ")" << endl;
144
 
145
        cout << "Le resultat de decodage version récursif est l'ensemble d'entier: (" << resultdr.front();
146
        resultdr.pop();
147
        while(true){
148
                if(resultdr.empty()) break;
149
                cout << "," << resultdr.front();
150
                resultdr.pop();
151
        }
152
        cout << ")" << endl;
153
       
154
        system("pause");
155
}
156
 
157
//------------------------------- GAMMA - DEGAMMA --------------------------------------------------------------------
158
 
159
/* Fonction gamma */
160
int gamma(int i,int j){
161
        if(i<=j) return(j*j+i); // n = j²+i si i<=j
162
        if(i>j) return(i*i+(2*i-j)); // n = i²+2i-j si i > j
163
}
164
 
165
/* Fonction degamma */
166
/* Pour obtenir la racine carré on utilise la fonction sqrt de la librairie cmath
167
   La fonction sqrt prend en entrée un nombre de type double et retourne un double
168
   La fonction fmod() renvoie le reste de la division
169
*/
170
queue<int> degamma(int n){
171
        queue<int> couple;
172
 
173
        double nd = n; // On convertit en double l'entier n pour calculer la racine avec sqrt
174
        double racd = sqrt(nd);
175
       
176
        int rac = (int)(racd);// A partir de la racine de type double on obtient un entier sans la virgule pour calculer le modulo avec n
177
        double racvrg = (double)(rac+(0.5)); //On rajoute 0,5,racvrg permet de trouver la position de n
178
       
179
               
180
        if(fmod(nd,racd) ==0){ // si i = 0 alors j = racine(n)
181
                couple.push(0);
182
                couple.push(rac);
183
                return(couple);
184
        }else{
185
                if(racd < racvrg){
186
                        couple.push(n-(rac*rac)); // i = n - rac²
187
                        couple.push(rac); // j = racine(n)
188
                        return(couple);
189
                }else{
190
                        couple.push(rac); // i = rac
191
                        couple.push((rac*rac)+(2*rac)-n); // j = i²+2i-n
192
                        return(couple);
193
                }
194
 
195
        }
196
}
197
 
198
//------------------------------- CODAGE --------------------------------------------------------------------
199
/* Fonction codage version récursive */
200
int codageRecur(queue<char> sch,queue<int> lst){
201
        int nbrep=0,nbreg=0;
202
        queue<char> fg,fd;
203
        queue<int> lstg,lstd;
204
 
205
        if(sch.front() == '.') return(lst.front()); // Condition d'arret de la recursivité
206
 
207
        sch.pop(); // On supprime le 1er 'g'
208
        while(true){ // Calcul des fils droit et gauche, des listes d'entiers s1(lstg) et s2(lstd)
209
                if(sch.empty()) break;
210
 
211
// tant que le nombre de . est inférieur au nombre de g, on met les g et les . dans le fils gauche            
212
                if(nbrep>nbreg){
213
                        fd.push(sch.front());
214
                        if(sch.front()=='.'){ // Si le caractère courant est . on rentre dans s2 le 1er entier de la liste
215
                                lstd.push(lst.front());
216
                                lst.pop();
217
                        }
218
                }else{
219
                        fg.push(sch.front());
220
                        if(sch.front()=='.'){ // Si le caractère courant est . on rentre dans s1 le 1er entier de la liste
221
                                lstg.push(lst.front());
222
                                lst.pop();
223
                        }
224
                        if(sch.front() == '.'){ // Calcul du nombre de . et de g
225
                                nbrep++;
226
                        }else{
227
                                nbreg++;
228
                        }
229
                }
230
               
231
                sch.pop();
232
        }
233
       
234
        int x = codageRecur(fg,lstg); // Récursivité
235
        int y = codageRecur(fd,lstd); // Récursivité
236
 
237
        return(gamma(x,y));
238
}
239
 
240
/* Fonction codage version itérative */
241
int codageIte(stack<char> sch,stack<int> lst){
242
        // La pile qui va contenir les résultats de la fonction gamma donc le résultat final
243
        stack<int> n;
244
 
245
        while(true){
246
                if(sch.empty()) break;
247
               
248
                if(sch.top() == '.'){
249
                        n.push(lst.top());
250
                        sch.pop();
251
                        lst.pop();
252
                }else{
253
                        int x = n.top();
254
                        n.pop();
255
                        int y = n.top();
256
                        n.pop();
257
                        n.push(gamma(x,y));
258
                        sch.pop();
259
 
260
                }
261
        }
262
       
263
        return n.top();
264
}
265
 
266
//------------------------------- DECODAGE --------------------------------------------------------------------
267
 
268
/* Fonction decodage version itérative */
269
queue<int> decodageIte(int n, queue<char> schema){
270
        queue<int> listentier,temp;
271
        stack<int> resultdg;
272
       
273
        resultdg.push(n);
274
        while(true){
275
                if(schema.empty()) break;
276
 
277
                if(schema.front() == '.'){
278
                        listentier.push(resultdg.top());
279
                        resultdg.pop();
280
                        schema.pop();
281
                }else{
282
                        temp = degamma(resultdg.top());
283
                        resultdg.pop();
284
                        resultdg.push(temp.back());
285
                        resultdg.push(temp.front());
286
                        temp.pop();
287
                        temp.pop();
288
                        schema.pop();
289
                }
290
        }
291
               
292
        return listentier;
293
}
294
 
295
/* Fonction decodage version récursive */
296
queue<int> decodageRecur(int n,queue<char> sch){
297
        queue<int> rdegamma,liste,temp;
298
        queue<char> fd,fg;
299
        int nbrep=0,nbreg=0;
300
 
301
        if(sch.front() == '.'){ // Condition d'arret de la récursivité
302
                queue<int> listentier;
303
                listentier.push(n);
304
                return listentier;
305
        }
306
 
307
        sch.pop(); // On supprime le 1er 'g'
308
        while(true){ // Calcul des fils droit et gauche, des listes d'entiers s1(lstg) et s2(lstd)
309
                if(sch.empty()) break;
310
 
311
// tant que le nombre de . est inférieur au nombre de g, on met les g et les . dans le fils gauche            
312
                if(nbrep>nbreg){
313
                        fd.push(sch.front());
314
                }else{
315
                        fg.push(sch.front());
316
                        if(sch.front() == '.'){ // Calcul du nombre de . et de g
317
                                nbrep++;
318
                        }else{
319
                                nbreg++;
320
                        }
321
                }
322
               
323
                sch.pop();
324
        }
325
 
326
        rdegamma = degamma(n);
327
 
328
        temp = decodageRecur(rdegamma.front(),fg); // Récursivité
329
        // On récupére le contenu du résultat de la récursivité pour le fils gauche
330
        while(true){
331
                if(temp.empty()) break;
332
                liste.push(temp.front());
333
                temp.pop();
334
        }
335
 
336
        temp = decodageRecur(rdegamma.back(),fd); // Récursivité
337
        // On récupére le contenu du résultat de la récursivité pour le fils droit
338
        while(true){
339
                if(temp.empty()) break;
340
                liste.push(temp.front());
341
                temp.pop();
342
        }
343
       
344
        return liste;
345
 
346
}