fork download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 5 // スタックの最大サイズ(必要に応じて変更してください)
  4.  
  5. double stack[SIZE]; // スタックの本体(実数型)
  6. int sp = 0; // スタックポインタ
  7.  
  8. // 関数のプロトタイプ宣言
  9. void push(double value);
  10. double pop(void);
  11. int isFull(void);
  12. int isEmpty(void);
  13. void answer(void);
  14. void reset(void);
  15.  
  16. int main(void) {
  17. int resp;
  18. double val;
  19. // cal1, cal2 は必要に応じてmain内で使用してください
  20. double cal1, cal2;
  21.  
  22. while (1) {
  23. printf("1:push 2:pop 3:show 9:exit \nメニューを選択してください: ");
  24. // scanfの戻り値警告に対応するため、戻り値をチェックするかキャストする
  25. if (scanf("%d", &resp) != 1) {
  26. break;
  27. }
  28.  
  29. if (resp == 9) {
  30. break; // 45行目付近の「case 9」エラー対策:正しくループを抜ける処理
  31. }
  32.  
  33. switch (resp) {
  34. case 1:
  35. printf("プッシュする数値を入力: ");
  36. if (scanf("%lf", &val) == 1) {
  37. push(val);
  38. }
  39. break;
  40. case 2:
  41. // 28〜29行目のエラー対策:正しくpopを呼び出して変数に代入
  42. if (!isEmpty()) {
  43. cal1 = pop();
  44. printf("ポップした値: %f\n", cal1);
  45. } else {
  46. printf("スタックは空です。\n");
  47. }
  48. break;
  49. case 3:
  50. answer();
  51. break;
  52. default:
  53. printf("正しいメニューを選択してください。\n");
  54. break;
  55. }
  56. }
  57. return 0;
  58. }
  59.  
  60. // --- スタック操作関数群 ---
  61.  
  62. // データを入れる
  63. void push(double value) {
  64. if (isFull()) { // ❌ if(isFull(){ のタイポを修正
  65. printf("エラー: スタックが満杯です。\n");
  66. return;
  67. }
  68. stack[sp] = value;
  69. sp++;
  70. }
  71.  
  72. // データを south (取り出す)
  73. double pop(void) {
  74. if (isEmpty()) { // ❌ if(isEmpty)(){ のタイポを修正
  75. printf("エラー: スタックが空です。\n");
  76. return 0.0; // ❌ 戻り値がない警告を修正(0.0を返す)
  77. }
  78. sp--;
  79. return stack[sp];
  80. }
  81.  
  82. // スタックが満杯か確認する
  83. int isFull(void) {
  84. if (sp >= SIZE) { // ❌ => を >= に修正
  85. return 1;
  86. }
  87. return 0;
  88. }
  89.  
  90. // スタックが空か確認する
  91. int isEmpty(void) {
  92. if (sp == 0) {
  93. return 1;
  94. }
  95. return 0;
  96. }
  97.  
  98. // スタックの中身を表示する
  99. void answer(void) {
  100. // ❌ forの更新式後ろの「;」を削除。printfの「%d」を「%f」に修正
  101. for (int i = 0; i < sp; i++) {
  102. printf("stack[%d] = %f \n", i, stack[i]);
  103. }
  104. }
  105.  
  106. // スタックをリセットする
  107. void reset(void) {
  108. sp = 0;
  109. }
  110.  
Success #stdin #stdout 0s 5320KB
stdin
1
1 2
stdout
1:push 2:pop 3:show 9:exit 
メニューを選択してください: プッシュする数値を入力: 1:push 2:pop 3:show 9:exit 
メニューを選択してください: ポップした値: 1.000000
1:push 2:pop 3:show 9:exit 
メニューを選択してください: