2015-11-20 79 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或其他東西初始化它,然後檢查輸出: