我正在努力使用矢量push_back函数。 我们的目标是拥有一个能够推动n个元素的函数,直到您决定停止为止。 所以我对'停止'的想法是cin.fail()。
故障功能
void pushbackVector(vector<double> &data)
{
double input;
cin >> input;
for (int i = 0; i < 100; i++)
{
if (cin.fail())
{
cout << "Ending input.\n";
return;
}
else
{
data.push_back(input);
}
}
问题是当我尝试使用它时,我进入一个无限循环。
我还没有按照ASC顺序对第一个向量进行排序,其次是DESC顺序,并将第一个和第二个连接到第三个向量。但是我相信我可以自己管理这个。 无论如何整个代码......
#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
using namespace std;
// function prototypes
void menu();
void printVector(const vector<double> &data);
void pushbackVector(vector<double> &data);
void sortVector (vector<double> &data);
int main()
{
menu();
vector<double> row1;
vector<double> row2;
/* not yet used
vector<double> row3;
*/
int input;
cin >> input;
bool exit = 0;
while (!exit)
{
switch (input)
{
case 1:
pushbackVector(row1);
break;
case 2:
pushbackVector(row2);
break;
case 3:
printVector(row1);
break;
case 4:
printVector(row2);
break;
case 5:
cout << "Printing out the contents of row 1\n";
printVector(row1);
cout << "Printing out the contents of row 2\n";
printVector(row2);
cout << "Printing out the contents of row 3\n";
// printVector(row3);
break;
case 6:
cout << "Exitting\n";
exit = 1;
break;
default:
cout << "Invalid choice\n";
}
}
return 0;
}
void menu()
{
cout << "Choose an option\n";
cout << "1) Enter first vector\n";
cout << "2) Enter second vector\n";
cout << "3) Print out the first vector\n";
cout << "4) Print out the second vector\n";
cout << "5) Print out all three vectoros\n";
cout << "6) Exitting the program\n";
}
void printVector(const vector<double> &data)
{
for(int i = 0; i < data.size(); i++)
{
cout << data[i] << ", ";
}
cout << "\n";
}
void pushbackVector(vector<double> &data)
{
double input;
cin >> input;
for (int i = 0; i < 100; i++)
{
if (cin.fail())
{
cout << "Ending input.\n";
return;
}
else
{
data.push_back(input);
}
}
}
void sortVector (vector<double> &data)
{
cout << "Sorting your vector \n";
sort(data.begin(), data.end());
}
答案 0 :(得分:2)
你只读一次,在循环内移动读数:
void pushbackVector(vector<double> &data)
{
double input;
// cin >> input; --------------
//
for (int i = 0; i < 100; i++) //
{ //
cin >> input; // <---------
if (cin.fail())
{
cout << "Ending input.\n";
return;
}
else
{
data.push_back(input);
}
}
这将确保您真正得到输入。现在,如果您不打算输入100个值,则需要以某种方式通知流。这是通过在其中插入“EOF字符”来完成的。在Windows上按CTRL + Z或在unix终端上按CTRL + D.
当从流中读取它时,它会进入fail
(和eof
)状态,除非您在适当时调用cin.clear()
清除错误标志,否则它将保持不变
你也犯了同样的错误。您只能在while
循环之前阅读一次,因此input
会保留您初始输入的值并继续输入相同的选项。我认为那是你所谈论的无限循环。要修复它,请在switch
之前移动read语句。
希望有所帮助。
另外,这就是我编写函数的方法:
double input;
for (int i = 0; (cin >> input) && i < 100; ++i) {
data.push_back(input);
}
cout << "Ending input.\n";
Streams可以在布尔表达式中使用 - 它们转换为!fail()
的结果 - 这是控制循环的一种方便且惯用的方法。
答案 1 :(得分:1)
无限循环是因为您正在阅读:
cin >> input;
一次,然后输入一个while
循环(在main
中)将永远继续(除非输入最初等于6
)。
变化:
cin >> input;
bool exit = 0;
while (!exit)
{
// ...
为:
bool exit = 0;
while (!exit)
{
cin >> input;
// ...
根据您的逻辑,pushbackVector
函数位于:
double input;
cin >> input;
for (int i = 0; i < 100; i++)
{
// ...
您可能希望将其更改为:
double input;
for (int i = 0; i < 100; i++)
{
cin >> input;
// ...
答案 2 :(得分:1)
做这样的事情:
void pushbackVector(vector<double> &data)
{
double input;
while (cin >> input) //will return true when there's valid input, otherwise false
{
if (input == -1)
{
cout << "Ending input.\n";
return;
}
else
{
data.push_back(input);
}
}
这将读取输入,直到您输入-1或输入无效输入。
我认为依靠cin.fail()
并不是一个好主意。链接中解释了use fail()
的正确方法。这不是你所期望的。
答案 3 :(得分:0)
如果你输入了一些你不应该输入的东西,那么放错了阅读,你需要清除输入。
如果
,首先添加te块cin.clear();
cin.ignore( numeric_limits<streamsize>::max(), '\n' );
答案 4 :(得分:0)
我会按照以下方式编写函数
void pushbackVector( std::vector<double> &data )
{
cin.clear();
cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
data.insert( data.end(), std::istream_iterator<double>( std::cin ), std::istream_iterator<double>() );
}
答案 5 :(得分:0)
我几天前就完成了,但我忘记发布我的回答了。 谁知道我可以说cin是否失败,停止输入但不结束程序,哈哈。
#include<iostream>
#include<vector>
#include<algorithm> // for sort algorithms
#include<iomanip> // for setprecision
using namespace std;
// function prototypes
void menu();
void printVector(const vector<double> &data);
void pushbackVector(vector<double> &data);
void sortVector (vector<double> &data);
int main()
{
vector<double> row1;
vector<double> row2;
vector<double> row3;
int input;
bool exit = false;
while(!exit)
{
menu();
cin >> input;
switch (input)
{
case 1:
cout << "Entering vector 1\n";
pushbackVector(row1);
sortVector(row1);
cout << "\n";
break;
case 2:
cout << "Entering vector 2\n";
pushbackVector(row2);
sortVector(row2);
reverse(row2.begin(), row2.end());
cout << "\n";
break;
case 3:
cout << "Printing out vector 1\n";
printVector(row1);
cout << "\n";
break;
case 4:
cout << "Printing out vector 2\n";
printVector(row2);
cout << "\n";
break;
case 5:
// reserve enough space for all of row1's and row2's elements
row3.reserve(row1.size() + row2.size());
// insert row1's elements at the end of row3
row3.insert(row3.end(), row1.begin(), row1.end());
// insert row2's elements at the end of row3
row3.insert(row3.end(), row2.begin(), row2.end());
cout << "Printing out the contents of vector 1\n";
printVector(row1);
cout << "Printing out the contents of vector 2\n";
printVector(row2);
cout << "Printing out the contents of vector 3\n";
printVector(row3);
cout << "\n";
break;
case 6:
cout << "Exitting\n";
exit = true;
break;
default:
cout << "Invalid choice\n";
}
}
return 0;
}
void menu()
{
cout << "Choose an option\n";
cout << "1) Enter first vector\n";
cout << "2) Enter second vector\n";
cout << "3) Print out the first vector\n";
cout << "4) Print out the second vector\n";
cout << "5) Print out all three vectoros\n";
cout << "6) Exitting the program\n";
}
void printVector(const vector<double> &data)
{
for(int i = 0; i < data.size(); i++)
{
cout << setprecision(4) << data[i] << " ";
}
cout << "\n";
}
void pushbackVector(vector<double> &data)
{
double input;
int numOfItems;
cout << "How many items you want to add into vector?: ";
cin >> numOfItems;
for (int i = 0; i < numOfItems; i++)
{
cin >> input;
if (cin.fail())
{
cout << "Ending input.\n";
return;
}
else
{
data.push_back(input);
}
}
}
void sortVector(vector<double> &data)
{
cout << "Sorting your vector \n";
sort(data.begin(), data.end());
}