C语言自动售货机代码仅执行首个if块,请求技术排查
自动售货机程序分支失效问题修复与原因解析
核心错误原因
你的第一个if条件写法存在逻辑漏洞:
if ( G == 119 || 87)
在C语言中,逻辑或||的两侧必须是完整的布尔表达式。上面的代码等价于(G == 119) || (87),而87是一个非零整数,在条件判断中会被直接判定为true。这就导致无论G的值是什么,整个条件恒为真,第一个分支永远会被执行,后续的else if自然没有机会触发。
修复方案
把每个条件分支的逻辑判断补全,每个字符比较都要明确和G进行对比。另外,直接使用字符常量(比如'w'、'W')比ASCII码更易读,避免记错数值:
修复后的条件判断代码片段:
if (G == 'w' || G == 'W') { // 水的分支逻辑 } else if (G == 'b' || G == 'B') { // Bionade的分支逻辑 } else if (G == 'o' || G == 'O') { // 橙汁的分支逻辑 } else { printf("\n无效的饮品选项!\n"); }
额外优化建议
- 浮点数比较问题:直接用
==比较浮点数(比如p == 0.5)存在精度风险,因为浮点数在存储时可能有微小误差。建议用范围判断替代:
#include <math.h> // 需要包含math.h头文件 // 示例:判断p是否接近0.5,误差在1e-6以内 if (fabs(p - 0.5) < 1e-6) { printf("\n Entnehmen Sie Ihr Getränk \n"); }
- 输入处理优化:使用
scanf("%c", &G)时,如果用户输入后按回车,换行符会留在输入缓冲区,可能影响后续输入。可以改成scanf(" %c", &G);(注意%c前的空格),让scanf自动跳过空白字符(包括换行、空格等)。
完整修复后的代码
#include <stdlib.h> #include <stdio.h> #include <math.h> // 用于浮点数比较的fabs函数 void Fkt(int); int main(void) { int x; char G; float p; printf("*** Getraenke Automat *** \n*W) Wasser (0.5 Euro)* \n*B) Bionade (1 Euro)*\n*O) Orangensaft (2 Euro)*\n***********************\n\nBitte ein Getränk auswaeheln "); scanf(" %c", &G); // 加空格跳过空白字符 if (G == 'w' || G == 'W') { printf("\n Bitte Zahlen Sie 0.5 Euro "); scanf("%f", &p); if (fabs(p - 0.5) < 1e-6) { printf("\n Entnehmen Sie Ihr Getränk \n"); } else { printf("\nGeben Sie den richtigen Betrag ein!\n"); } } else if (G == 'b' || G == 'B') { printf("\n Bitte Zahlen Sie 1 Euro "); scanf("%f", &p); if (fabs(p - 1.0) < 1e-6) { printf("\n Entnehmen Sie Ihr Getränk \n"); } else { printf("\nGeben Sie den richtigen Betrag ein!\n"); } } else if (G == 'o' || G == 'O') { printf("\n Bitte Zahlen Sie 2 Euro "); scanf("%f", &p); if (fabs(p - 2.0) < 1e-6) { printf("\n Entnehmen Sie Ihr Getränk \n"); } else { printf("\nGeben Sie den richtigen Betrag ein!\n"); } } else { printf("\nUngültige Auswahl!\n"); } return 0; } void Fkt(int x){ printf("\n------------\n"); }
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

