【问题标题】:Loop calling the function just once C++循环调用函数一次 C++
【发布时间】:2018-07-11 07:18:23
【问题描述】:

我的代码有问题,我插入了一个循环,所以函数listOfSeats 总是被调用并且程序永远不会停止运行。问题是它只运行一次,我不能保证我在数组席位中更改的值已更改。我不知道为什么会这样,请帮忙。 当我添加一个调试器来查看它为什么崩溃时,我得到了这个ScreenShot 1和ScreenShot2。请帮助我真的不明白这是什么意思。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
string listOfSeats();
const int arraySize = 20;

int main() {
    while(true) {
        cout << "These are the type of seats we offer during the flight and their current status:\n";
        cout << "(LW) Left Window\n(AL) Aisle left\n(AR) Aisle Right\n(RW) Right Window\n\n";
        listOfSeats();
    }
}

string listOfSeats() {
    string typeOfSeat;
    int numOfSeat;
    static string seat[ arraySize ];

    for ( int i = 0; i < 20; ++i )
        seat[ i ] = "Available";
    cout << setw( 5 )<< "Seat" << setw( 10 ) << "Status" <<endl;
    for ( int lw = 0; lw < 5; ++lw )
        cout << setw( 4 ) << "LW"<<lw+1 << setw( 12 ) << seat[ lw ] << endl;
    for ( int al = 5; al < 10; ++al )
        cout << setw( 4 ) << "AL"<<al-4 << setw( 12 ) << seat[ al] << endl;
    for ( int rl = 10; rl < 15; ++rl )
        cout << setw( 4 ) << "RL"<<rl-9 << setw( 12 ) << seat[ rl] << endl;
    for ( int rw = 15; rw < 20; ++rw )
        cout << setw( 4 ) << "AL"<<rw-14 << setw( 12 ) << seat[ rw] << endl;
    cout << "\nPlease enter the type of seat you want to reserve (just the characters on brackets):";
    for(;;) {
        cin >> typeOfSeat;
        if (typeOfSeat=="LW") {
            cout <<"You have chosen a Left window seat.";
            break;
        }
        else if(typeOfSeat=="AL") {
            cout <<"You have chosen an Aisle left seat.";
            break;
        }
        else if(typeOfSeat=="AR") {
            cout <<"You have chosen an Aisle right seat.";
            break;
        }
        else if(typeOfSeat=="RW") {
            cout <<"You have chosen a Right window seat.";
            break;
        }
        else {
            cout <<"Invalid option entered. \nPlease enter a valid option:";
            continue;
        }
    }
    cout << "\nFrom the list presented above. Enter the number of the type of seat you want to reserve\n(just the number following the characters):";
    for(;;) {
        cin >> numOfSeat;
        if (numOfSeat==1) {
            cout <<"You have reserved the number "<< numOfSeat<<" "<<typeOfSeat<<" seat.";
            break;
        }
        else if(numOfSeat==2) {
            cout <<"You have reserved the number "<< numOfSeat <<" "<<typeOfSeat<<" seat.";
            break;
        }
        else if(numOfSeat==3) {
            cout <<"You have reserved the number "<< numOfSeat <<" "<<typeOfSeat<<" seat.";
            break;
        }
        else if(numOfSeat==4) {
            cout <<"You have reserved the number "<< numOfSeat <<" "<<typeOfSeat<<" seat.";
            break;
        }
        else if(numOfSeat==5) {
            cout <<"You have reserved the number "<< numOfSeat <<" "<<typeOfSeat<<" seat.";
            break;
        }
        else {
            cout <<"Invalid option entered. \nPlease enter a valid option:";
            continue;
        }
    }
    if (typeOfSeat=="LW") {
        seat[ numOfSeat-1 ]="Reserved";
    }
}

【问题讨论】:

  • 这发生在哪些输入上?您是否尝试过附加调试器以查看您的程序是否崩溃?
  • 请使用“switch-case”以确保仅根据条件运行单个逻辑。太多的 if-else 会造成混乱。对于第二个 if/else,您可以简单地将 numOfSeat 包含在您的消息中,而不需要任何 if/else
  • 我刚刚做到了,它给我传递了一个我不太了解的信息。我用它所说的截图更新帖子,以便您提供帮助
  • 提示:在将代码发布到 SO 之前,您可以使用 AStyle 等免费工具来修复代码格式。
  • 你的listOfSeats应该返回string

标签: c++ function loops


【解决方案1】:

listOfSeats 每次调用时都会将席位初始化为可用。

编辑:另外,我第一次发这个的时候没有注意到,你需要将函数结果类型string替换为void,或者添加一个return语句。目前,当函数返回时,您有未定义的行为。提高编译器的警告级别,例如-Wall 用于 g++ 或 /W4 用于 Visual C++,很可能会对此产生诊断。

【讨论】:

  • 问了几个问题:“为什么值没有改变”,“为什么循环只运行一次”和“为什么程序崩溃”。这已经是矛盾的了。最接近的投票正是为了:不清楚的问题描述。我不同意基于这些理由立即关闭,但这个问题肯定有问题。
  • 要求完美的问题是不合理的。有了完美的理解,需要提出完美的问题,就不需要问了。我想说这个问题已经足够好:发布的实际代码、屏幕截图、尝试(虽然不完美)解释出了什么问题。
  • 没有人期待完美的问题。但是避免在您对程序行为的描述中出现矛盾肯定不是不合理的吗?
  • 我认为关于最小代码示例还有一些话要说。我知道这还不错,不值得关闭,但是 MCVE 页面明确指出 当你有少量代码,但问题的根源完全不清楚时,开始一次删除代码直到问题消失 - 然后将最后一部分添加回来。大多数打印和设置代码都可以被删除,以使这个问题更容易阅读。这绝对是 OP 所拥有的一切的转储。这不是关闭的理由,但如果有人愿意,很容易成为拒绝投票的理由。
  • @MaxLanghof:合理的反应是询问 OP,而不是投票结束问题。正如在 cmets 中对这个讨论的合理反应是表达自己的观点或见解,而不是对答案投反对票(就像现在有人所做的那样)。我已经多次放弃 Stack Overflow。我想现在已经接近最后的放弃了。试图帮助那些受站点设施支持且缺乏设施的破坏者群体的人是没有希望的。
【解决方案2】:

您使用返回类型字符串声明了函数“string listOfSeats()”,但您未在函数范围内返回。在代码的第 5 行和第 19 行更改函数以不返回任何内容(也称为 void)。

简而言之,改变这个:

string listOfSeats() //has return type string

到这里:

void ListOfSeats() //has return type void

在第 5 行和第 19 行。

【讨论】:

  • 是的,这有助于现在循环工作,谢谢。现在我只需要知道如何保存预留的座位,这样当循环再次调用它时它就会显示为预留。
【解决方案3】:

您需要刷新您的 cin。它进入了无限循环。

用这个替换你的 else 循环 -

    else {
        cout <<"Invalid option entered. \nPlease enter a valid option:";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
        continue;
    }

包含在标题下方 -

#include <limits>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2014-07-25
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多