目录
写在前面
正文
第1关:结构体
第2关:共用体
第3关:枚举类型
写在最后
写在前面
本文代码是我自己所作,本人水平有限,可能部分代码看着不够简练,运行效率不高,但都能运行成功。
正文
第1关:结构体
本关任务:统计生日相同的学生。现在给出每个学生的学号生日,请你找出所有生日相同的学生。
右侧编辑器中有一个函数
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>
using namespace std;
#include<string.h>
/********** Begin **********/
struct stuinfo //储存输入学生的信息,简称输入数组
{
char id[6];
int month;
int day;
}stu[50]; //给50的空间是因为0<=n<50
struct birs //储存输出学生的信息,简称输出数组
{
int nums;
int month;
int day;
char ids[50][6];
}bir[50]={0};
void Count()
{
int n,i,j,k=0;
scanf("%d",&n);
//输入n个学生信息
for(i=0;i<n;i++)
scanf("%s%d%d",stu[i].id,&stu[i].month,&stu[i].day);
//处理
for(i=0;i<n;i++)
{
//主要判断 输入数组 中的学生和 输出数组 中的每一个学生生日是否相同
for(j=0;j<k;j++)
{
if(bir[j].month == stu[i].month && bir[j].day == stu[i].day)
break;
}
//将不同生日的学生分开存放
if(j==k)
{
bir[k].day = stu[i].day;
bir[k].month = stu[i].month;
strcpy(bir[k].ids[0],stu[i].id);
bir[k].nums = 1;
k++;
}
//将相同生日的学生放在一起
else
{
strcpy(bir[j].ids[bir[j].nums],stu[i].id);
bir[j].nums++;
}
}
//输出
for(i=0;i<k;i++)
{
//只输出同一天生日学生数>=2的数组
if(bir[i].nums > 1)
{
printf("%d %d ",bir[i].month,bir[i].day);
for(j=0;j<bir[i].nums;j++)
printf("%s ",bir[i].ids[j]);
printf("\n");
}
}
}
/********** End **********/
第2关:共用体
!!!你只需设计一个数据类型!!!
本关任务:设计一个门牌号数据类型
RoomID
,它需要包含以下几个成员变量:
build
:字符类型,代表门牌号中的楼栋号部分。floor
:字符类型,代表门牌号中的楼层号部分。room
:字符类型,代表门牌号中的房间号部分。id
:字符串类型,代表整个门牌号。要求修改
id
时,对应的build
,floor
,room
也会随之修改。同理,修改build
,floor
,room
时id
也会随之修改。输入:每组输入有多行。第一行的第一个数据是初始的门牌号,第二个数据是接下来的**命令条数
n
**。接下来n
行是命令。命令总共三种:b
、f
、r
,分别进行修改楼栋号,楼层号,房间号的动作。输出:系统会分别输出初始门牌号的各个部分,而执行了一条命令后,会输出完整的门牌号(即
id
成员的值)。测试输入:
A31 2
b B
f 5
预期输出:
楼栋:A 楼层:3 房间:1
B31
B51
#include <iostream>
using namespace std;
/********** Begin **********/
union RoomID
{
struct
{
char build;
char floor;
char room;
};
char id[4];
};
/********** End **********/
第3关:枚举类型
本关任务:计算工作一周的工资。现在给出工厂的员工小明的上班记录以及工厂的每小时工资,请你求出他工作所能得到的报酬。
工资计算标准:在周一至周五,按实际工作小时计算。而在周六工作时间按实际工作小时的
1.5
倍计算,周日工作时间按实际工作小时2.0
倍计算。数据输入:第一行的第一个数是每小时的工资(**浮点类型
float
**),第二个数是小明的上班次数n
。下面n
行则是小明的上班记录,每一行的格式是<星期> <工作时间>
,其中<星期>
取值为1-7
,代表星期一到星期日,<工作时间>
为一个整数,代表小明这次上班的时长。测试输入:
12.5 4
1 10
5 8
6 12
7 12
预期输出:
750
#include <iostream>
using namespace std;
/********** Begin **********/
enum WeekDay
{
Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun
}week;
void Sum()
{
float money;
int day,sum,time;
scanf("%f%d",&money,&day);
for(int i = 0;i<day;i++){
scanf("%d%d",&week,&time);
switch(week)
{
case Mon:
case Tues:
case Wed:
case Thurs:
case Fri:
sum+=money*time;
break;
case Sat:
sum+=1.5*money*time;
break;
case Sun:
sum+=2*money*time;
break;
}
}
printf("%d",sum);
}
/********** End **********/