亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

調用函數實現輸入成績求平均,有幾行代碼看不懂,求指教

調用函數實現輸入成績求平均,有幾行代碼看不懂,求指教

C C++
xungeer29 2017-10-18 10:38:34
#include<iostream> using?namespace?std; const?int?max?=?10; int?grade_in(double?grade[],int?limit); void?show(const?double?grade[],int?n); double?grade_av(const?double?grade[],int?n); int?main() { ?double?scores[max]; ?int?size=grade_in(scores,max); ?show(scores,size); ?if?(size?>?0) ?{ ??cout?<<?"Average?Grade?=?" ???<<?grade_av(scores,?size)?<<?endl; ?} ?return?0; } int?grade_in(double?grade[],int?limit) { ?double?temp; ?int?i?=?0; ?cout?<<?"Enter?your?grade(enter?a?negetive?to?end)"?<<?endl; ?for?(i?=?0;?i?<?limit;?i++) ?{ ??cout?<<?"Enter?your?grade?#"?<<?i?+?1?<<?"?:?"?<<?endl; ??cin?>>?temp; ??if?(!cin)???????????????????// ??{??????????????????????????// ???cin.clear();??????????????//這幾句的作用是什么?刪掉對程序運行結果沒有影響 ???while?(cin.get()?!=?'\n')// ????continue;???????????????// ???cout?<<?"Bad?input;enter?a?number:?"; ???break; ??} ??if?(temp?<?0) ???break; ??grade[i]?=?temp; ?} ?return?i; } void?show(const?double?grade[],?int?n) { ?for?(int?i?=?0;?i?<?n;?i++) ?{ ??cout?<<?"Score?#"?<<?i?+?1?<<?"?:?"?<<?grade[i]?<<?endl; ?} } double?grade_av(const?double?grade[],?int?n) { ?double?sum=0; ?int?i?=?0; ?for?(i?=?0;?i?<?n;?i++) ?{ ??sum?+=?grade[i]; ?} ?double?av; ?av?=?sum?/?n; ?return?av; }
查看完整描述

1 回答

?
onemoo

TA貢獻883條經驗 獲得超454個贊

我覺得這幾行代碼有問題。

不過,我先說下關于 cin 的東西吧:

你輸入的內容都在輸入流中。cin >> 會讀取輸入流中的內容并存入后面的變量中,當然是按照變量的類型來格式化輸入流中的內容。那么如果類型不匹配呢???

比如你這里?cin?>>?temp 需要存入浮點類型的 tmp,可你輸入的不是數字,這會怎么樣?

這會發生錯誤,cin 會在內部記錄錯誤狀態。一旦出錯就無法再使用 cin 來讀取輸入了。錯誤狀態可以通過調用 cin.clear() 來清除。? 而且?cin 的狀態默認可以作條件判斷用。

if?(!cin) 這里就是判斷 cin 是否出錯。cin 錯誤時相當于 false,所以當 cin 出錯時會執行 if 中語句。

還有一點要說,當讀取輸入時出錯,那些不正確的輸入會原封不動地留在輸入流中。

還用 cin >> tmp 舉例。如果你輸入 123回車,那沒問題,123?被 cin 從輸入流中讀取走了(并存入123.0到tmp)。 可如果你輸入 ab回車,這就出錯了! 但是 'a' 'b' '\n' 卻會原封不動流在輸入流中


那么一般處理輸入出錯可以這樣:

先清除掉 cin 的錯誤狀態,保證可繼續使用 cin 讀取:調用 cin.clear() 即可。

再處理掉輸入流中留下的不正確的輸入:這個代碼里用循環調用 cin.get() 的方式來讀取走它們。 解釋一下,cin.get() 可以讀取走輸入流中的任意字符,并且返回讀到的值。所以循環用 get() 來讀...直到'\n' 就可以清掉輸入流中上次回車之前的內容。


那么這幾行代碼應該就是處理輸入出錯的情形的。如果你輸入沒出錯,就不會執行這個 if,所以你沒看到對結果有影響。

但是!之所以說“應該”是因為我覺得它邏輯上有問題!?

你可以對照我上面說的錯誤處理方式,看看這幾行代碼是不是無法實現這個目的?

查看完整回答
反對 回復 2017-10-20
  • 1 回答
  • 0 關注
  • 1390 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號