C++ 该项目赢得了';t读取C+中的第二个向量+;
因此,我尝试编写一个函数,可以返回两个向量的标量积(即a0b0+a1b1+…),但每当我运行程序时,它只会读取第一组输入(即向量a),然后第二个向量(向量b)会自动“跳过”,程序会返回一个非常奇怪的数字,如2.122e-314。那么这段代码有什么问题?(为了简单起见,我只是假设向量a和b的大小相同。)ThxC++ 该项目赢得了';t读取C+中的第二个向量+;,c++,vector,C++,Vector,因此,我尝试编写一个函数,可以返回两个向量的标量积(即a0b0+a1b1+…),但每当我运行程序时,它只会读取第一组输入(即向量a),然后第二个向量(向量b)会自动“跳过”,程序会返回一个非常奇怪的数字,如2.122e-314。那么这段代码有什么问题?(为了简单起见,我只是假设向量a和b的大小相同。)Thx #包括 #包括 使用名称空间std; /** 计算两个向量的标量积。 @参数a,b两个向量 @返回两个向量的乘积之和:a0b0+a1b1+。。。 */ 双标量_积(向量&a,向量&b) {
#包括
#包括
使用名称空间std;
/**
计算两个向量的标量积。
@参数a,b两个向量
@返回两个向量的乘积之和:a0b0+a1b1+。。。
*/
双标量_积(向量&a,向量&b)
{
双乘积;
对于(int i=0;i>s;
if(cin.fail())
更多=错误;
其他的
a、 推回;
}
返回a;
}
int main()
{
载体a;
cout您需要在读取第一个向量后调用cin.clear()
来重置错误标志。正如Peter所提到的,您还需要忽略cin
中的非数字字符。您可以使用类似cin.ignore(10000,“\n”);
的方法来完成此操作,它将忽略所有字符,直到新的一行。
- 您需要清除错误状态并刷新输入缓冲区。这不会神奇地发生
scalar_product()
如果第二个向量小于第一个向量,则显示未定义的行为。
无论如何,数学标量积只为两个大小相等的向量定义
您可能需要删除,即在尝试读取更多数字之前读取cin中挂起的非数字输入。因此,我在“more=false”之后添加了“cin.clear()”,现在它要求我在第二个系列上输入;但是,当我输入数字“例如2”时,它告诉我“错误:2不是有效命令”。为什么?朱庇特姆:请看我对关于cin.ignore的回答的修订。GWW:Thx,该cin.ignore起作用了。现在,就我所做的努力而言,它起到了预期的作用。谢谢。我的一般建议是避免手动输入,并准备与程序的标准输入相连接的文件,使用“prog#include <iostream>
#include <vector>
using namespace std;
/**
Calculates the scalar product of two vectors.
@param a, b two vectors
@return the sum of product of two vectors: a0b0 + a1b1 + ...
*/
double scalar_product (vector<double>& a, vector<double>& b)
{
double product;
for (int i = 0; i < a.size(); i++)
product += a[i] * b[i];
return product;
}
/**
Reads in a new vector.
*/
vector<double> read (vector<double>& a)
{
bool more = true;
while (more)
{
double s;
cin >> s;
if (cin.fail())
more = false;
else
a.push_back(s);
}
return a;
}
int main()
{
vector<double> a;
cout << "Please enter the numbers of the first series, enter any non-number character to quit: ";
read (a);
vector<double> b;
cout << "Please enter the numbers of the second series, enter any non-number character to quit: ";
read (b);
cout << "The scalar product of the two series is " << scalar_product(a, b) << "\n";
return 0;
}