考试总结

2021-3-13考试总结

一、病人排队
得分:0分(订正后100分)
题目描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

老年人(年龄 >= 60岁)比非老年人优先看病。
老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
非老年人按登记的先后顺序看病。
病人年龄
分析:
1、本题考查结构体和排序;
2、应先判断人的年纪,在判断来的先后顺序;

具体做法:
1、struct一个结构体,结构体定义一个数组a,包含病人ID(string类型)和病人年龄(int类型),int变量n表示总人数;
2、输入n,循环输入病人id和年龄;
3、(重要) 双重循环排序,第一重i循环从后往前(方便比较年龄),第二重j循环从头到i(方便调整顺序),年龄大于六十的按照年龄排序(年龄相等按照来的顺序排序),年龄小于六十按照来袭的顺序排序;

for(int i=n;i>=1;i--)
	{
		for(int j=1;j<i;j++)
		{
			if((a[j].age<a[j+1].age) && (a[j].age>=60 || a[j+1].age>=60))
			swap(a[j],a[j+1]);
		}
	}

4、按照排好的顺序输出。

二、乒乓球

得分:0分(订正后100分)

题目描述
国际乒联现任主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是 其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

华华通过以下方式进行分析,首先将比赛中每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录(其中w表示华华获得一分,L 表示华华对手获得一分):WWWWWWWWWWWWWWWWWWWWWWLW在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

输入格式
每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。

其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

分析:
1、多行输入,用特殊的方法进行输入(0分就是卡在这里了);
2、十一分制和二十一分制,输出条件里还要有一条两数差大于等于2;
3、读到’E’要结束循环。

具体做法:
1、(重要) 输入多个字符串s,并且要把各个字符串加在一起;

string s1,s;
	while(cin>>s1)
	{
		s+=s1;
	}//注:这种输入方法在c++里用不了,只能在文件输入输出的情况下用

2、定义两个累加器,一个是小华的分数,另一个是对手的分数;
3、进行循环,如果读到‘W’,小华加一分,否则对手加一分(前提是排除‘E’);当两个计数器的值中比较大的那个大于11,并且两数差大于等于2,以两数比的形式输出这两个数(21分制就改一下大数的值就行)。
4、每次输出结束时都要清零计数器,并在循环外输出剩余的值(这里给出11分制的代码);

for(int i=0;i<s.size();i++)
	{
		if(s[i]=='W') zi++;
		else if(s[i]=='L') dui++;
		else if(s[i]=='E') break;
		if(/*zi+dui>=11引起来的这句话是没用的*/ && abs(zi-dui)>=2 &&(zi>=11 || dui>=11))
		{
			cout<<zi<<":"<<dui<<endl;
			zi=0;
			dui=0;
		}
	}
	cout<<zi<<":"<<dui<<endl;
	cout<<endl;
	zi=0;
	dui=0;

三、密室寻宝

得分:20分(订正后100分)

题目描述:
哈利・波特不经意间进入了一座古墓,古墓入口有一道大门,内部有六个密室,每个密室中藏有一件兵器。已知需要两个密码才能从里面打开密室和大门,取出密室内的兵器后从大门撤出。

两个密码均是不大于63的十进制整数,将其转化为八位二进制数后对应位进行“与”运算(运算的规则是:当两个位均为“1”时,结果为“1”,否则结果为“0”)。将“与”运算的结果从右往左数,当第n位为1时,表示可以打开第n个密室,取出其中的兵器;只有当取到至少两件兵器时,方可打开大门撤出。

现在哈利・波特任意给你两个密码,请你帮他设计一个程序,算算可以从哪些密室取出兵器,并可否从大门撤出。

分析:
1、十进制转二进制;
2、两数二进制的各数位的数进行比较;
3、判断数量并输出;
4、如果可以打开大门,代表有两件以上的密室可以打开,这时要输出密室的序号(从小到大)。

具体做法:
1、int函数,十进制转二进制;

int zhuaner(int d)
{
	int sum=0,ans=1;
	while(d>0)
	{
		sum+=d%2*ans;
		d/=2;
		ans*=10;
	}
	return sum;
}

2、定义两个数储存二进制数,再定义两个数组储存这两个数各位的数(逆序储存,让各个数位保持一致);
3、定义一个总数组,储存能开启密室的序号(在运行前务必要清零三个数组);

	int p[10],q[10];
	int lei[10];
	int pe,qe;
	pe=zhuaner(p1);
	qe=zhuaner(q1);
	for(int i=1;i<=8;i++)
	{
		p[i]=0;
		q[i]=0;
		lei[i]=0;
	}//清零数组
	for(int i=8;i>=1;i--)
	{
		if(pe>0)
		{
			p[i]=pe%10;
			pe/=10;
		}
		if(qe>0);	
		{
			q[i]=qe%10;
			qe/=10;	
		}
	}//转二进制后储存到数组里

4、开累加器,记录开启密室的数量,比较两个数组各位数字,如果相等,累加器加一,总数组储存编号;

int num=0;
	for(int i=8;i>=1;i--)
	{
		if(p[i]!=0 && p[i]==q[i])
		{
			num++;
			lei[i]=abs(i-9);
		}
		else continue;
	}

5、判断能否打开大门以及能打开的密室的编号,输出。

if(num<2) 
	{
		cout<<num<<endl<<"Close";
		return 0;
	}
	else if(num>=2)
	{
		for(int i=8;i>=1;i--)
		{
			if(lei[i]!=0)
			{
				cout<<lei[i]<<' ';
				lei[i]=0;
			}
		}
		cout<<endl<<"Open";
	}
posted @ 2021-03-14 17:59  best_brain  阅读(30)  评论(0)    收藏  举报  来源