看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《KKBB0710 (皮皮)》之銘言: : 有請高手幫我指正以下的程式碼。 : 我想要寫一個程式可以輸入成績等級A B C。最後統計各個等級的總人數。 : cout << "請輸入成績等級: " << endl << "若想停止請輸入EOF" << endl; : while ( (grade = cin.get()) != EOF ){ : switch ( grade ){ : case 'A': : case 'a': : acounter = acounter + 1; : break; : case 'B': : case 'b': : bcounter = bcounter + 1; : break; : case 'C': : case 'c': : ccounter = ccounter + 1; : break; : case '\n': : case '\t': : case ' ': : break; : default: : cout << "Incorrect letter grade entered." : << "Enter a new grade." << endl; : break; : } : } : cout << "\n\n每項成績的人數為: " : << "\nA: " << acounter : << "\nB: " << bcounter : << "\nC: " << ccounter; : return 0; : } : 如果使用EOF進行終止,編譯器會說EOF沒有宣告,如果使用-1又會變成無線迴圈。 : 觀念不清,請大家指正了 > < C++不是這樣寫滴! 先來看看 cin.get() 會回傳什麼: int_type get(); Returns :c if available, otherwise traits::eof(). 這邊的 int_type、traits 都是 cin 所屬類別裡的 typedefs, 首 先要知道 cin是如何被定義的: typedef basic_istream<char> istream; extern istream cin; 以下是 basic_istream 的模板宣告 template <class charT, class traits = char_traits<charT> > basic_istream; 所以當沒有字元可讀時, cin.get() 會回傳 char_traits<char>::eof() , 這個值雖然規格書上寫是回傳EOF, 但可能因為char的有號與否 造成比較失敗, 正確的寫法: while ( (grade = cin.get()) != char_traits<char>::eof() ) ... 一般的作法都是先讀進字元, 再判斷 cin的狀態正不正常: while ( grade = cin.get(), !cin.eof() ) ... 為了方便, 你也可以呼叫另一個版本的 get: basic_istream<charT, traits>& get(char_type& c ); (這裡的char_type跟int_type是一樣的, 都是char) 它會回傳 cin本身, 當 istream 物件作為迴圈測試條件時, 回傳 true表示讀取工作一切安好(沒有任何錯誤發生, 包含讀到檔案結 尾), 算是比較強的保證: while ( cin.get( grade ) ) ... --   ┌─────────────┐ ▂▂ ▄▂       為何這樣迷人 ˇ ˇˇ ˇ   說什麼結束對妳的 ▃▃      http://ppt.cc/zQtB  ψ髮箍 └─────────────┘ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (03/31 12:28)
azukimiho:好詳細 03/31 17:12
ru035pu4xx:有讚可以按嗎? 04/01 08:06