C语言ATM取款代码修复:实现仅5的倍数取款金额进入if分支
问题根因
原代码的if判断逻辑存在两处核心问题:
x / 5的判定逻辑完全错误:C语言中非0值会被识别为布尔真,只要输入的取款金额不为0,不管是否是5的倍数,该条件都会判定为成立,无法完成倍数校验。- 缺少取款金额为正数的校验,用户输入负数时也会被判定为合法。
修复方案
将if判断条件替换为同时满足以下三个规则的逻辑:
- 取款金额为正
- 取款金额是5的倍数
- 取款金额不超过账户余额
针对ATM取款场景默认仅支持整数元取款的规则,我们可以将浮点数转为整数后做取模运算判断倍数,避免浮点数精度问题。
完整修复代码
#include <stdio.h> int main(void) { float x; // 初始账户余额2000元 float y = 2000; printf("Instruction: This ATM accepts values which are multiple of 5 \n"); printf("Enter the amount to withdraw: \n"); scanf("%f", &x); // 修正后的判断条件:金额为正、是5的倍数、余额充足 if ((int)x > 0 && (int)x % 5 == 0 && x <= y) { float z = y - x; // 扣除0.5元手续费 float a = z - 0.5; printf("Your Transaction is successful\n\n"); printf("Your Account Balance is %f\n\n", a); } else { printf("Error: %f\n\n", x); printf("Read the Instruction carefully\n\n"); } return 0; }
补充说明
如果需要支持带角分的取款校验,可以引入<math.h>库,使用浮点数取余函数做判断,对应判断条件改为:x > 0 && fabs(fmod(x, 5)) < 1e-6 && x <= y
内容的提问来源于stack exchange,提问作者devskst
相关产品推荐
相关产品推荐

