c++ - 如何正确使用标志控制循环,以便仅执行一次特定任务?
问题描述
我正在制作一个程序,要求用户输入两个有理数,根据用户选择加法还是减法,我的程序将执行任务,然后必须选择继续加法或减法或退出。
到目前为止,我已经完成了大部分编码,但是在编写标志控制循环时遇到了问题。对于我的程序,会出现一个显示菜单,询问用户是要减、加还是退出。
如果用户选择添加,屏幕将清空,顶部会出现一个标题,上面写着“有理数的添加”。这个标题应该只出现一次,之后我的程序会要求用户输入一个有理数。
由于程序应该添加两个有理数,在用户输入第一个有理数后,我的程序会要求用户输入另一个有理数。
所以总的来说,我的程序会问这个问题两次。
问题:我遇到的问题是,一旦出现“有理数加法”标题,并且我的程序第二次询问用户数字,标题就会再次出现。我尝试使用标志控制循环,但无论我尝试什么,它都会跳过标题或在每次提出问题时重复它。以下是我所指的代码:
void GetRational(char state, int& num, int& den)
{
char c;
bool once;
once = true;
while (once)
{
if (state == 'A' || state == 'a')
{
cout << "Addition of rational numbers" << endl;
once = false;
}
else if (state == 'S' || state == 's')
{
cout << "Subtraction of rational numbers" << endl;
once = true;
}
else break;
}
while (1)
{
cout << "\nPlease enter a fraction (n/d): ";
cin >> num >> c >> den;
if (den == 0)
cout << "\nDenominator must not be 0";
else break;
}
}
解决方案
要GetRational
记住once
下次调用它的值,请将变量声明为
static bool once = true;
该static
变量只会被初始化一次,这将在第一次调用之前GetRational
。
然后,在你检查它之后,在你从返回之前GetRational
,设置
once = false;
这将在调用之间持续存在GetRational
。
推荐阅读
- angular - Angular Material:将 sidenav 添加到几页?
- java - 将数据库中的字符串与 Android Studio 中的字符串进行比较
- android - SurfaceView 中的“资源”在哪里定义,如何从不同的类访问它?
- rascal - 从树中移除(删除)节点
- snowflake-cloud-data-platform - JSON to Relational Table 是否可以将条件插入到我的 2 列表的现有列中
- python - AttributeError:'NoneType' 对象在 owlready 库中没有属性 'some'
- azure-cosmosdb - 将 HTML 下拉列表连接到 Cosmos DB
- domain-driven-design - 在 CQRS 中的域事件处理程序中创建命令
- javascript - Chrome 扩展:内容策略抱怨内联事件处理程序,我找不到它
- node.js - 如何从节点 js 向浏览器发送分块的 gzip 响应