You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
}

额外优化建议

  1. 浮点数比较问题:直接用==比较浮点数(比如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");
}
  1. 输入处理优化:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:05:44