算法竞赛入门经典(第二版)-刘汝佳-第四章 函数与递归 师兄帮帮忙

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;
}



ps

1. 从图片复制的时候小心引号,空格,回车。

2.注意no的值。当要查询的班级没有人的时候不能除以no。

3.注意精度。也就是EPS。 这是从网上看到的, 我也不知道为什么要这样。

4.排序的时候是按照输入信息顺序来排序的。

5.以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值