Pushok

calc test

Apr 25th, 2011
402
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 <string.h>
  4.  
  5. #define NaN 0xaFFFFFF
  6.  
  7. struct com {
  8.     int digit;
  9.     char oper;
  10.     int nextdigit;
  11. } parser = {NaN, NULL, NaN};
  12.  
  13. int isStrDigit(char* c)
  14. {
  15.     int i;
  16.     for(i=0;i<strlen(c);i++)
  17.     {
  18.         if(!isdigit(c[i]) || c[i] == 0)
  19.             return 0;
  20.     }
  21.  
  22.     return 1;
  23. }
  24.  
  25. int main()
  26. {
  27.     char expression[1024] ;
  28.     scanf("%s", expression);
  29.     printf("\n%s\n", expression);
  30.     char* c = expression;
  31.     char* mem = (char*)malloc(sizeof(char*) * 256);
  32.  
  33.     do
  34.     {
  35.         char* ch = c;
  36.         char* cptr = mem;
  37.         *cptr = 0;
  38.  
  39.         if(isdigit(*ch))
  40.         {
  41.             if(isdigit(*(ch+1)))
  42.             {
  43.                 do
  44.                 {
  45.                     *cptr++ = *ch++;
  46.                 }while(isdigit(*ch));
  47.  
  48.                 *(cptr++) = 0;
  49.                 c = ch-1;
  50.             }
  51.             else
  52.             {
  53.                 *cptr = *ch;
  54.                 *(cptr+1) = 0;
  55.             }
  56.         }
  57.         else
  58.         {
  59.             if(parser.digit != NaN && parser.oper == 0)
  60.             {
  61.                 parser.oper = *ch;
  62.             }
  63.             else
  64.             {
  65.                 printf("Error in expression!");
  66.                 free(mem);
  67.                 exit(1);
  68.             }
  69.         }
  70.  
  71.         if(*mem != '\0')
  72.         {
  73.             if(parser.digit == NaN) // first runing
  74.             {
  75.                 parser.digit = atoi(mem) ;
  76.             }
  77.             else if(parser.nextdigit == NaN)
  78.             {
  79.                 parser.nextdigit = atoi(mem) ;
  80.             }
  81.         }
  82.  
  83.         if(parser.nextdigit != NaN)
  84.         {
  85.                switch(parser.oper)
  86.                {
  87.                    case '+':
  88.                    {
  89.                        parser.digit += parser.nextdigit;
  90.                        parser.nextdigit = NaN;
  91.                        break;
  92.                    }
  93.                    case '-':
  94.                    {
  95.                        parser.digit -= parser.nextdigit;
  96.                        parser.nextdigit = NaN;
  97.                        break;
  98.                    }
  99.                    default:
  100.                    {
  101.                        printf("\nThis command is not supported!");
  102.                        free(mem);
  103.                        exit(1);
  104.                    }
  105.                }
  106.  
  107.                parser.oper = 0;
  108.         }
  109.  
  110.         int i;
  111.         for(i=0;i<256;i++) mem[i] = 0;
  112.  
  113.         c++;
  114.  
  115.     }while(*c);
  116.  
  117.     printf("\n%d", parser.digit);
  118.     getchar();
  119.  
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment