Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement