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

C++实现ShowTickets类单条件判断致双票状态异常问题

C++剧院售票系统座位状态异常排查

问题现象

移除main函数中的if语句时,查询AA排101、102座的票务状态均显示为可售;但仅针对AA排101座添加if判断执行售票操作后,两个座位的票务均显示为已售。

题目需求

某剧院需开发演出座位售票状态跟踪系统,要求定义名为ShowTickets的类:

  • 类内需包含用于存储排号、座位号、对应售票状态的集合字段,仅需支持最多10张已售票的记录存储,未被录入过的票务默认售票状态为false(未售);
  • 需实现以下成员函数:
    • bool is_sold(string row, string seat):查询指定排、指定座位的票是否已售出;
    • void sell_seat(string row, string seat):将指定排、指定座位的票状态更新为已售;
    • string print_ticket(string row, string seat):以空格为分隔符,返回包含排号、座位号、售票状态的字符串。

问题根因

原代码存在3处核心逻辑错误:

  1. 存储结构设计不符合要求:类中只定义了单个Row、Seat、sold字段,没有使用集合结构存储多座位的独立状态,整个对象只能保存一个通用的售票标记,根本无法区分不同座位的状态,也满足不了最多存储10条已售记录的要求。
  2. 成员函数完全忽略传入参数:is_sold、sell_seat、print_ticket三个函数虽然接收了排号、座位号入参,但逻辑中完全没有使用这些参数做匹配:is_sold无论传入什么座位,都直接返回唯一的sold变量值;sell_seat无论传入什么座位,都直接把sold设为true。这就直接导致只要售出任意一个座位,所有座位查询都会返回已售状态。
  3. 构造函数存在冗余无效代码:构造函数中声明的局部row、seat变量未初始化就赋值给类成员,属于无意义的冗余逻辑。

修正后代码

#include <iostream>
#include <string>
using namespace std;

class ShowTickets{
private:
    // 用两个数组分别存储已售座位的排号、座位号,最多支持10条记录
    string sold_rows[10];
    string sold_seats[10];
    int sold_cnt; // 记录当前已售的票数量
public:
    ShowTickets(){
        sold_cnt = 0;
    }
    
    bool is_sold(string row, string seat){
        // 遍历已售列表匹配目标座位
        for(int i = 0; i < sold_cnt; i++){
            if(sold_rows[i] == row && sold_seats[i] == seat){
                return true;
            }
        }
        // 未匹配到则为未售状态
        return false;
    }

    void sell_seat(string row, string seat){
        // 座位已售或已达存储上限时直接返回
        if(is_sold(row, seat) || sold_cnt >= 10){
            return;
        }
        sold_rows[sold_cnt] = row;
        sold_seats[sold_cnt] = seat;
        sold_cnt++;
    }

    string print_ticket(string row, string seat){
        string res = row + " " + seat + " ";
        res += is_sold(row, seat) ? "sold" : "Available";
        return res;
    }
};

int main () {
  ShowTickets myticket;
  if(!myticket.is_sold("AA","101"))
    myticket.sell_seat ("AA","101");
  cout << myticket.print_ticket("AA","101") << endl;
  cout << myticket.print_ticket("AA","102") << endl;
  return 0;
}

运行结果

修正后代码运行输出如下,符合预期:

AA 101 sold
AA 102 Available

内容的提问来源于stack exchange,提问作者Dandan She

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:42:58