在学习小甲鱼的c++快速入门时,碰到关于数据类型数组的,用c++的方法输入10个元素存入整型数组中求总和以及平均值
#include<iostream>
using namespace std;
#define ITEM 10
int main()
{
int num[ITEM];
cout<<"请输入n个整数\n\n";
for(int i=0;i<ITEM;i++){
cout<<"请输入第"<<i+1<<"个数据:";
while(!(cin>>num[i])){//输入错误返回0
cout<<"请输入正确的值:";
cin.clear();
cin.ignore(100,'\n');
}
}
int total=0;
for(int i=0;i<ITEM;i++){
total+=num[i];
}
cout<<"整数和为:"<<total<<endl;
cout<<"平均值为:"<<total*1.0/10<<endl;
return 0;
}
在这里如果我输入错误类型字符型,得到的结果如下:
这是正确的,但是当我输入浮点型比如2.22时,却把2.22的整数部分输入进去,出现的错误现象如下:
请问我应该怎么样才可以把整个浮点数去掉达到图1一样正确的效果呢
请输入第1个数据:2.22
请输入第2个数据:请输入正确的值:2.22
请输入第3个数据:请输入正确的值:2.22
请输入第4个数据:请输入正确的值:2.22
请输入第5个数据:请输入正确的值:2.22
请输入第6个数据:请输入正确的值:2.22
请输入第7个数据:请输入正确的值:2.22
请输入第8个数据:请输入正确的值:2.22
请输入第9个数据:请输入正确的值:2.22
请输入第10个数据:请输入正确的值:2.22
整数和为:20
平均值为:2
你好,你的代码我测试了,我猜测应该是,当输入第一个2.22,他会读入小数点左面的2,然后小数点以及右面两个2还留在缓存区,按下回车表示不再输入,进入第二次循环,然后他接着上一次没读完的继续读,读到了小数点,于是提示类型错误,并且把小数点以及后面的两个2,一个回车全部清空,重新读取你第二个输入的数据,如果还输入2.22,以此类推,到了最后,缓存区里还剩小数点,22,回车。
。。。这是个坑,你如果想保证程序的健壮性,最好用字符串处理,单纯用输入流很难考虑到全部情况。
对于你这样的需求,你应该先读入一行字符串,然后进行格式检查,再转换为整型。
下面是对你的程序修改。当输入的字符串含有非数字字符,或输入数值过大都会要求重新输入。
#include <iostream>
#include <regex>
#include <sstream>
using namespace std;
bool read_int_value(int &value)
{
static regex r("[0-9]+");
static smatch m;
string str;
while (1)
{
if (!getline(cin, str))
break;
if (regex_match(str, m, r))
{
istringstream is(str);
if (is >> value)
return true;
}
cout << "请输入正确的值:";
}
return false;
}
int main()
{
const int n = 10;
vector<int> nums(n);
cout << "请输入" << n << "个整数\n";
for (int i = 0; i < n; i++)
{
cout << "请输入第" << i + 1 << "个数据:";
if (!read_int_value(nums[i]))
{
cerr << "遇到输入流结尾\n";
return 1;
}
}
int total = 0;
for (int i = 0; i < n; i++)
total += nums[i];
cout << "整数和为:" << total << endl;
cout << "平均值为:" << static_cast<double>(total) / n << endl;
return 0;
}
用double输入就好了,如果你想要整型,强转类型就可以了的