[問題] 請教一個練習題

看板C_and_CPP作者 (呆呆a蚊子)時間10年前 (2015/03/01 03:52), 編輯推噓3(3017)
留言20則, 4人參與, 最新討論串1/2 (看更多)
請教各位高手 我在做一練習題 題目如下: 產生一個陣列至多儲存10個學生的名字 以及另一個陣列儲存每個學生的成績(0~100) 用迴圈提示使用者輸入名字和成績 計算平均成績(利用迴圈計數) 顯示此平均成績並以表格顯示所有學生的名字和成績 我已初步達成題目要求 Question 1:可是為什麼顯示的時候 數字 名字 都無法對齊 是我setw使用錯誤嗎 還是另有原因 Question 2:輸入名字的時候 一定要以#結束嗎 一開始我的程式碼沒使用getline(cin,name[i],'#'); 而是使用getline(cin,name[i]); 可是就是會有問題 不知道原因 可請懂的人稍微解釋一下嗎 謝謝~ 煩請高手解答~謝謝 以下為程式碼: #include<iostream> #include<iomanip> #include<cctype> using namespace std; int main() { const int student_number=10; string name[student_number]={}; int grade[student_number]={0}; int count=0; double average_grade=0.0; char answer='y'; for(int i =0;( i<student_number && tolower(answer)=='y');i++) { cout<<"Please enter the student's name:"<<endl; getline(cin,name[i],'#'); cout<<"Please enter the grade of student "<<name[i]<<"."<<endl; cin>>grade[i]; count++; cout<<"Do you still want to input any data ? "<<endl; cin >> answer ; } int sum=0; for(int i=0; i<count ; i++) { sum += grade[i]; } average_grade = static_cast<float>(sum) / static_cast<float>(count); cout<<"student name grade"<<endl; for(int i =0;i< count;i++) { cout<<setw(12)<<name[i]<<setw(15)<<grade[i]; } cout<<"\n average "<<average_grade<<endl; return 0; } -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.204.42.2 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1425153128.A.91F.html

03/01 04:01, , 1F
你是不會去google一下getline()的參數意義嗎?
03/01 04:01, 1F

03/01 04:51, , 2F
他的含意我懂 只是不懂為什麼第二次跑迴圈 setw似乎
03/01 04:51, 2F

03/01 04:51, , 3F
沒起作用
03/01 04:51, 3F

03/01 04:52, , 4F
不知道是否與name[i]為string有關...
03/01 04:52, 4F

03/01 07:42, , 5F
你的沒對齊是沒對齊標頭還是每行間都不齊?
03/01 07:42, 5F

03/01 07:43, , 6F
setw() 是會作用在 string 上的
03/01 07:43, 6F

03/01 07:44, , 7F
另外你的問題一, 關鍵在你 cin >> answer 了
03/01 07:44, 7F

03/01 07:44, , 8F
(啊, 總之是輸入名字的那個問題)
03/01 07:44, 8F

03/01 07:45, , 9F
因為 answer 是 char 所以只會吃恰好一個字元
03/01 07:45, 9F

03/01 07:45, , 10F
所以那一行剩下的東西 (包含換行) 會留給下一個讀取
03/01 07:45, 10F

03/01 07:46, , 11F
在這裡就正好被 getline 抓到變成空行輸入
03/01 07:46, 11F

03/01 07:46, , 12F
解決法可以一樣 getline 進一個 string 去再取 [0] 出來
03/01 07:46, 12F

03/01 07:47, , 13F
也就是變成判斷「這一行輸入的開頭是不是 y」
03/01 07:47, 13F

03/01 19:48, , 14F
感謝您專業的回答 可是我還是看不懂 你在說什麼 = =
03/01 19:48, 14F

03/01 19:48, , 15F
我所謂的對齊是要對齊student name的左邊
03/01 19:48, 15F

03/01 19:49, , 16F
Student name
03/01 19:49, 16F

03/01 19:49, , 17F
Ann
03/01 19:49, 17F

03/01 19:50, , 18F
Steve 像這樣
03/01 19:50, 18F

03/01 22:34, , 19F
對齊左邊用std::left 對齊右邊用std::right
03/01 22:34, 19F

03/02 06:31, , 20F
也就是先 << left 再輸出字串即可
03/02 06:31, 20F
文章代碼(AID): #1KyXneaV (C_and_CPP)
文章代碼(AID): #1KyXneaV (C_and_CPP)