(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
本章例题相关知识点(
http://t.csdn.cn/ynaqh
)
第1关:结构体
题目:
本关任务:统计生日相同的学生。
在一个
100
人的班级中,有同学生日相同的几率非常大。现在给出每个学生的学号生日,请你找出所有生日相同的学生。输入数据由
学员处理
,每组数据有多行,第一行是一个整数
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
代码思路:
strcpy()函数用法
头文件:string.h
语法/原型:
char* strcpy(char* strDestination, const char* strSource);
参数说明:
strDestination:目的字符串。
strSource:源字符串。
strcpy() 会把 strSource 指向的字符串复制到 strDestination。
必须保证 strDestination 足够大,能够容纳下 strSource,否则会导致溢出错误。
返回值:目的字符串,也即 strDestination。
我将这题分为两部分,前半部分找出生日相同学生信息,后半部分就是将其打印。
这题的难点在于如何才能将生日相同的学生信息依次打印出来,我们可以用两个结构体,第一个stuinfo用来储存输入的学生信息;第二个birs用来储存要输出学生信息,用nums来统计相同生日的学生人数,用二维数组将生日相同的学生信息储存起来。
然后在Count函数中先用for循环输入学生信息,然后再用双层for循环找出生日相同的学生信息。
首先j和k都为0,进入if语句,将第一名学生的信息存入输出数组,并将nums表示为1,表示有一个人这一天生日,然后将k加1,。
接着再次循环,j=0,k=1,判断第二名学生和第一名学生,如果相同就会break跳出循环进入else语句,将学生的学号复制进birs结构体中储存,并将nums++。如果没找到就会进入if语句再次重复上面的操作。
最后就是将birs中nums>1的部分,即生日相同人数超过1的部分输出即可
代码表示:
#include<stdio.h>
#include<string.h>
/********** Begin **********/
struct stuinfo
{
char id[6];
int month;
int day;
}stu[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);
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++)
{
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关:共用体
题目:
本关任务:设计一个门牌号数据类型。
某小区的门牌号由三个字符构成,它们的含义分别如下:
第一个字符:取值范围
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
代码思路:
由题意“要求修改
id
时,对应的
build
,
floor
,
room
也会随之修改”得,这里我们需要创建一个共用体,因为
build
,
floor
,
room
是不同的变量,三者互不影响,所以我们可以用结构体来储存他们
代码表示:
#include <iostream>
using namespace std;
/********** Begin **********/
union RoomID
{
struct
{
char build;
char floor;
char room;
};
char id[4];
};
/********** End **********/
第3关:枚举类型
题目:
本关任务:计算工作一周的工资。
某个工厂全年无休,它按照如下标准给工资:在周一至周五,按实际工作小时计算。而在周六工作时间按实际工作小时的
1.5
倍计算,周日工作时间按实际工作小时
2.0
倍计算。现在给出工厂的员工小明的
上班记录
以及工厂的
每小时工资
,请你求出他工作所能得到的报酬。右侧编辑器中有一个函数
Sum
,请在此函数中读取数据计算结果。输入数据由
学员处理
,每组数据有多行,第一行的第一个数是每小时的工资(**浮点类型
float
**),第二个数是小明的上班次数
n
。下面
n
行则是小明的上班记录,每一行的格式是
<星期> <工作时间>
,其中
<星期>
取值为
1-7
,代表
星期一到星期天
,
<工作时间>
为一个整数,代表小明这次上班的时长。
注
:请用枚举类型来处理星期数。测试输入:
12.5 4
1 10
5 8
6 12
7 12
预期输出:
750
代码思路:
本题需要创建一个枚举类型,根据题意可以用switch()函数实现每一天的工资结算。
代码表示:
#include<stdio.h>
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);
}