目录
写在前面
正文
第1关:结构体
第2关:共用体
第3关:枚举类型
写在最后
写在前面
本文代码是我自己所作,本人水平有限,可能部分代码看着不够简练,运行效率不高,但都能运行成功。另外,如果想了解更多,请订阅专栏头歌C语言程序与设计https://blog.csdn.net/m0_73222051/category_12106390.html
正文
第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 year;
int month;
}stu[50]; //给50的空间是因为0<=n<50
struct birs //储存输出学生的信息
{
int nums;
int year;
int month;
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].year,&stu[i].month);
//处理
for(i=0;i<n;i++)
{
for(j=0;j<k;j++)
{
if(bir[j].year == stu[i].year && bir[j].month == stu[i].month)
break;
}
if(j==k)
{
bir[k].month = stu[i].month;
bir[k].year = stu[i].year;
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++)
{
if(bir[i].nums > 1)
{
printf("%d %d ",bir[i].year,bir[i].month);
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 **********/
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!