我是编程新手,今天我在这里,因为我需要一个简单的练习,我试图解决的帮助。练习包括各种小部件:For循环不更新结构对象
1)定义一个名为带有两个x和y坐标(double)的Point的结构体。
2)提示用户输入7(x,y)对。
3)当我们读取这些对时,我们必须将它们存储在称为original_points的点的向量中。
所以这是我第一次尝试:
struct Point {
double x;
double y;
};
istream& operator>>(istream& is, Point& p)
{
char ch1;
if (is >> ch1 && ch1 != '(')
{
is.unget();
is.clear(ios_base::failbit); // oops format error
return is;
}
double v1, v2;
char ch2, ch4;
is >> v1 >> ch2 >> v2 >> ch4;
if (!is || ch2 != ',' || ch4 != ')') error("Bad reading"); // messed up reading
p.x = v1;
p.y = v2;
return is;
}
void skip_to_character(char character)
{
if (cin.fail())
{
cin.clear();
for (char ch; cin >> ch;)
{
if (ch == character)
{
cin.unget();
return;
}
}
}
if (cin.eof()) error("No input\n");
}
int main()
{
try
{
cout << "Please enter seven (x,y) coordinates : \n";
vector<Point> original_points;
for (int i = 0; i < 7; ++i)
{
Point p;
cin >> p;
skip_to_character('('); // let's try to recover from a simple format error
original_points.push_back(p);
}
}
catch (runtime_error& e)
{
std::cerr << "Error : " << e.what() << '\n';
}
catch (...)
{
cerr << "Unexpected error \n";
}
}
如果出现一个简单的格式错误,我尝试,直到程序达到跳过每个字符以恢复“(”我的问题是,如果我尝试。输入一个错误的输入格式,例如:9,99),代码将push_back()错误发生后的第一个正确读数以及错误发生前的第一个正确读数。因此,举例来说,如果我尝试输入这样的数据:
(1,2)
9,99)
(5,6)
我将在我的向量三个要素: (1,2),(1,2)和(5,6)。好像当我在每次条件检查后进入循环时,P的值保持不变,而不是为每次迭代创建一个新的Point对象。你能帮我解决这个问题吗?为什么会发生此错误?谢谢
您的'istream&operator >>(istream&is,Point&p)'操作符根本不会改变'p'吗? –
@πάνταῥεῖ我不明白你是什么意思...? –
你想知道为什么'p'不会被'cin >> p;'改变,但是你实际上并没有在你的实现中改变它。这就是为什么。操作符实现应该将数字读入“p.x”和“p.y”,对吧? –