作者jack41402 (抹茶好喝)
看板C_and_CPP
標題[問題] 程式出現了預期之外的輸出
時間Thu Mar 12 20:40:40 2020
問題(Question):
用cin.eof()時遇到錯誤,輸入時遇到EOF應該終止程式而不繼續運行,但程式卻多輸出一次,想知道為什麼會有錯誤?
餵入的資料(Input):
0 0 5 10 0 8
0 0 5 10 10 5
預期的正確結果(Expected Output):
Quick in
Nearly
錯誤結果(Wrong Output):
Quick in
Nearly
Nearly
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
double x1 , x2 , y1 , y2 , r1 , r2 , temp ;
while (!cin.eof())
{
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2 ;
temp = sqrt (pow (x1 - x2 , 2) + pow (y1 - y2 , 2));
if ((r1 + r2)>=temp)
{
cout << "Quick in" << endl ;
}
else if ((r1 + r2) < temp)
{
cout << "Nearly" << endl ;
}
}
}
http://codepad.org/tnRLqQJK
補充說明(Supplement):
這個程式是在寫下面這題
https://toj.tfcis.org/oj/pro/19/
-----
Sent from JPTT on my Samsung SM-G955F.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.11.34.83 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1584016842.A.55D.html
1F:→ Schottky: 你確定最後多出來那一輪的 cin 有收到資料嗎? 03/12 21:03
看起來是沒有?
2F:→ Lipraxde: 我記得這個 eof() 是在讀到 EOF 後才會返回 true,是用 03/12 21:04
所以我加了一個!讓它能夠遇到EOF才break
3F:→ Lipraxde: 來判斷上次讀取的狀態用的 03/12 21:04
上次讀取是指什麼呢?
index嗎?
※ 編輯: jack41402 (101.11.34.83 臺灣), 03/12/2020 21:05:05
4F:→ Lipraxde: 把那個長長的 com >> ... 當成 while 的 condition 應 03/12 21:06
5F:→ Lipraxde: 該就夠了 03/12 21:06
※ 編輯: jack41402 (101.11.34.83 臺灣), 03/12/2020 21:17:27
※ 編輯: jack41402 (101.11.34.83 臺灣), 03/12/2020 21:18:49
6F:→ Lipraxde: 進迴圈後就是 >> r2 的那次 03/12 21:20
8F:→ Lipraxde: 看文件好了 "Return Value",我中文沒有表達的很清楚QQ 03/12 21:30
了解了,謝謝你
可是我以前有用過cin.fail()判斷eof,但為什麼只有這次有這個問題
※ 編輯: jack41402 (101.11.34.83 臺灣), 03/12/2020 22:55:44
9F:推 LPH66: 重點在於 cin.fail() 等判斷方式都是「上一次是否錯誤」 03/13 00:24
10F:→ LPH66: 並沒有「等一下還有沒有東西」這回事 03/13 00:25
11F:→ LPH66: --要知道等一下有沒有東西就真的要等一下看了之後才知道 03/13 00:25
12F:→ LPH66: 這一點就連大家說的 while(cin >> ...) 這個判斷也不例外 03/13 00:26
13F:→ LPH66: 只不過這是在讀完後馬上判斷它有沒有失敗而已 03/13 00:26
了解了,謝謝你
※ 編輯: jack41402 (49.219.145.234 臺灣), 03/13/2020 17:52:37