Advertisement
Le_BuG63

Untitled

Jul 4th, 2014
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. enum    suitType_e
  7. {
  8.     UNKNOW,
  9.     CONSTANT,
  10.     GEOMETRIC,
  11.     ARITHMETIC
  12. };
  13.  
  14. typedef enum suitType_e suitType_t;
  15.  
  16. int         get_numbers(char *pStrOperation, int *iTab)
  17. {
  18.     unsigned int    k = 0;
  19.     char            *pch = NULL;
  20.  
  21.     pch = strtok(pStrOperation, ", -+");
  22.  
  23.     while(pch != NULL)
  24.     {
  25.         iTab[k++] = atoi(pch);
  26.  
  27.         pch = strtok(NULL, ", -+");
  28.     }
  29.  
  30.     return k;
  31. }
  32.  
  33. suitType_t  get_suit_type(int *iTab, size_t nNumbersInTab)
  34. {
  35.     size_t  index;
  36.     int     err = 0;
  37.     int     tmp;
  38.  
  39.  
  40.     tmp = iTab[0];
  41.     for(index = 1; index < nNumbersInTab && err != 1; ++index) // On va vérifier si les nombres sont "CONSTANT"
  42.     {
  43.         if(tmp != iTab[index])
  44.             err = 1;
  45.     }
  46.  
  47.     if(!err) return CONSTANT; err = 0;
  48.  
  49.     tmp = iTab[1] - iTab[0];
  50.     for(index = 2; index < nNumbersInTab && err != 1; ++index) // On va vérifier si les nombres sont "ARITHMETIC"
  51.     {
  52.         if(iTab[index] - iTab[index - 1] != tmp)
  53.             err = 1;
  54.     }
  55.  
  56.     if(!err) return ARITHMETIC; err = 0;
  57.  
  58.     tmp = iTab[1] / iTab[0];
  59.     for(index = 2; index < nNumbersInTab && err != 1; ++index) // On va vérifier si les nombres sont "GEOMETRIC"
  60.     {
  61.         if(iTab[index] / iTab[index - 1] != tmp)
  62.             err = 1;
  63.     }
  64.  
  65.     if(!err) return GEOMETRIC; err = 0;
  66.  
  67.     return UNKNOW;
  68. }
  69.  
  70. void        continue_suit(suitType_t suitType, int *iTab, size_t numbersToPrint)
  71. {
  72.     size_t  index;
  73.     int     factor;
  74.     int     value;
  75.  
  76.     switch(suitType)
  77.     {
  78.     case ARITHMETIC:
  79.         factor  = iTab[1] - iTab[0];
  80.         value   = iTab[0];
  81.  
  82.         for(index = 1; index < numbersToPrint; ++index)
  83.         {
  84.             printf("%d|", value);
  85.             value += factor;
  86.         }
  87.  
  88.         break;
  89.     case GEOMETRIC:
  90.         factor  = iTab[1] / iTab[0];
  91.         value   = iTab[0];
  92.  
  93.         for(index = 1; index < numbersToPrint; ++index)
  94.         {
  95.             printf("%d|", value);
  96.             value *= factor;
  97.         }
  98.         break;
  99.  
  100.     case CONSTANT:
  101.         value = iTab[0];
  102.         for(index = 1; index < numbersToPrint; ++index)
  103.             printf("%d|", value);
  104.         break;
  105.  
  106.     case UNKNOW:
  107.         printf("Il n'y a aucune suite logique trouvee.\n");
  108.         break;
  109.  
  110.     default:        // Ça ne devrait pas arriver, mais on sait jamais
  111.         break;
  112.     }
  113. }
  114.  
  115. int main(int argc, char *argv[])
  116. {
  117.     size_t      numbersToPrint = atoi(argv[1]);
  118.     size_t      sizeStringOperation = strlen(argv[2]);
  119.     int         *iTab = malloc(sizeStringOperation);
  120.     int         nNumbers;
  121.     suitType_t  suitType;
  122.  
  123.     if(iTab == NULL)
  124.     {
  125.         fprintf(stderr, "Erreur: memoire allouee indisponible");
  126.         return 1;
  127.     }
  128.  
  129.  
  130.     nNumbers = get_numbers(argv[2], iTab);
  131.  
  132.     suitType = get_suit_type(iTab, nNumbers);
  133.  
  134.     continue_suit(suitType, iTab, numbersToPrint);
  135.  
  136.     free(iTab);
  137.  
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement