fork(2) 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.  
  11. int main(void)
  12. {
  13. puts("Math 0.0.1 by Mr. Anonson, 2019");
  14.  
  15. while (true)
  16. {
  17. printf("%s", "> ");
  18. printf("%.16g\n", calc());
  19. }
  20.  
  21. return 0;
  22. }
  23.  
  24. double calc(void)
  25. {
  26. int i, j;
  27. char ch;
  28. char op[2]; // стек операторов
  29. char str[N]; // строка под число
  30. double num[2]; // стек чисел
  31.  
  32. i = 0;
  33. j = 0;
  34. do
  35. {
  36. ch = getchar();
  37.  
  38. // парсим ввод на числа и операторы
  39. switch (ch)
  40. {
  41. case '0':
  42. case '1':
  43. case '2':
  44. case '3':
  45. case '4':
  46. case '5':
  47. case '6':
  48. case '7':
  49. case '8':
  50. case '9':
  51. case '.':
  52. if (i < N-1)
  53. {
  54. str[i] = ch; // загоняем символы цифор в строку
  55. i++;
  56. }
  57. break;
  58. case '+':
  59. case '-':
  60. if (j == 0)
  61. {
  62. op[1] = ch; // костыль для первого выражения
  63. }
  64. else
  65. {
  66. op[0] = ch; // загоняем символы операторов в стек
  67. }
  68. case '\n':
  69. str[i] = '\0';
  70. num[j] = atof(str); // переводим строку в число и загоняем в стек
  71. i = 0;
  72. j++;
  73. break;
  74. }
  75. if (j == 2)
  76. {
  77. /* // для отладки
  78. printf("num[0] = %g\n", num[0]);
  79. printf("num[1] = %g\n", num[1]);
  80. printf("op[1] = %c\n", op[1]); */
  81.  
  82. // считаем выраженя по порядку
  83. switch (op[1])
  84. {
  85. case '+':
  86. num[0] += num[1];
  87. break;
  88. case '-':
  89. num[0] -= num[1];
  90. break;
  91. }
  92. op[1] = op[0];
  93. j = 1;
  94. }
  95. }
  96. while (ch != '\n');
  97.  
  98. return num[0];
  99. }
Time limit exceeded #stdin #stdout 5s 9424KB
stdin
1+1
Я так понял, тут вывод не работает на бесконечных циклах. :(
stdout
Standard output is empty