fork download
  1. #include <stdio.h>
  2. #define SIZE 10
  3.  
  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 reset(void);
  13.  
  14. int main(void) {
  15. reset();
  16. int resp;
  17. double data, a, b; // a, b, data を double 型に変更
  18.  
  19. while(1){
  20.  
  21. scanf("%d", &resp);
  22.  
  23. // 9が入力された、または0以下、6〜8が入力されたらループを抜ける(終了)
  24. if(resp == 9 || resp <= 0 || resp > 5) break;
  25.  
  26. switch(resp){
  27. case 1:
  28. b = pop(); // 先にポップしたものが右項(b)
  29. a = pop(); // 次にポップしたものが左項(a)
  30. push(a + b);
  31. break;
  32. case 2:
  33. b = pop();
  34. a = pop();
  35. push(a - b); // a - b の順に修正
  36. break;
  37. case 3:
  38. b = pop();
  39. a = pop();
  40. push(a * b);
  41. break;
  42. case 4:
  43. b = pop();
  44. a = pop();
  45. if (b != 0) {
  46. push(a / b); // a / b の順に修正
  47. } else {
  48. printf("エラー: 0で割ることはできません\n");
  49. push(a); // 状態を戻すために戻しておく
  50. }
  51. break;
  52. case 5:
  53. scanf("%lf", &data); // double型なので %lf を使用
  54. push(data);
  55. printf("data:%f\n", data);
  56. break;
  57. }
  58. }
  59. answer();
  60. return 0;
  61. }
  62.  
  63. void push(double value){
  64. if(isFull()){
  65. printf("スタックが満杯で入りませんでした\n");
  66. }else{
  67. stack[sp++] = value;
  68. }
  69. }
  70.  
  71. double pop(void){
  72. if(isEmpty()){
  73. printf("スタックが空で取り出せませんでした\n");
  74. return 0;
  75. }else{
  76. return stack[--sp];
  77. }
  78. }
  79.  
  80. int isFull(void){
  81. if(sp >= SIZE){
  82. return 1;
  83. }else{
  84. return 0;
  85. }
  86. }
  87.  
  88. int isEmpty(void){
  89. if(sp <= 0){
  90. return 1;
  91. }else{
  92. return 0;
  93. }
  94. }
  95.  
  96. void answer(void){
  97. if (sp > 0) {
  98. printf("answer:%f\n", stack[sp - 1]);
  99. } else {
  100. printf("スタックに結果がありません\n");
  101. }
  102. }
  103.  
  104. void reset(void){
  105. sp = 0; // セミコロンを追加
  106. }
  107.  
Success #stdin #stdout 0.01s 5316KB
stdin
5
1
5
2
1
9
stdout
data:1.000000
data:2.000000
answer:3.000000