fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdbool.h>
  5.  
  6. // Максимальное количество цифр в числе.
  7. #define N 20
  8.  
  9. double calc(void);
  10. int pri(char);
  11.  
  12. int main(void)
  13. {
  14. puts("Math 0.0.2 by Mr. Anonson, 2019");
  15.  
  16. while (true)
  17. {
  18. printf("%s", "> ");
  19. printf("%.16g\n", calc());
  20. }
  21.  
  22. return 0;
  23. }
  24.  
  25.  
  26. // Расчет введенного выражения.
  27. double calc(void)
  28. {
  29. int i = 0; // Положение в строке.
  30. int j = 0; // Положение в стеках.
  31. int k = 0; // Положение рабочей области в стеках.
  32. int f = 0; // Флаг конца выражения и понижения приоритета.
  33. char ch; // Считываемый с ввода символ.
  34. char str[N]; // Строка под число.
  35. char op[3]; // Стек операторов.
  36. double num[3]; // Стек чисел.
  37.  
  38. do
  39. {
  40. ch = getchar();
  41.  
  42. // Парсим ввод на числа и операторы.
  43. switch (ch)
  44. {
  45. case '0':
  46. case '1':
  47. case '2':
  48. case '3':
  49. case '4':
  50. case '5':
  51. case '6':
  52. case '7':
  53. case '8':
  54. case '9':
  55. case '.':
  56. if (i < N-1)
  57. {
  58. str[i] = ch; // Кладем цифоры в строку.
  59. i++;
  60. }
  61. break;
  62.  
  63. case '*':
  64. case '/':
  65. if (j > 0 && pri(ch) > pri(op[k]))
  66. k++;
  67. op[j] = ch; // Загоняем символы операторов в стек.
  68. str[i] = '\0';
  69. num[j] = atof(str); // Переводим строку в число и загоняем в стек.
  70. i = 0;
  71. j++;
  72. break;
  73.  
  74. case '+':
  75. case '-':
  76. if (k > 0)
  77. f++;
  78. op[j] = ch;
  79. str[i] = '\0';
  80. num[j] = atof(str);
  81. i = 0;
  82. j++;
  83. break;
  84.  
  85. case '\n':
  86. if (k > 0)
  87. f = k;
  88. str[i] = '\0';
  89. num[j] = atof(str);
  90. i = 0;
  91. j++;
  92. break;
  93. }
  94.  
  95. while (j > k+1)
  96. {
  97. /* // Для отладки.
  98. printf("%c %g\n", op[0], num[0]);
  99. printf("%c %g\n", op[1], num[1]);
  100. printf("%c %g\n\n", op[2], num[2]); */
  101.  
  102. // Считаем выражения.
  103. switch (op[k])
  104. {
  105. case '+':
  106. num[k] += num[k+1];
  107. break;
  108. case '-':
  109. num[k] -= num[k+1];
  110. break;
  111. case '*':
  112. num[k] *= num[k+1];
  113. break;
  114. case '/':
  115. num[k] /= num[k+1];
  116. break;
  117. }
  118.  
  119. op[k] = op[k+1]; // Сдвиг стека операторов.
  120. j--;
  121. if (f > 0)
  122. {
  123. k--;
  124. f--;
  125. }
  126. }
  127. }
  128. while (ch != '\n');
  129.  
  130. return num[0];
  131. }
  132.  
  133.  
  134. // Приоритет оператора.
  135. int pri(char ch)
  136. {
  137. int pr;
  138.  
  139. switch (ch)
  140. {
  141. case '+':
  142. case '-':
  143. pr = 1;
  144. break;
  145. case '*':
  146. case '/':
  147. pr = 2;
  148. break;
  149. }
  150.  
  151. return pr;
  152. }
Time limit exceeded #stdin #stdout 5s 9424KB
stdin
Standard input is empty
stdout
Standard output is empty