Bug点:
① 删除模块:若使用的是vector的内置函数 erase ( it ) 的话,为了一遍删除所有满足条件的元素,需 it--;
② 统计模块:计算平均数时,需要注意 总个数num 会不会为0
(这道题没在这里出考点,但平时的刷题还是要注意!!!)
③ 排序模块:单引号应为英文的引号,不能直接赋值题目中内容
④ 查询模块:题目没有说明 输出的时候是否要按照排序的先后次序输出,则默认按添加名单的顺序输出,因此这里不可直接鲁莽的使用 sort() 排序
(坑啊(⊙﹏⊙)。文字描述没大理解的朋友,可以看下面代码中下面注释掉的内容,如有类似的写法,则不是代码本身的问题)
⑤保留两位小数按照题目要求再加上 1e-5 ,之后的刷题中也注意使用上
AC代码:
//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
struct stu{
// int id;
string sid,name;
int cid;
int score[4];
int sum;
double ave;
};
//bool cmp(stu a,stu b){
// return a.sum>b.sum;
//}
vector<stu>v;
void Welcome_print(){
printf("Welcome to Student Performance Management System (SPMS).\n\n1 - Add\n2 - Remove\n3 - Query\n4 - Show ranking\n5 - Show Statistics\n0 - Exit\n\n");
}
void print_1(){
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
}
void print_23(){
printf("Please enter SID or name. Enter 0 to finish.\n");
}
int ran(int x){
int sum=1;
for(int i=0;i<v.size();i++){
if(v[i].sum>v[x].sum)sum++;
}
return sum;
}
void Add(){
while(1){
print_1();
stu st;
cin>>st.sid;
if(st.sid=="0")break;
cin>>st.cid >>st.name ;
int i=0;
int sum=0;
for(i=0;i<4;i++){
cin>>st.score[i];
sum+=st.score[i];
}
st.sum=sum;
st.ave=1.0*sum/4;
for(i=0;i<v.size();i++){
if(v[i].sid==st.sid){
cout<<"Duplicated SID.\n";
break;
}
}
if(i==v.size()){
v.push_back(st);
}
}
}
void Remove(){
while(1){
print_23();
string temp;cin>>temp;
if(temp=="0")break;
int sum=0;
for(vector<stu>::iterator it=v.begin();it!=v.end();it++){
if((*it).name==temp||(*it).sid==temp){
v.erase(it);
it--;
sum++;
}
}
printf("%d student(s) removed.\n",sum);
}
}
void Query(){
// if(v.size()>0){
// sort(v.begin(),v.end(),cmp);
// int id=1;
// int s=1,per=0;
//
// v[0].id=1;
// for(int i=1;i<v.size();i++){
// if(v[i].sum!=v[per].sum){
// id+=s;
// s=1;
// per=i;
// }else{
// s++;
// }
// v[i].id=id;
// }
// }
while(1){
print_23();
string temp;cin>>temp;
if(temp=="0")break;
for(int i=0;i<v.size();i++){
if(v[i].name==temp||v[i].sid==temp){
cout<<ran(i)<<" "<<v[i].sid<<" "<<v[i].cid<<" "<<v[i].name;
// cout<<v[i].id<<" "<<v[i].sid<<" "<<v[i].cid<<" "<<v[i].name;
for(int j=0;j<4;j++){
cout<<" "<<v[i].score[j];
}
printf(" %d %.2lf\n",v[i].sum,v[i].ave+(1e-5));
}
}
}
}
void Ranking(){
printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
}
void Show(){
cout<<"Please enter class ID, 0 for the whole statistics.\n";
int x;cin>>x;
int num=0;
for(int k=0;k<4;k++){
if(k==0)cout<<"Chinese\n";
else if(k==1)cout<<"Mathematics\n";
else if(k==2)cout<<"English\n";
else cout<<"Programming\n";
int sum=0;
int pass=0,fail=0;
num=0;
for(int i=0;i<v.size();i++){
if(v[i].cid==x){
sum+=v[i].score[k];
num++;
if(v[i].score[k]>=60)pass++;
else fail++;
}
if(x==0){
sum+=v[i].score[k];
num++;
if(v[i].score[k]>=60)pass++;
else fail++;
}
}
double total;
if(num==0)total=0;
else total=(1.0*sum/num)+(1e-5);
printf("Average Score: %.2lf\nNumber of passed students: %d\nNumber of failed students: %d\n\n",total,pass,fail);
}
int all[5]={0};
for(int i=0;i<v.size();i++){
if(v[i].cid==x){
int temp=0;
for(int j=0;j<4;j++){
if(v[i].score[j]>=60)temp++;
}
all[temp]++;
}
if(x==0){
int temp=0;
for(int j=0;j<4;j++){
if(v[i].score[j]>=60)temp++;
}
all[temp]++;
}
}
printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",all[4],all[3]+all[4],all[2]+all[3]+all[4],num-all[0],all[0]);
}
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
while(1){
Welcome_print();
int n;cin>>n;
if(n==0)break;
if(n==1)Add();
else if(n==2)Remove();
else if(n==3)Query();
else if(n==4)Ranking();
else if(n==5)Show();
}
}