http://acm.hust.edu.cn/vjudge/contest/123676#problem/F 密码 5201
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const double EPS = 1e-5;
int len=0;
struct student
{
char SID[15];
char CID[30];
char name[15];
int a[4];
int sum;
double ave;
long long int t;
}stu[60000];
bool cmpt(student a,student b)
{
return a.t<b.t;
}
long long int ALL=0;
void printfquery(int i)
{
int j,t=0;
for(j=0;j<len;j++)
{
if(stu[j].sum>stu[i].sum) t++;
}
printf("%d ",t+1);
printf("%s ",stu[i].SID);
printf("%s ",stu[i].CID);
printf("%s ",stu[i].name);
printf("%d ",stu[i].a[0]);
printf("%d ",stu[i].a[1]);
printf("%d ",stu[i].a[2]);
printf("%d ",stu[i].a[3]);
printf("%d ",stu[i].sum);
printf("%.2lf\n",stu[i].ave);
}
//bool cmpsid(student a,student b)
//{
// return strcmp(a.SID,b.SID)<0;
//}
bool cmpsum(student a,student b)
{
return a.sum>b.sum;
}
void printfCaiDan()
{
printf("Welcome to Student Performance Management System (SPMS).\n\n");
printf("1 - Add\n");
printf("2 - Remove\n");
printf("3 - Query\n");
printf("4 - Show ranking\n");
printf("5 - Show Statistics\n");
printf("0 - Exit\n\n");
}
void add()
{
while(1)
{
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
char s[150];
scanf("%s",s);
if(strcmp(s,"0")==0) break;
int i;
for(i=0;i<len;i++)
{
if(strcmp(s,stu[i].SID)==0)
{
printf("Duplicated SID.\n");
break;
}
}
if(i>=len)
{
strcpy(stu[len].SID,s);
scanf("%s%s",stu[len].CID,stu[len].name);
for(int j=0;j<4;j++) scanf("%d",&stu[len].a[j]);
stu[len].sum=0;
for(int j=0;j<4;j++) stu[len].sum+=stu[len].a[j];
stu[len].ave=1.0*stu[len].sum/4;
stu[len].t=ALL;
ALL++;
len++;
}
else
{
int temp;char semp[20];
scanf("%s%s",semp,semp);
for(int j=0;j<4;j++) scanf("%d",&temp);
}
}
}
void remove()
{
while(1)
{
printf("Please enter SID or name. Enter 0 to finish.\n");
char s[150]={};
scanf("%s",s);
if(strcmp(s,"0")==0) break;
int cut=0,i;
for(i=0;i<len;i++)
{
if(strcmp(s,stu[i].SID)==0||strcmp(s,stu[i].name)==0)
{
memset(&stu[i],0,sizeof(stu[i]));
cut++;
}
}
sort(stu,stu+len,cmpsum);
printf("%d student(s) removed.\n",cut);
len-=cut;
}
}
void query()
{
while(1)
{
printf("Please enter SID or name. Enter 0 to finish.\n");
char s[150];
scanf("%s",s);
if(strcmp(s,"0")==0) break;
if(s[0]>='A'&&s[0]<='Z') sort(stu,stu+len,cmpt);
else sort(stu,stu+len,cmpsum);
int i;
for(i=0;i<len;i++)
{
if(strcmp(s,stu[i].name)==0||strcmp(s,stu[i].SID)==0) printfquery(i);
}
}
}
void Rank()
{
printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
}
void statistic()
{
char s[4][20]={
"Chinese",
"Mathematics",
"English",
"Programming"
};
printf("Please enter class ID, 0 for the whole statistics.\n");
char n[30];
scanf("%s",n);
int no=0;
double ave[4]={};
int i,j;
for(i=0;i<len;i++)
{
if(strcmp(stu[i].CID,n)==0||strcmp(n,"0")==0)
{
for(j=0;j<4;j++)
{
ave[j]+=stu[i].a[j];
}
no++;
}
}
for(j=0;j<4;j++)
//
{
if(no!=0)ave[j]=1.0*ave[j]/no+EPS;
else ave[j]=0;
}
///
int all[60000]={};
for(i=0;i<4;i++)
{
int fail=0;
puts(s[i]);
for(j=0;j<len;j++)
{
if(stu[j].a[i]<60&&(strcmp(stu[j].CID,n)==0||strcmp(n,"0")==0))
{
fail++;
}
else if(strcmp(stu[j].CID,n)==0||strcmp(n,"0")==0)
{
all[j]++;
}
}
printf("Average Score: %.2lf\n",ave[i]);
printf("Number of passed students: %d\n",no-fail);
printf("Number of failed students: %d\n",fail);
printf("\n");
}
printf("Overall:\n");
int t=4,cut=0;
for(i=0;i<4;i++,t--)
{
//cut=0;
for(j=0;j<len;j++)
{
if(all[j]==t/*&&(strcmp(stu[j].CID,n)==0||strcmp(n,"0")==0)*/)
{
cut++;
}
}
printf("Number of students who passed ");
if(t==4) printf("all ");
else printf("%d or more ",t);
printf("subjects: %d\n",cut);
}
printf("Number of students who failed all subjects: %d\n\n",no-cut);
}
int main()
{
//freopen("C:\\Users\\5201\\Desktop\\1.txt","r",stdin);
//freopen("C:\\Users\\5201\\Desktop\\yb.txt","w",stdout);
//freopen("C:\\Users\\yb\\Desktop\\data.txt","r",stdin);
//freopen("C:\\Users\\yb\\Desktop\\yb.txt","w",stdout);
memset(stu,0,sizeof(stu));
while(1)
{
printfCaiDan();
char ch[10];
scanf("%s",ch);
if(ch[0]=='0') break;
else if(ch[0]=='1') add();
else if(ch[0]=='2') remove();
else if(ch[0]=='3') query();
else if(ch[0]=='4') Rank();
else if(ch[0]=='5') statistic();
}
return 0;
}
1. 从图片复制的时候小心引号,空格,回车。
2.注意no的值。当要查询的班级没有人的时候不能除以no。
3.注意精度。也就是EPS。 这是从网上看到的, 我也不知道为什么要这样。
4.排序的时候是按照输入信息顺序来排序的。
5.以上。