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