Advertisement
mrAnderson33

calculator(3 laba mati)

Nov 13th, 2016
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.57 KB | None | 0 0
  1. #pragma warning(disable : 4996)
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<ctype.h>
  6.  
  7. #define SIZE 100
  8. #define ISOP(x) (x == '(' || x == '+' || x == '-' || x == '*' || x == '/' || x == ')')
  9.  
  10. const char *errs[] =
  11. {
  12.     "File names not defined in command line!"
  13.     , "Input file not exists!"
  14.     , "Output file can't be created!"
  15.     , "Dividing by zero!"
  16.     , "Incorrect placement of brackets!"
  17. };
  18.  
  19. void error(int);
  20. int gorner(char *);
  21. int priority(char);
  22.  
  23. int main(int argc, char *argv[])
  24. {
  25.     FILE *fIn = NULL;
  26.     if (!(fIn = fopen(argv[1], "r"))) error(2);
  27.     char c, c_ = ' ', buf[SIZE] = { 0 }, *b = buf, operStack[SIZE] = { 0 }, *o = operStack;
  28.     int numStack[SIZE] = { 0 }, *n = numStack;
  29.     *o++ = '(';
  30.     while (!feof(fIn))
  31.     {
  32.         c = fgetc(fIn);
  33.         if (isdigit(c)) *b++ = c;
  34.         else if (isdigit(c_))
  35.         {
  36.             *b = 0;
  37.             b = buf;
  38.             *n++ = gorner(buf);
  39.         }
  40.         if (ISOP(c))
  41.         {
  42.             if (c == '(') *o++ = c;
  43.             else if (c == ')')
  44.             {
  45.                 while (priority(*--o))
  46.                 {
  47.                     int num2 = *--n;
  48.                     int num1 = *--n;
  49.                     switch (*o)
  50.                     {
  51.                     case '+': num1 += num2; break;
  52.                     case '-': num1 -= num2; break;
  53.                     case '*': num1 *= num2; break;
  54.                     case '/':
  55.                         if (!num2) error(4);
  56.                         num1 /= num2;
  57.                         break;
  58.                     }
  59.                     *n++ = num1;
  60.                 }
  61.                 o--;
  62.             }
  63.             else while (priority(c) <= priority(*(o - 1)) && priority(*(o - 1)))
  64.             {
  65.                 int num2 = *--n;
  66.                 int num1 = *--n;
  67.                 switch (*--o)
  68.                 {
  69.                 case '+': num1 += num2; break;
  70.                 case '-': num1 -= num2; break;
  71.                 case '*': num1 *= num2; break;
  72.                 case '/':
  73.                     if (!num2) error(4);
  74.                     num1 /= num2;
  75.                     break;
  76.                 }
  77.                 *n++ = num1;
  78.             }
  79.             if (c != '(' && c != ')') *o++ = c;
  80.         }
  81.         else if (c == ';')
  82.         {
  83.             while (o != operStack + 1)
  84.             {
  85.                 int num2 = *--n;
  86.                 int num1 = *--n;
  87.                 switch (*--o)
  88.                 {
  89.                 case '+': num1 += num2; break;
  90.                 case '-': num1 -= num2; break;
  91.                 case '*': num1 *= num2; break;
  92.                 case '/':
  93.                     if (!num2) error(4);
  94.                     num1 /= num2;
  95.                     break;
  96.                 }
  97.                 *n++ = num1;
  98.             }
  99.             printf("= %d\n", *--n);
  100.             n = numStack;
  101.             o = operStack;
  102.             *o++ = '(';
  103.         }
  104.         c_ = c;
  105.     }
  106.     fclose(fIn);
  107.     getchar();
  108.     return 0;
  109. }
  110.  
  111. void error(int errNum)
  112. {
  113.     printf("%s\nPress any key to exit...", errs[errNum - 1]);
  114.     getchar();
  115.     exit(errNum - 1);
  116. }
  117.  
  118. int gorner(char *num)
  119. {
  120.     int res = 0;
  121.     while (*num) res = res * 10 + *num++ - '0' ;
  122.     return res;
  123. }
  124.  
  125. int priority(char c)
  126. {
  127.     switch (c)
  128.     {
  129.     case '(': return 0; break;
  130.     case '+': return 1; break;
  131.     case '-': return 1; break;
  132.     case '*': return 2; break;
  133.     case '/': return 2; break;
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement