第1关:结构体
任务描述
本关任务:统计生日相同的学生。
相关知识
结构体的使用
编程要求
在一个100
人的班级中,有同学生日相同的几率非常大。现在给出每个学生的学号生日,请你找出所有生日相同的学生。
右侧编辑器中有一个函数Count
,请在此函数中读取数据统计结果。
输入数据由学员处理,每组数据有多行,第一行是一个整数n
(0<=n<50
),接下来有n
条学生的信息。
每一条学生的信息都按照此格式给出:<学号> <生日月份> <生日日期>
,其中学号是5
位的字符串。
要求只输出生日相同的学生的学号,输出要求如下,具体效果参考测试说明或查看测试集:
-
对每组生日相同的学生,输出一行。
-
其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔,简单起见,最后一个学号后面也有一个空格。
-
对所有的输出,要求按日期从前到后的顺序输出。
-
对生日相同的学号,按输入的顺序输出。
具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
预期输入: 5
00001 1 10
00002 2 24
00003 1 10
00004 12 21
00005 12 21
预期输出: 1 10 00001 00003
12 21 00004 00005
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
string hao;
int yue;
int ri,num=0;
int xu;//记录每个学生的输入顺序
}ren[101];
bool cmp(student,student);
int flag=0;
int Count()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>ren[i].hao>>ren[i].yue>>ren[i].ri;
ren[i].xu=i;
}
sort(ren+1,ren+n+1,cmp);//利用sort算法函数排序
for(int i=1;i<=n-1;i++)
{
flag=0;//控制换行的输出
for(int j=i+1;j<=n;j++)
{
if(ren[i].yue==ren[j].yue&&ren[i].ri==ren[j].ri&&ren[i].num==0)
{
cout<<ren[i].yue<<" "<<ren[i].ri<<" "<<ren[i].hao<<" ";
ren[i].num=1;//标价此数已被使用
flag=1;
}
if(ren[i].yue==ren[j].yue&&ren[i].ri==ren[j].ri&&ren[j].num==0)
{
ren[j].num=1;
cout<<ren[j].hao<<" ";
flag=1;
}
}
if(flag)
cout<<endl;
}
return 0;
}
bool cmp(student a,student b)
{
if(a.yue==b.yue)
{
if(a.ri==b.ri)
return a.xu<b.xu;
else return a.ri<b.ri;
}
else return a.yue<b.yue;
}
第2关:共用体
任务描述
本关任务:设计一个门牌号数据类型。
相关知识
共用体
共用体与结构体类似,但区别在于共用体的成员都共享同一块内存空间,修改一个成员的值,等于修改其他所有成员的值
编程要求
某小区的门牌号由三个字符构成,它们的含义分别如下:
-
第一个字符:取值范围
A-Z
,代表楼栋号。 -
第二个字符:取值范围
1-9
,代表楼层号。 -
第三个字符:取值范围
1-3
,代表房间号。
比如一个门牌号A31
,代表的是A
栋3
楼的1
号房间。
现在请你设计一个数据类型RoomID
,它需要包含以下几个成员变量:
-
build
:字符类型,代表门牌号中的楼栋号部分。 -
floor
:字符类型,代表门牌号中的楼层号部分。 -
room
:字符类型,代表门牌号中的房间号部分。 -
id
:字符串类型,代表整个门牌号。
要求修改id
时,对应的build
,floor
,room
也会随之修改。同理,修改build
,floor
,room
时id
也会随之修改。
请在右侧编辑器中补充代码,完成指定的数据类型的设计。评测系统会读取输入数据来测试这个数据类型是否满足要求。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: A31 2
b B
f 5
预期输出: 楼栋:A 楼层:3 房间:1
B31
B51
每组输入有多行。第一行的第一个数据是初始的门牌号,第二个数据是接下来的**命令条数n
**。
接下来n
行是命令。命令总共三种:b
、f
、r
,分别进行修改楼栋号,楼层号,房间号的动作。
在评测系统读取初始门牌号后会将其按各个部分分别输出,而执行了一条命令后,会输出完整的门牌号(即id
成员的值)。
#include <iostream>
using namespace std;
/********** Begin **********/
//在此处设计一个名为RoomID的结构体或共用体
union RoomID{
char id[4];
struct{
char build;
char floor;
char room;
};
};
/********** End **********/
第3关:枚举类型
任务描述
本关任务:计算工作一周的工资。
编程要求
某个工厂全年无休,它按照如下标准给工资:在周一至周五,按实际工作小时计算。而在周六工作时间按实际工作小时的1.5
倍计算,周日工作时间按实际工作小时2.0
倍计算。
现在给出工厂的员工小明的上班记录以及工厂的每小时工资,请你求出他工作所能得到的报酬。
右侧编辑器中有一个函数Sum
,请在此函数中读取数据计算结果。
输入数据由学员处理,每组数据有多行,第一行的第一个数是每小时的工资(**浮点类型float
**),第二个数是小明的上班次数n
。
下面n
行则是小明的上班记录,每一行的格式是<星期> <工作时间>
,其中<星期>
取值为1-7
,代表星期一到星期天,<工作时间>
为一个整数,代表小明这次上班的时长。
请计算并输出小明的报酬,占一行。具体见测试说明。
注:请用枚举类型来处理星期数。
测试说明
平台会对你编写的代码进行测试:
测试输入: 12.5 4
1 10
5 8
6 12
7 12
预期输出: 750
#include <iostream>
using namespace std;
/********** Begin **********/
//可以在此添加需要的内容
void Sum()
{
enum WeekDay{Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun}days;
float mony;
int day,mony_sum,time;
scanf("%f %d",&mony,&day);
for(int i = 0;i<day;i++){
scanf("%d %d",&days,&time);
switch(days){
case Mon:
case Tues:
case Wed:
case Thurs:
case Fri:
mony_sum=mony_sum+(mony*time);
break;
case Sat:
mony_sum+=1.5*mony*time;
break;
case Sun:
mony_sum+=2*mony*time;
break;
}
}
printf("%d",mony_sum);
//补充代码完成功能
}