C语言头歌educoder实训作业答案分享 结构体

这篇博客主要介绍了C语言中的结构体、共用体和枚举类型的使用。在结构体部分,讲述了如何统计生日相同的学生;共用体部分涉及设计一个门牌号数据类型,要求成员共享内存空间;最后,通过枚举类型计算员工一周的工作工资,考虑了周末工资的不同计算规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1关:结构体

任务描述

本关任务:统计生日相同的学生。

相关知识

结构体的使用

编程要求

在一个100人的班级中,有同学生日相同的几率非常大。现在给出每个学生的学号生日,请你找出所有生日相同的学生。

右侧编辑器中有一个函数Count,请在此函数中读取数据统计结果。

输入数据由学员处理,每组数据有多行,第一行是一个整数n0<=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,代表的是A3楼的1号房间。

现在请你设计一个数据类型RoomID,它需要包含以下几个成员变量:

  • build:字符类型,代表门牌号中的楼栋号部分。

  • floor:字符类型,代表门牌号中的楼层号部分。

  • room:字符类型,代表门牌号中的房间号部分。

  • id:字符串类型,代表整个门牌号。

要求修改id时,对应的buildfloorroom也会随之修改。同理,修改buildfloorroomid也会随之修改。

请在右侧编辑器中补充代码,完成指定的数据类型的设计。评测系统会读取输入数据来测试这个数据类型是否满足要求。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入: A31 2 b B f 5

预期输出: 楼栋:A 楼层:3 房间:1 B31 B51

每组输入有多行。第一行的第一个数据是初始的门牌号,第二个数据是接下来的**命令条数n**。

接下来n行是命令。命令总共三种:bfr,分别进行修改楼栋号,楼层号,房间号的动作。

在评测系统读取初始门牌号后会将其按各个部分分别输出,而执行了一条命令后,会输出完整的门牌号(即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);
	//补充代码完成功能
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_62009942

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值