(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
本章例题相关知识点(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); }