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