考试总结
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";
}

浙公网安备 33010602011771号