【问题标题】:How can I check if all requested values exist in 2D array?如何检查二维数组中是否存在所有请求的值?
【发布时间】:2016-12-16 04:04:48
【问题描述】:

我对 C++ 比较陌生,并且在编写管理剧院门票的程序时遇到了困难。我尝试自己测试代码的每个部分以找到问题,但找不到问题。我也尝试寻找答案,但找不到任何似乎可以解决此问题的方法。如果用户选择选项 2,TicketRequest 函数应该验证座位的可用性。如果任何请求的席位不存在或不可用,则应返回适当的消息以由客户端程序显示。

我对这个函数有一些问题:

  1. 有时它会显示座位信息(请求的座位数量、每个座位的价格、总费用),并且它总是询问用户是否要购买门票,即使座位不存在也是如此。
  2. 当我从座位开始请求第 15 排的 30 个座位(最大值)时
  3. 当一些请求的席位存在并且可用但其他席位不可用时,它的行为就像所有席位都可用,但如果并非所有席位都可用,则应显示为不可用。目前,它打印的票的座位号超出了数组中现有的数量。

以下是 TicketRequest 函数的代码行:

string TicketManager::TicketRequest(int seatsRequested, int rowRequested, int seatNumber)
{
    bool displayInfo = false;
    ostringstream os;

    os << fixed << showpoint << setprecision(2);

    if (seatsRequested < 1 || seatsRequested > 30 || rowRequested < 1 || rowRequested > 15
    || seatNumber < 1 || seatNumber > 30)
    {
        os << "\nInvalid entry. The seats requested do not exist.\n";
    }
    for (int count = 0; count < seatsRequested; count++)
    {
        seatNumber++;
        if (SeatStructures[rowRequested - 1][seatNumber - 1] == '#')
        {
            cost = seatsRequested * price[rowRequested - 1];
            displayInfo = true;
        }
        else
        {
            return string ("\nSorry, your requested seat(s) is unavailable.\n\n");
        }
    }
    if (displayInfo == true)
    {
        os << "\nRequested seats:  ";
        os << seatsRequested;
        os << "\nPrice per seat: $";
        os << price[rowRequested - 1];
        os << "\nTotal cost: $";
        os << cost;
    }
    return os.str();
}

我将整个程序粘贴到了 pastebin 中,所以这篇文章不会太长。这是链接:http://pastebin.com/ZyZskG4S

【问题讨论】:

    标签: c++ arrays visual-studio loops


    【解决方案1】:

    假设如下:

    struct SeatStructures[TotalRows][TotalSeatsInARows]; 
    with TotalRows = 15 and TotalSeatsInARows = 30
    

    现在如果函数被调用 TicketRequest(int seatsRequested, int rowRequested, int seatNumber) 那么下面是参数的有效值:

    • 1 &lt;= rowRequested &lt;= 15

    • 1 &lt;= seatsRequested &lt;= 30

    • 1 &lt;= seatNumber &lt;= 30

    • seats will be allocated from seatNumber onwards (i.e inclusive of seatNumber)

    现在,除了检查参数的有效值之外,还可以进行另一项检查:

    • 1 &lt;= (seatNumber + seatsRequested - 1) &lt;= 30

    现在,可以检查函数TicketRequest返回的值是否包含字符串“ERROR”,因为您不能将返回值修改为bool

    函数如下:

    string TicketManager::TicketRequest(int seatsRequested, int rowRequested, int seatNumber)
    {
        if((1 < seatsRequested) || (seatsRequested > 30))
        {
            return string("ERROR: Invalid number of seats requested.\n");       
        }
    
        if((1 < rowRequested) || (rowRequested > 15))
        {
            return string("ERROR: Invalid row number requested.\n");        
        }
    
        if((1 < seatNumber) || (seatNumber > 30))
        {
            return string("ERROR: Invalid seat number requested.\n");       
        }
    
        //seat number should be between [1 and 30] (both inclusive)
        //(seatNumber + seatsRequested - 1) should be equal to last valid seat number
        if((1 < (seatNumber + seatsRequested - 1)) || ((seatNumber + seatsRequested - 1) > 30)) &&
        {
            return string("ERROR: Invalid seat number or number of seats requested.\n");        
        }
    
        //if you come till here then all the parameters are valid, so just check the availability of seats.
        int cost = 0;
        for (int sn = seatNumber; sn <= (seatNumber + seatsRequested - 1); sn++)
        {
            if (SeatStructures[rowRequested - 1][sn - 1] == '#')
            {
                //seat is available
                cost += price[rowRequested - 1];            
            }
            else
            {
                return string("ERROR: Sorry, your requested seat(s) is/are unavailable.\n\n");
            }
        }
    
        //if you come till here then all the seats are available.   
        ostringstream os;
        os << fixed << showpoint << setprecision(2);
        os << "\nRequested seats:  ";
        os << seatsRequested;
        os << "\nPrice per seat: $";
        os << price[rowRequested - 1];
        os << "\nTotal cost: $";
        os << cost;
        return os.str();
    }
    

    现在调用函数并检查返回值:

    TicketManager obj;
    string szResult = obj.TicketRequest(45, 3, 2);
    if(szResult.find("ERROR") != string::npos)
    {
        //error
        cout << "szResult << endl;
    }
    else
    {
        //success
    }
    

    【讨论】:

    • 您的回答非常明确且很有帮助。我用你写的函数替换了我的函数,它运行正常。
    【解决方案2】:
    cout << TicketManager1.TicketRequest(seatsRequested, rowRequested, seatNumber);
    

    如果票可用,此行可以返回true 值,如果可用,则可以

    bool isTicketAvailable = false;
    TicketManager1.TicketRequest(seatsRequested, rowRequested,seatNumber, isTicketAvailable);
    
    if (isTicketAvailable)
    {
        cout << "\n\nDo you wish to purchase these seats? (Y/N)";
                cin >> confirmation;
       //do whatever you need here
    }
    

    函数参数应该是这样的

    string TicketManager::TicketRequest(int seatsRequested, int rowRequested, int seatNumber, bool& isTicketAvailable)
    

    【讨论】:

    • 也许 isTicketAvailable 应该是 bool ,看看 var 怎么不是 C++ 关键字?或者std::string,除非你建议他修改函数以返回bool
    • 我无法修改函数以返回不同的数据类型。它是要求函数返回字符串的赋值的一部分。
    • @user131648 更新了我的答案
    • @DenisErmolin 我使用了您建议的 bool 变量,但没有将其添加为 TicketRequest 函数的参数,而是在票证可用时在函数中将 isTicketAvailable 设置为 true 并在调用后使用该 if 语句功能。它现在可以正常工作。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多