C语言if else中如何使用循环实现会员类型非法输入重校验
超市会员折扣计算功能修复方案
需求回顾
需要实现的功能逻辑:
- 读取用户输入的会员类型、商品价格,计算折扣后应付金额
- 兼容大小写形式的会员编码输入
- 会员编码输入无效时,循环提示用户重新输入,直到获得合法值
会员折扣规则: - 白金会员(编码P/p):享30%折扣
- 黄金会员(编码G/g):享20%折扣
- 白银会员(编码S/s):享10%折扣
- 非会员(编码X/x):无折扣
原代码问题点
原有代码在输入合法值时可以正常计算,但存在几个核心问题导致非法输入时无法实现循环重输的逻辑:
- 未使用循环结构做输入校验:非法输入分支只做了一次重复输入处理,既不校验第二次输入的合法性,也没有复用后续的折扣计算逻辑
- 代码冗余度极高:大小写相同等级的会员判断、输出、计算逻辑完全重复编写,后续维护成本高
- 存在多处语法和输入逻辑bug:
- 定义了
membershipTypeTwo、membershipType2、itemPrice2等多个从未使用的冗余变量 - 会员类型输入提示的
printf错误加了%c占位符,未输入就打印变量值会输出乱码 - 商品价格输入提示的
printf缺失格式占位符 - 未处理输入缓冲区残留的换行符,容易导致后续
scanf读取异常 - 非法分支中的多值判断写法错误,末尾多余的分号让判断语句完全失效,根本起不到校验作用
- 定义了
修复后完整代码
#include <stdio.h> #include <ctype.h> int main() { printf("Suria Supermarket"); char membershipType; float itemPrice; float discountedAmount; int discountPercent; float discountRate; // 循环校验会员类型,输入合法才退出循环 while(1) { printf("\nEnter membership type (S or G or P, X for non-member): "); scanf("%c", &membershipType); // 清空输入缓冲区残留的换行符,避免后续读入异常 while(getchar() != '\n'); // 统一转为大写做判断,自动兼容小写输入 membershipType = toupper(membershipType); // 输入合法则跳出输入循环 if(membershipType == 'S' || membershipType == 'G' || membershipType == 'P' || membershipType == 'X') { break; } // 输入非法则提示错误,进入下一轮循环重输 printf("Invalid code, please enter again.\n\n"); } // 读取商品价格 printf("Enter item price (RM): "); scanf("%f", &itemPrice); // 匹配对应会员等级的折扣 switch(membershipType) { case 'P': discountPercent = 30; discountRate = 0.3; break; case 'G': discountPercent = 20; discountRate = 0.2; break; case 'S': discountPercent = 10; discountRate = 0.1; break; case 'X': default: discountPercent = 0; discountRate = 0; break; } discountedAmount = itemPrice * (1 - discountRate); // 统一输出结算结果 printf("\nItem Price: RM %1.2f", itemPrice); printf("\nMembership Type: %c", membershipType); printf("\nDiscount (%%): %d\n", discountPercent); printf("Discounted Price: RM %1.2f", discountedAmount); return 0; }
优化说明
- 用无限循环包裹会员类型输入逻辑,每次输入后做合法性校验,只有输入符合要求的编码才会跳出循环进入价格计算步骤,不管输错多少次都会持续提示重输
- 输入会员编码后统一转为大写字母做匹配,不需要为大小写分别写重复的判断、计算逻辑,代码量缩减近一半,后续调整折扣规则只需要修改一处
- 清理了所有无用冗余变量,修复了原代码中所有printf占位符错误、输入缓冲区残留导致的读取异常问题
- 折扣匹配、结果输出逻辑全部收敛,没有重复代码,可读性和可维护性更高
内容的提问来源于stack exchange,提问作者itzuman
相关产品推荐
相关产品推荐

