[问题] 请教一个练习题

楼主: 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