我有兴趣找到解决以下问题的方法:
我必须从CIN读取int数字,直到用户按下ESC并计算正数和偶数的平均值。
我的问题是我不太确定如何正确地写停止条件。
这是我到目前为止所尝试的(不正常工作)
#include<iostream>
#include<math.h>
using namespace std;
void main()
{
int c, sum=0, i=0;
cout<<"Insert characters: ";
while(cin>>c)
{
i++;
if((int)c>=0&&(int)c%2==0){
sum+=(int)c;
}
}
cout<<"Average: "<<(float)sum/i<<endl;
system("pause");
}
答案 0 :(得分:3)
你可以试试这个
while((ch = cin.get()) != 27)
{
i++;
if((int)ch>=0&&(int)ch%2==0
{
sum+=(int)ch;
}
}
这应该循环,直到按下esc
键
答案 1 :(得分:2)
转义字符既不是数字也不是空格。因此,如果程序传递了流中的字符,您只需读取整数,当输入espace字符时,流将自动失败(只关注问题的输入方面):
#include<iostream>
int main()
{
int c = 0;
while (std::cin >> c) {
std::cout << "c=" << c << '\n';
}
}
然而,操作系统是否将转义字符转发到流是一个不同的问题。例如,在UNIX上,转发转义字符将被转发,但仅在输入程序时才会转发,默认情况下是输入行。如果程序不应该等待返回键,则需要告知操作系统不要等待返回键。
这个问题似乎适用于Windows,但我不太了解Windows以确定如何更改终端设置(请参阅下文,了解可能仍然有效的内容)。在UNIX上,您可以使用ICANON
和tcgetattr()
清除终端设置中的tcsetattr()
标记。例如,您可以使用:
#include <iostream>
#include <termios.h>
int main()
{
termios values;
tcgetattr(0, &values);
values.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &values);
int c = 0;
while (std::cin >> c) {
std::cout << "c=" << c << '\n';
}
}
我认为Windows上有getch()
可以让你无需等待一个角色。希望这也包括逃脱角色。如果是这种情况,您可以在getch()
周围创建一个简单的流缓冲区,然后使用它:
#include <iostream>
#include <streambuf>
#include <whatever-declares-getch>
struct getchbuf
: std::streambuf {
static int const end = <getch()-error-value-goes-here>;
char buffer;
int underflow() {
int result(traits_type::eof());
if (this->gptr() == this->egptr() && (result = getch()) != end) {
buffer = traits_type::to_char_type(result);
this->setg(&buffer, &buffer, &buffer + 1);
}
return result;
}
};
int main()
{
getchbuf sbuf;
std::istream in(&sbuf);
int c = 0;
while (in >> c) {
std::cout << "c=" << c << '\n';
}
}
你需要修补上面的代码以包含声明getch()
(我认为它是<conio.h>
但我不知道)的任何内容并指定getch()
的错误指示符。