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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:28