[問題] 請教一個練習題

作者: trainausidd (呆呆a蚊子)   2015-03-01 03:52:05
請教各位高手 我在做一練習題
題目如下:
產生一個陣列至多儲存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;
}
作者: PRAM (PRAM)   2015-03-01 04:01:00
你是不會去google一下getline()的參數意義嗎?
作者: trainausidd (呆呆a蚊子)   2015-03-01 04:51:00
他的含意我懂 只是不懂為什麼第二次跑迴圈 setw似乎沒起作用不知道是否與name[i]為string有關...
作者: LPH66 (-6.2598534e+18f)   2015-03-01 07:42:00
你的沒對齊是沒對齊標頭還是每行間都不齊?setw() 是會作用在 string 上的另外你的問題一, 關鍵在你 cin >> answer 了(啊, 總之是輸入名字的那個問題)因為 answer 是 char 所以只會吃恰好一個字元所以那一行剩下的東西 (包含換行) 會留給下一個讀取在這裡就正好被 getline 抓到變成空行輸入解決法可以一樣 getline 進一個 string 去再取 [0] 出來也就是變成判斷「這一行輸入的開頭是不是 y」
作者: trainausidd (呆呆a蚊子)   2015-03-01 19:48:00
感謝您專業的回答 可是我還是看不懂 你在說什麼 = =我所謂的對齊是要對齊student name的左邊Student nameAnnSteve 像這樣
作者: remizu (remizu)   2015-03-01 22:34:00
對齊左邊用std::left 對齊右邊用std::right
作者: LPH66 (-6.2598534e+18f)   2015-03-02 06:31:00
也就是先 << left 再輸出字串即可

Links booklink

Contact Us: admin [ a t ] ucptt.com