Advertisement
Pavle_nis

C++ app1

Dec 8th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.64 KB | None | 0 0
  1. // ConsoleApplication4.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <conio.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <limits.h>
  9. #include <windows.h>
  10. #include <winbase.h>
  11.  
  12. #define ADD    '+'
  13. #define MUL    '*'
  14. #define SOUS   '-'
  15. #define DIV    '/'
  16.  
  17. typedef struct
  18. {
  19.     long valeur1[16];
  20.     char operation[16];
  21.     long valeur2[16];
  22.     long resultat[16];
  23. } solution;
  24.  
  25. long plaqueini[16] = { 1,3,5,7,9,1 };
  26. long resultat = 377;
  27.  
  28. long meilleurecart;
  29. int meilleurlevel;
  30.  
  31. long NombreAppelCompte;
  32.  
  33. long solutions;
  34.  
  35. long plaque[16][16]; // 16*16 pour optimiser un peu
  36.  
  37. solution savesolution;
  38. solution bestsolution;
  39.  
  40. void InitCompteur(LARGE_INTEGER *Frequence); // pour calculer  le temps
  41. void CompteurOnOff(LARGE_INTEGER *Compteur); // d'execution du programme
  42. void AffichePresentation(void);
  43. void AfficheErreurParametres(void);
  44. void affichesolution(int l);
  45. void compte(int l);
  46.  
  47.  
  48. // Pour calculer le temps d'execution du programme :
  49. //***************************************************
  50. void InitCompteur(LARGE_INTEGER *Frequence)
  51. {
  52.     if (!QueryPerformanceFrequency(Frequence))
  53.     {
  54.         printf("Compteur non présent\n");
  55.         printf("Appuyer sur une touche pour terminer\n");
  56.         getch();
  57.         exit(1);
  58.     }
  59.  
  60.     if (Frequence->QuadPart<10000)
  61.     {
  62.         printf("Fréquence de l'horloge trop nulle :) : pas au dix-millième près !\n");
  63.         printf("Appuyer sur une touche pour terminer\n");
  64.         getch();
  65.         exit(1);
  66.     }
  67. }
  68.  
  69. void CompteurOnOff(LARGE_INTEGER *Compteur)
  70. {
  71.     if (!QueryPerformanceCounter(Compteur))
  72.     {
  73.         printf("Compteur non présent !\n");
  74.         printf("Appuyer sur une touche pour terminer\n");
  75.         getch();
  76.         exit(1);
  77.     }
  78. }
  79. //****************************************
  80.  
  81. void AffichePresentation()
  82. {
  83.     printf("COMPTE Copyright (c) Emmanuel Harang\n");
  84.     printf("Programme r‚solvant LE COMPTE EST BON\n");
  85.     printf("\n");
  86. }
  87.  
  88.  
  89. void AfficheErreurParametres()
  90. {
  91.     printf("Entrez les 6 nombres et le nombre … trouver\n");
  92.     printf("Exemple :\n");
  93.     printf("compte 1 3 5 7 9 1 377\n");
  94.     printf("Appuyer sur une touche pour terminer\n");
  95.     getch();
  96.     //exit(1);
  97. }
  98.  
  99. void affichesolution(int l)
  100. {
  101.     int i;
  102.  
  103.     printf("******************\n");
  104.     for (i = 6; i>l; i--)
  105.         printf("%lu %c %lu = %lu\n", bestsolution.valeur1[i], bestsolution.operation[i], bestsolution.valeur2[i], bestsolution.resultat[i]);
  106.     printf("******************\n");
  107. }
  108.  
  109. void compte(int l)
  110. {
  111.     int i, j, k, n;
  112.     long plaque1, plaque2;
  113.     long ecart;
  114.     long r;
  115.  
  116.     NombreAppelCompte++;
  117.  
  118.     ecart = resultat - plaque[l][0];
  119.     if (ecart<0)
  120.         ecart = -ecart;
  121.     if (ecart <= meilleurecart)
  122.     {
  123.         if (ecart<meilleurecart)
  124.         {
  125.             meilleurecart = ecart;
  126.             bestsolution = savesolution;
  127.             meilleurlevel = l;
  128.             if (!ecart)
  129.             {
  130.                 printf("!ecart %d", ecart);
  131.                 solutions++;
  132.                 affichesolution(l);
  133.             }
  134.         }
  135.         else  // (ecart==meilleurecart)
  136.         {
  137.             if (!ecart)
  138.                 solutions++;
  139.             if (l>meilleurlevel)
  140.             {
  141.                 bestsolution = savesolution;
  142.                 meilleurlevel = l;
  143.                 if (!ecart)
  144.                     affichesolution(l);
  145.             }
  146.         }
  147.     }
  148.  
  149.     if (l == 1)
  150.         return;
  151.  
  152.     for (i = 0; i<l - 1; i++)
  153.     {
  154.         for (j = i + 1; j<l; j++)
  155.         {
  156.             plaque1 = plaque[l][i];     // prend 2 plaques
  157.             plaque2 = plaque[l][j];     // parmi les C(l,2)=(l*l-1)/2 possibles
  158.  
  159.  
  160.             n = 1;
  161.             for (k = 0; k<l; k++)
  162.             {
  163.                 if (k != i && k != j)
  164.                 {
  165.                     plaque[l - 1][n] = plaque[l][k];
  166.                     n++;
  167.                 }
  168.             }
  169.  
  170.             // attention si vous mettez l--; ici pour simplifier les "l-1" qui suivent, il faut mettre l++; apres pour retablir l pour la prochaine boucle
  171.  
  172.             plaque[l - 1][0] = plaque1 + plaque2;
  173.             savesolution.valeur1[l] = plaque1;
  174.             savesolution.operation[l] = ADD;
  175.             savesolution.valeur2[l] = plaque2;
  176.             savesolution.resultat[l] = plaque[l - 1][0];
  177.             compte(l - 1);
  178.             if (plaque1 != 1 && plaque2 != 1)
  179.             {
  180.                 plaque[l - 1][0] = plaque1*plaque2;
  181.                 //      savesolution.valeur1[l]=plaque1; inutile car fait juste avant
  182.                 savesolution.operation[l] = MUL;
  183.                 //      savesolution.valeur2[l]=plaque2;  inutile car fait juste avant
  184.                 savesolution.resultat[l] = plaque[l - 1][0];
  185.                 compte(l - 1);
  186.  
  187.                 if (plaque1 >= plaque2)
  188.                 {
  189.                     plaque[l - 1][0] = plaque1 - plaque2;
  190.                     if (plaque[l - 1][0])
  191.                     {
  192.                         //              savesolution.valeur1[l]=plaque1;
  193.                         savesolution.operation[l] = SOUS;
  194.                         //            savesolution.valeur2[l]=plaque2;
  195.                         savesolution.resultat[l] = plaque[l - 1][0];
  196.                         compte(l - 1);
  197.                     }
  198.                     r = plaque1%plaque2;
  199.                     if (!r)
  200.                     {
  201.                         plaque[l - 1][0] = plaque1 / plaque2;
  202.                         //            savesolution.valeur1[l]=plaque1;
  203.                         savesolution.operation[l] = DIV;
  204.                         //          savesolution.valeur2[l]=plaque2;
  205.                         savesolution.resultat[l] = plaque[l - 1][0];
  206.                         compte(l - 1);
  207.                     }
  208.                 }
  209.                 else
  210.                 {
  211.                     plaque[l - 1][0] = plaque2 - plaque1; // toujours superieur … 0
  212.                     savesolution.valeur1[l] = plaque2;
  213.                     savesolution.operation[l] = SOUS;
  214.                     savesolution.valeur2[l] = plaque1;
  215.                     savesolution.resultat[l] = plaque[l - 1][0];
  216.                     compte(l - 1);
  217.  
  218.                     r = plaque2%plaque1;
  219.                     if (!r)
  220.                     {
  221.                         plaque[l - 1][0] = plaque2 / plaque1;
  222.                         //          savesolution.valeur1[l]=plaque2;
  223.                         savesolution.operation[l] = DIV;
  224.                         //          savesolution.valeur2[l]=plaque1;
  225.                         savesolution.resultat[l] = plaque[l - 1][0];
  226.                         compte(l - 1);
  227.                     }
  228.                 }
  229.             }
  230.             else if (plaque1 >= plaque2)
  231.             {
  232.                 plaque[l - 1][0] = plaque1 - plaque2;
  233.                 if (plaque[l - 1][0])
  234.                 {
  235.                     //        savesolution.valeur1[l]=plaque1;
  236.                     savesolution.operation[l] = SOUS;
  237.                     //        savesolution.valeur2[l]=plaque2;
  238.                     savesolution.resultat[l] = plaque[l - 1][0];
  239.                     compte(l - 1);
  240.                 }
  241.             }
  242.             else
  243.             {
  244.                 plaque[l - 1][0] = plaque2 - plaque1; // toujours superieur … 0
  245.                 savesolution.valeur1[l] = plaque2;
  246.                 savesolution.operation[l] = SOUS;
  247.                 savesolution.valeur2[l] = plaque1;
  248.                 savesolution.resultat[l] = plaque[l - 1][0];
  249.                 compte(l - 1);
  250.             }
  251.         }
  252.     }
  253. }
  254.  
  255. int main(int argc, char *argv[])
  256. {
  257.     int i;
  258.     LARGE_INTEGER Frequence;
  259.     LARGE_INTEGER Compteur1;
  260.     LARGE_INTEGER Compteur2;
  261.     LONGLONG Ecart;
  262.  
  263.     InitCompteur(&Frequence);
  264.     CompteurOnOff(&Compteur1);
  265.  
  266.     AffichePresentation();
  267.  
  268.     if (argc == 8)
  269.     {
  270.         for (i = 0; i<6; i++)
  271.         {
  272.             plaqueini[i] = atol(argv[i + 1]);
  273.             if (plaqueini[i] <= 0)
  274.                 AfficheErreurParametres();
  275.         }
  276.         resultat = atol(argv[7]);
  277.         if (resultat <= 0)
  278.             AfficheErreurParametres();
  279.     }
  280.     else
  281.         AfficheErreurParametres();
  282.  
  283.     for (i = 0; i<6; i++)   // v‚rifie que le resultat n'est pas d‚j… dans les 6 nombres
  284.     {
  285.         if (resultat == plaqueini[i])
  286.         {
  287.             printf("Solution d‚j… dans les 6 nombres : %u\n", resultat);
  288.             printf("Appuyer sur une touche pour terminer\n");
  289.             getch();
  290.             return(0);
  291.         }
  292.     }
  293.     for (i = 0; i<6; i++)  // initialise plaque[][]
  294.         plaque[6][i] = plaqueini[i];
  295.     meilleurecart = LONG_MAX; //ecart maximal
  296.     meilleurlevel = INT_MAX;
  297.  
  298.     NombreAppelCompte = 0;
  299.  
  300.     solutions = 0;
  301.  
  302.     compte(6);
  303.  
  304.     if (meilleurecart>0)
  305.     {
  306.         printf("solution la plus proche :\n");
  307.         affichesolution(meilleurlevel);
  308.     }
  309.  
  310.     printf("\n");
  311.     printf("nombre de solutions : %lu\n", solutions);
  312.     printf("meilleur ‚cart : %lu\n", meilleurecart);
  313.     printf("nombre d'appels … la fonction r‚cursive : %lu \n(= aussi au nombre d'op‚rations 'valides' effectu‚es + 1)\n", NombreAppelCompte);
  314.  
  315.     CompteurOnOff(&Compteur2);
  316.  
  317.     Ecart = Compteur2.QuadPart - Compteur1.QuadPart;
  318.     printf("\n");
  319.     printf("TEMPS D'EXECUTION : %f seconde(s) (Frequence de l'horloge : %I64u hz)\n", (double)Ecart / Frequence.QuadPart, Frequence.QuadPart);
  320.     printf("Appuyer sur une touche pour terminer\n");
  321.     getch();
  322.  
  323.     return(0);
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement