fork download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 10
  4. double stack[SIZE];
  5. int sp;
  6.  
  7. void push(double value);
  8. double pop(void);
  9. int isFull(void);
  10. int isEmpty(void);
  11. void answer(void);
  12. void rest(void);
  13.  
  14. int main(void)
  15. {
  16. rest();
  17.  
  18. while(1){
  19. int resp;
  20. double x, a1, a2;
  21.  
  22. // オペレーションの選択を促すメッセージ
  23. printf("操作を選んでください (1: +, 2: -, 3: *, 4: /, 5: 入力, 9: 結果表示): ");
  24.  
  25. // scanf の戻り値を確認
  26. if (scanf("%d", &resp) != 1) {
  27. printf("入力エラー。再度入力してください。\n");
  28. // 入力に失敗した場合、バッファをクリア
  29. while (getchar() != '\n');
  30. continue;
  31. }
  32.  
  33. switch(resp){
  34. case 1: // 足し算
  35. if (!isEmpty()) {
  36. x = pop() + pop();
  37. push(x);
  38. }
  39. break;
  40. case 2: // 引き算
  41. if (!isEmpty()) {
  42. a1 = pop(); a2 = pop();
  43. x = a2 - a1;
  44. push(x);
  45. }
  46. break;
  47. case 3: // 掛け算
  48. if (!isEmpty()) {
  49. x = pop() * pop();
  50. push(x);
  51. }
  52. break;
  53. case 4: // 割り算
  54. if (!isEmpty()) {
  55. a1 = pop(); a2 = pop();
  56. if (a1 != 0) {
  57. x = a2 / a1;
  58. push(x);
  59. } else {
  60. printf("ゼロ除算エラーです。\n");
  61. push(a2); // エラー時は元に戻す
  62. push(a1);
  63. }
  64. }
  65. break;
  66. case 5: // 値の入力
  67. printf("値を入力してください: ");
  68. if (scanf("%lf", &x) != 1) { // 入力の確認
  69. printf("入力エラー。再度入力してください。\n");
  70. while (getchar() != '\n'); // バッファクリア
  71. continue;
  72. }
  73. push(x);
  74. break;
  75. case 9: // 結果表示して終了
  76. answer();
  77. return 0; // プログラム終了
  78. default:
  79. printf("不正な操作です。\n");
  80. }
  81. }
  82.  
  83. return 0;
  84. }
  85.  
  86. void push(double value){
  87. if( isFull() ){
  88. printf("スタックが満杯で入りませんでした\n");
  89. }else{
  90. stack[sp++] = value;
  91. }
  92. }
  93.  
  94. double pop(void){
  95. if( isEmpty() ){
  96. printf("スタックが空で取り出せませんでした\n");
  97. return 0;
  98. }else{
  99. return stack[--sp];
  100. }
  101. }
  102.  
  103. int isFull(void){
  104. return sp >= SIZE;
  105. }
  106.  
  107. int isEmpty(void){
  108. return sp <= 0;
  109. }
  110.  
  111. void answer(void){
  112. if (!isEmpty()) {
  113. printf("answer: %.2lf\n", pop()); // 小数点以下2桁まで表示
  114. } else {
  115. printf("スタックが空です。\n");
  116. }
  117. }
  118.  
  119. void rest(void){
  120. sp = 0;
  121. }
  122.  
Success #stdin #stdout 0.01s 5284KB
stdin
5 1 5 2 1 9
stdout
操作を選んでください (1: +, 2: -, 3: *, 4: /, 5: 入力, 9: 結果表示): 値を入力してください: 操作を選んでください (1: +, 2: -, 3: *, 4: /, 5: 入力, 9: 結果表示): 値を入力してください: 操作を選んでください (1: +, 2: -, 3: *, 4: /, 5: 入力, 9: 結果表示): 操作を選んでください (1: +, 2: -, 3: *, 4: /, 5: 入力, 9: 結果表示): answer: 3.00