我是編程新手,今天我在這裏,因爲我需要一個簡單的練習,我試圖解決的幫助。練習包括各種小部件: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」,對吧? –