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

C++条件判断语句逻辑错误致票务折扣计算异常问题排查

票务折扣计算程序逻辑问题排查

问题描述

我写了一个C++程序用来计算票务折扣,需求是:

  • 计算折扣率、折后总价及节省金额并告知用户
  • 支持用户输入大小写Y/N

测试时发现:

  • 输入10张票、是学生非客户:折扣10%,折后90美元,节省10美元,符合预期
  • 输入6张票、是新客户非学生:预期15%折扣、折后51美元、节省9美元,但程序显示0%折扣、总价60美元、节省0美元
  • 尝试把最后一个条件从else if改成else后,又出现其他计算错误,怀疑核心逻辑有问题

原代码

#include <iostream>

using namespace std;

float numberTickets;
char customer;
char student;
float totalPrice;

int main()
{
   
    float discountCustomer;
    float discountStudent;
    float discountBoth;
    float savings;
    float savingsCustomer;
    float savingsStudent;

    cout<<"How many tickets are you purchasing? ";
    cin>>numberTickets;
    cout<<"Are you a new customer (Y/N): ";
    cin>>customer;
    cout<<"Are you a student (Y/N): ";
    cin>>student;

    if (customer=='N' || customer=='n' && student=='N' || student=='n'){
        cout<<"You will receive a discount of 0%"<<endl;
    }else if (student=='Y' || student=='y' && customer=='N' || customer=='n'){
        cout<<"You will receive a discount of 10%"<<endl;
    }else if (customer=='Y' || customer=='y' && student=='N' || student=='n'){
        cout<<"You will receive a discount of 15%"<<endl;
    }else if (customer=='Y' || customer=='y' && student=='Y' || student=='y'){
        cout<<"You will receive a discount of 25%"<<endl;
    }

    totalPrice = (numberTickets)*10;
    discountCustomer = (totalPrice)*(0.85);
    discountStudent = (totalPrice)*(0.90);
    discountBoth = (totalPrice)*(0.75);
    savings = (totalPrice)-(discountBoth);
    savingsCustomer = (totalPrice)-(discountCustomer);
    savingsStudent = (totalPrice)-(discountStudent);

    if (customer=='N' || customer=='n' && student=='N' || student=='n'){
        cout<<"Your price for "<<numberTickets<<" ticket(s) is $"<<totalPrice<<endl;
    }else if (student=='Y' || student=='y' && customer=='N' || customer=='n'){
        cout<<"Your price for "<<numberTickets<<" ticket(s) is $"<<discountStudent<<endl;
    }else if (customer=='Y' || customer=='y' && student=='N' || student=='n'){
        cout<<"Your price for "<<numberTickets<<" ticket(s) is $"<<discountCustomer<<endl;
    }else if (customer=='Y' || customer=='y' && student=='Y' || student=='y'){
        cout<<"Your price for "<<numberTickets<<" ticket(s) is $"<<discountBoth<<endl;
    }

    if (customer=='N' || customer=='n' && student=='N' || student=='n'){
        cout<<"You saved $0"<<endl;
    }else if (student=='Y' || student=='y' && customer=='N' || customer=='n'){
        cout<<"You saved $"<<savingsStudent<<endl;
    }else if (customer=='Y' || customer=='y' && student=='N' || student=='n'){
        cout<<"You saved $"<<savingsCustomer<<endl;
    }else if (customer=='Y' || customer=='y' && student=='Y' || student=='y'){
        cout<<"You saved $"<<savings<<endl;
}
    return 0;
}

问题根源

核心问题是逻辑运算符优先级错误:&&的优先级高于||,导致条件表达式没有按照预期的逻辑分组。比如判断"新客户非学生"的条件:

customer=='Y' || customer=='y' && student=='N' || student=='n'

会被编译器解析为:

(customer=='Y') || ((customer=='y' && student=='N') || student=='n')

这完全不符合"是新客户(Y/y)且不是学生(N/n)"的逻辑,导致条件判断失效。

修正方案

1. 简化输入判断(统一大小写)

先把用户输入的字符转为小写(或大写),减少重复的大小写判断:

// 转小写
customer = tolower(customer);
student = tolower(student);

2. 修正逻辑表达式的括号分组

每个条件的逻辑关系用括号明确分组,比如:

  • 无折扣:(customer == 'n') && (student == 'n')
  • 学生折扣:(student == 'y') && (customer == 'n')
  • 新客户折扣:(customer == 'y') && (student == 'n')
  • 双重折扣:(customer == 'y') && (student == 'y')

3. 优化变量与计算逻辑

先确定折扣率,再一次性计算折后价和节省金额,避免重复的if-else块,减少冗余代码。

修正后的代码

#include <iostream>
#include <cctype> // 用于tolower函数

using namespace std;

int main()
{
    float numberTickets;
    char customer;
    char student;
    float totalPrice;
    float discountRate = 0.0f;
    float finalPrice;
    float savings;

    cout << "How many tickets are you purchasing? ";
    cin >> numberTickets;
    cout << "Are you a new customer (Y/N): ";
    cin >> customer;
    cout << "Are you a student (Y/N): ";
    cin >> student;

    // 统一转为小写,简化判断
    customer = tolower(customer);
    student = tolower(student);

    // 确定折扣率
    if (customer == 'n' && student == 'n') {
        discountRate = 0.0f;
        cout << "You will receive a discount of 0%" << endl;
    } else if (student == 'y' && customer == 'n') {
        discountRate = 0.10f;
        cout << "You will receive a discount of 10%" << endl;
    } else if (customer == 'y' && student == 'n') {
        discountRate = 0.15f;
        cout << "You will receive a discount of 15%" << endl;
    } else if (customer == 'y' && student == 'y') {
        discountRate = 0.25f;
        cout << "You will receive a discount of 25%" << endl;
    } else {
        // 处理无效输入
        cout << "Invalid input for customer/student status!" << endl;
        return 1;
    }

    // 计算总价、折后价、节省金额
    totalPrice = numberTickets * 10;
    finalPrice = totalPrice * (1 - discountRate);
    savings = totalPrice - finalPrice;

    // 输出结果
    cout << "Your price for " << numberTickets << " ticket(s) is $" << finalPrice << endl;
    cout << "You saved $" << savings << endl;

    return 0;
}

说明

  • 修正后的代码通过统一输入大小写和明确逻辑分组,解决了原程序的条件判断错误
  • 优化了计算逻辑,只需要一次判断确定折扣率,后续计算直接复用,减少冗余
  • 增加了无效输入的处理,提升程序健壮性

内容的提问来源于stack exchange,提问作者Yuki mB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:45:45