2015-11-20 77 views
0

我是编程新手,今天我在这里,因为我需要一个简单的练习,我试图解决的帮助。练习包括各种小部件: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对象。你能帮我解决这个问题吗?为什么会发生此错误?谢谢

+0

您的'istream&operator >>(istream&is,Point&p)'操作符根本不会改变'p'吗? –

+0

@πάνταῥεῖ我不明白你是什么意思...? –

+0

你想知道为什么'p'不会被'cin >> p;'改变,但是你实际上并没有在你的实现中改变它。这就是为什么。操作符实现应该将数字读入“p.x”和“p.y”,对吧? –

回答

2

这里有很多事情都不好。

首先,你不要初始化Point,所以它有一些随机数据。 随机数据并非如此随机,因为在循环中内存分配总是相同的,所以变量将具有最后一个循环的数据。

在操作>>(......),在这里你有一个“回报”,如果第一个字符不是“(” 所以你跳出有没有设置PX和PY

功能skip_to_character(...)是另一件不好的事情,除了难以阅读和使用for循环的一个非常糟糕的方式之外,输入“9”时不会有'C' 99)“所以我想在这里你得到”无输入“输出。

现在for循环在你主: 这里是发生了什么:

  1. 你没有初始化它
  2. 你读出的垃圾流的创建点P和P不会集
  3. 你跳过垃圾
  4. 你把你的初始化点p到载体

如果您不要相信我没有数据。尝试用0或其他东西初始化它,然后检查输出: