我是编程新手,我正在尝试自己学习C ++,而且我正在遵循“使用C ++编程原理和实践”。
我试图做一个练习,经过各种其他步骤后,我要求
“...改变循环的主体,使其每次只读取一个双重。定义两个变量来跟踪哪个是最小的,哪个是你到目前为止看到的最大值。每次通过循环写出来了 输入的值。如果它是迄今为止最小的,那么在数字之后写入最小的。如果它是迄今为止最大的,那么在数字“。
之后写入最大的
到目前为止,我编写了以下代码:
target
我的问题是当我输入一个字符时,例如“c”,程序结束,虽然程序应该以假设的方式结束,只有当我输入“|”时,才得到:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
inline void keep_window_open() { cout<<"\nType a character to exit: "; char ch; cin>>ch; }
int main()
{
double val1 = 0, smallest = 0, largest = 0;
int flag = 0;
while (cin >>val1) {
if (val1=='|')
break;
else
cout <<val1 <<'\n';
if (flag==0) {
smallest = val1;
cout <<smallest <<" it's the smallest value so far.\n";
}
if (val1<smallest) {
smallest = val1;
cout <<smallest <<" it's the smallest value so far.\n"; }
else if (val1>largest) {
largest = val1;
cout <<largest <<" it's the largest value so far.\n"; }
++flag;
}
keep_window_open();
return 0;
}
和c
Type a character to exit:
Process returned 0 (0x0) execution time : ...
Press any key to continue.
不等待输入字符。我只是无法理解会发生什么,以及为什么。有人有线索吗?
答案 0 :(得分:0)
<强>问题强>
while (cin >>val1)
将输入读入double。如果您输入的内容无法像双重读取那样&#34; |&#34;那么这将失败并导致你的循环退出。
然后在cin
处于错误状态时尝试读取更多输入。
<强>解决方案强>
调用cin.clear()
首先清除所有错误标记,然后cin.ignore(1000, '\n')
以丢弃任何遗留在输入流中的内容。
inline void keep_window_open()
{
cout << "\nType a character to exit: ";
char ch;
cin.clear();
cin.ignore(1000, '\n');
cin >> ch;
}
注意强>
if (val1=='|')
break;
这段代码永远不会成为现实,因为如果你试图输入管道字符,你的while循环会在到达它之前落下。
答案 1 :(得分:0)
嗯,我认为问题在于你定义循环表达式的方式。 cin及其运算符“&gt;&gt;”返回可以使用的true / false值。它们返回一个iStream对象,这可能是一个可疑的转换为真或假通过幕后发生的自动化转换。但是,如果无法在变量中设置输入,则会返回null,就像尝试将“c”放入double中一样,而null则转换为false。
我建议你创建一个简单的while(true)循环,当你得到“|”时来自用户的字符(作为字符串),你打破了循环。直到那时循环继续。然后在循环内部解析你的值并根据你的逻辑(最小/最大)
进行处理