数据学院2025级程序设计期末考试¶
2025级期末没有纸笔考试了,只有上机考试.平时他们也没有上机测验,因此这唯一的一次上机便是期末.
A卷¶
这里是根据你上传的图片内容整理的 Markdown 格式文字。我已经按照题目的顺序将其分块整理,并将样例放入了代码块中。
1. 共享单车计费¶
Description¶
某城市的共享单车计费规则如下:
- 基本费用
- 骑行时间在15分钟及以内收费1.5元;
- 第1个小时内,若超出15分钟,接下来每15分钟加收0.5元(不足15分钟按15分钟计);
- 第1个小时后,每15分钟加收1.5元(不足15分钟按15分钟计)。
- 会员优惠
- 若为普通用户,按上述规则计费;
- 若为月卡会员,总账单按8折收费;
- 若为年卡会员,第1个小时免费,第1个小时后按每15分钟加收1.4元(不足15分钟按15分钟计)。
请编写程序,根据用户输入的会员等级和骑行时间(分钟),计算账单金额。
Input¶
2行整数:
- 第1行整数表示会员等级(0表示普通用户;1表示月卡会员;2表示年卡会员)
- 第2行整数表示骑行时间(分钟),系统保证输入介于 1~1000 之间
Output¶
模拟输出给用户的账单消息,若账单金额为12.5元,应按照以下格式输出:
Amount Payable: 12.50
注意冒号为英文输入法下的冒号,冒号后面有一个空格,金额保留2位小数,不得输出多余的换行符。
Sample Input 1
0
17
Sample Output 1
Amount Payable: 2.00
Sample Input 2
1
62
Sample Output 2
Amount Payable: 3.60
Sample Input 3
2
62
Sample Output 3
Amount Payable: 1.40
Hint¶
提示:
- 可引入
math.h头文件后使用ceil方法,其函数签名为double ceil(double x);,功能为返回大于或等于 x 的最小整数值。
警告:
- 若直接按照输入用例输出结果,本题作答无效。
- 如果使用C++语言作答,仅允许引入
iostream和math头文件,若引入其他头文件,则本题作答无效。
2. 素数等差数列校验器¶
Description¶
如果一组素数(质数)能够构成等差数列,那么称这组数为“素数等差数列”。例如:3, 7, 11 是一个公差为 4 的等差数列。
请编写一个程序完成以下功能:
- 定义函数
int is_prime(int n);,函数功能为判断传入的参数 n 是否为一个素数,如果是素数,函数返回 1,否则返回 0; - 定义函数
int check_prime_as(int start, int diff, int count);,函数功能为检查从 start 开始,公差为 diff 的连续 count 个数是否全部为素数,如果全部为素数,函数返回 0,否则返回第一个不是素数的项; - 在主函数中接收标准输入提供的 3 个整数,分别表示起始值、公差和数列长度,调用函数检查是否为“素数等差数列”:
- 如果是,输出 YES 字样;
- 如果不是,输出数列中第一个不是素数的数字。
Input¶
一行内3个正整数,以空格间隔:
- 第 1 个正整数为起始值,保证介于 2~50,000,000 之间;
- 第 2 个正整数为公差,保证介于 2~500,000 之间;
- 第 3 个正整数为数列长度,保证介于 3~1000 之间。
Output¶
如果提供的参数是素数等差数列,输出 YES 字样;
如果不是,输出数列中第一个不是素数的数字。
不要输出多余的换行符。
Sample Input 1
3 4 3
Sample Output 1
YES
Sample Input 2
7 2 3
Sample Output 2
9
Hint¶
提示:
- 若最后一个测试点超时(提示Time Limit Exceeded),请考虑优化判断素数的方法。若其他测试点通过,则本题按照95%的成绩计入总分。
警告:
- 如果没有按照题目要求定义函数并调用,则本题最多按60%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 如果使用C++语言作答,仅允许引入
iostream和math头文件,若引入其他头文件,则本题作答无效。
3. 矩阵螺旋折叠提取器¶
Description¶
在图像处理和数据压缩中,经常需要按照特定的顺序对二维数组进行相关操作。请设计程序,从一个 \(3 \times 3\) 的矩阵中,按照对角线扫描的顺序提取元素并存入一个一维数组中,然后输出该一维数组的全部元素。
定义函数 void extract_diag(int matrix[3][3], int result[6]);,函数功能为将矩阵 matrix 的主对角线从左上到右下的 3 个元素拷贝至 result 数组的前 3 个元素位置,然后将矩阵 matrix 的副对角线从右上到左下的 3 个元素拷贝至 result 数组的后 3 个元素位置。函数体不要出现类似 matrix[1][1] 及 result[1] 的通过索引访问数组方式,必须通过指针地址偏移的方式访问数组元素,若使用索引方式访问数组,则本题最多仅可获得50%的分数。
主函数接收标准输入提供的矩阵值,调用函数后输出 result 数组的全部元素(主函数内允许通过索引方式对数组操作)。
Input¶
\(3 \times 3\) 的整数矩阵,每个元素的值介于 -100~100 之间,最后一行最后一个整数最后没有换行符。
Output¶
输出 result 数组的全部元素,以空格间隔,最后一个数字后不要输出多余的空格。
Sample Input 1
1 2 3
4 5 6
7 8 9
Sample Output 1
1 5 9 3 5 7
Hint¶
警告:
- 如果没有按照题目要求定义函数并调用,则本题最多按60%的成绩计入总分;
extract_diag函数体中不要出现类似于matrix[1][1]及result[1]的通过索引访问数组方式,请通过指针地址偏移的方式访问数组元素,否则本题最多按50%的成绩计入总分;- 若直接按照测试用例输出结果,本题作答无效;
- 如果使用C++语言作答,仅允许引入
iostream头文件,若引入其他头文件,则本题作答无效。
4. 删除空格 (文件版)¶
Description¶
编写函数char *delete_space(char *str),功能为删除 str中的所有空格,并将新字符串作为函数返回值。
在主函数中从文件接收一个字符串,调用函数后,将新字符串写入新的文件中。
Input (From File: 1.in)¶
读取 1.in 文件,文件中只有小写字母、空格、换行符。
Output (To File: 1.out)¶
将删除空格后的内容写入 1.out 文件。
Sample Input 1
hello tom
hello jerry
Sample Output 1
hellotom
hellojerry
Hint¶
警告:
- 如果没有按照题目要求定义函数并调用,则本题最多按60%的成绩计入总分;
- 如果没有正确释放文件指针和动态内存分配空间,则本题最多按90%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 本题仅限使用C语言作答,仅允许引入
stdio.h和stdlib.h头文件,引入其他任何头文件本题作答无效。
5. 成绩排序¶
Description¶
设计结构体 Student,其包含 3 个成员:
int stu_no; // 学生学号
char *name; // 学生姓名
int scores; // 学生成绩
接收标准输入提供的 N 个学生的信息,按照以下规则对学生信息进行排序:
- 学生成绩降序(从大到小)排序;
- 如果学生成绩相同,按照学号升序排序(从小到大)排序。
排序后按照指定格式重新输出全体学生信息。
Input¶
第 1 行为一个正整数 N,表示接下来提供的学生信息数目, \(1 <= N <= 10\)。
接下来 N 行按照姓名(仅包含大小写英文字母)、学号(由3位数字构成)、成绩(介于0~100)的顺序输入,以空格分隔。
所有学生的学号是唯一的。
Output¶
经过排序后的 N 行学生信息,按照学号、姓名、成绩的顺序输出,以空格分隔。
最后一行输出完毕后不要输出多余的换行符。
Sample Input 1
3
Tom 137 65
Jerry 139 75
Amy 131 75
Sample Output 1
131 Amy 75
139 Jerry 75
137 Tom 65
Hint¶
提示:
- 使用动态分配内存的方式访问结构体指针数组、正确释放动态内存分配空间、通过本题所有测试点,总成绩可获得 5 分加分。
警告:
- 如果没有按照题目要求定义结构体或修改结构体成员的数据类型,则本题最多按50%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 若使用C语言作答,仅允许引入
stdio.h和stdlib.h头文件;若使用C++语言作答,仅允许引入iostream和cstdlib头文件,引入其他任何头文件本题作答无效。
作答情况¶
| # | Title | Total | AC Rate | 通过人数 |
|---|---|---|---|---|
| 1 | 共享单车计费 | 268 | 15.67% | 42 |
| 2 | 素数等差数列校验器 | 218 | 13.30% | 29 |
| 3 | 矩阵螺旋折叠提取器 | 149 | 16.11% | 24 |
| 4 | 删除空格(文件版) | 101 | 1.98% | 2 |
| 5 | 成绩排序 | 163 | 4.91% | 8 |
B卷¶
好的,这是根据你提供的 image_07d82d.png 中的表格顺序整理的 Markdown 内容。
1. 停车收费¶
Description¶
某商场停车场计费规则如下:
- 前 30 分钟(含)免费;
- 停车时长在 3 小时(含)以内的,每小时收费 5 元,不满一小时按一小时计费;
- 停车时长在 3 小时以上的,每小时收费 10 元,不满一小时按一小时计费;
- 每 24 小时最高收费 65 元;
- 若停车时长超过 24 小时,则收取每日最高收费后,重新按照以上规则累加计费。
请编写程序,根据用户输入停车时间(分钟),计算账单金额。
Input¶
1 行整数,表示停车时长(分钟),系统保证输入介于 0~10000 之间。
Output¶
输出停车金额,保留 1 位小数。
Sample Input 1
25
Sample Output 1
0.0
Sample Input 2
45
Sample Output 2
5.0
Sample Input 3
365
Sample Output 3
55.0
Hint¶
提示:
- 可引入
math.h头文件后使用ceil方法,其函数签名为double ceil(double x);,功能为返回大于或等于 x 的最小整数值。
警告:
- 若直接按照输入用例输出结果,本题作答无效。
- 如果使用C++语言作答,仅允许引入
iostream和math头文件,若引入其他头文件,则本题作答无效。
2. 卢卡斯数¶
Description¶
卢卡斯数是一个以数学家爱德华·卢卡斯命名的整数序列,他既研究了这个数列,也研究了有密切关系的斐波那契数。
请设计函数 int lucas(int n);,函数功能为返回第 n 项卢卡斯数;
请设计函数 void find_lucas(int m, int n);,函数功能为输出 \([m, n]\) 区间内所有的卢卡斯数。
在主函数中接收用户从键盘上输入的两个数字,调用函数,输出区间内所有的卢卡斯数。
Input¶
以空格为间隔的两个正整数 m 和 n,保证 \(3 <= m <= n <= 10,000,000\)。
Output¶
介于区间 [m, n] 中的所有卢卡斯数,若有多个数字,以空格间隔,输出最后一个数字后必须输出空格。
Sample Input 1
3 30
Sample Output 1
3 4 7 11 18 29
Hint¶
提示:
- 若最后一个测试点超时(提示Time Limit Exceeded),请考虑优化函数代码。若其他测试点通过,则本题按照95%的成绩计入总分。
警告:
- 如果没有按照题目要求定义函数并调用,则本题最多按60%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 如果使用C++语言作答,仅允许引入
iostream头文件,若引入其他头文件,则本题作答无效。
3. 简易图像模糊滤镜¶
Description¶
假设你正在开发一个简单的图像处理软件。图像由 \(3 \times 3\) 的像素矩阵组成,每个像素的值为0~255。为了减少图像噪点,需要实现一个“平滑滤波器”:将矩阵中心位置的像素值,更新为其四周(含自身)共9个像素点的平均值。
定义函数 void smooth(int (*ptr)[3]); 函数功能为将 ptr 指向的区域及其后续区域表示的 \(3 \times 3\) 矩阵所有元素的值求平均值(取整数部分),并替换矩阵中心位置的值。
在主函数中使用动态内存分配方式创建数组,调用函数,并按照格式输出矩阵的每个元素。
整个程序代码不要出现类似 ptr[1][1] 通过索引访问数组方式,必须通过指针地址偏移的方式访问数组元素,若使用索引方式访问数组,则本题最多仅可获得50%的分数。
Input¶
3 行 3 列的整数序列,每个整数介于 [0, 255],每列以空格间隔。
Output¶
3 行 3 列的整数序列,每列以空格间隔,最后一个元素后不得输出空格或换行符。
Sample Input 1
10 20 30
40 100 60
70 80 90
Sample Output 1
10 20 30
40 55 60
70 80 90
Hint¶
警告:
- 如果没有按照题目要求定义函数并调用,或没有通过动态分配内存方式创建数组,则本题最多按60%的成绩计入总分;
- 代码中不要出现类似于
ptr[1][1]通过索引访问数组方式,请通过指针地址偏移的方式访问数组元素,否则本题最多按50%的成绩计入总分; - 若直接按照测试用例输出结果,本题作答无效;
- 如果使用C++语言作答,仅允许引入
iostream和cstdlib头文件,若引入其他头文件,则本题作答无效。
4. 单词倒序(文件版)¶
Description¶
读取文件 1.in,文件内有多个单词构成的字符串,输出从右到左的字母顺序至文件 1.out。
例如文件内字符串为 hello world
输出 dlrow olleh
Input (From File: 1.in)¶
读取文件 1.in,文件内有多个单词构成的字符串。
Output (To File: 1.out)¶
输出从右到左的字母顺序至文件 1.out。
Sample Input 1
hello world
Sample Output 1
dlrow olleh
Hint¶
警告:
- 如果没有正确释放文件指针和动态内存分配空间,则本题最多按90%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 本题仅限使用C语言作答,仅允许引入
stdio.h和stdlib.h头文件,引入其他任何头文件本题作答无效。
5. 成绩排序¶
Description¶
设计结构体 Student,其包含 3 个成员:
int stu_no; // 学生学号
char *name; // 学生姓名
int scores; // 学生成绩
接收标准输入提供的 N 个学生的信息,按照以下规则对学生信息进行排序:
- 学生成绩升序(从小到大)排序;
- 如果学生成绩相同,按照学号降序排序(从大到小)排序。
排序后按照指定格式重新输出全体学生信息。
Input¶
第 1 行为一个正整数 N,表示接下来提供的学生信息数目, \(1 <= N <= 10\)。
接下来 N 行按照姓名(仅包含大小写英文字母)、学号(由3位数字构成)、成绩(介于0~100)的顺序输入,以空格分隔。
所有学生的学号是唯一的。
Output¶
经过排序后的 N 行学生信息,按照学号、姓名、成绩的顺序输出,以空格分隔。
最后一行输出完毕后不要输出多余的换行符。
Sample Input 1
3
Tom 137 65
Jerry 139 75
Amy 131 75
Sample Output 1
137 Tom 65
139 Jerry 75
131 Amy 75
Hint¶
提示:
- 使用动态分配内存的方式访问结构体指针数组、正确释放动态内存分配空间、通过本题所有测试点,总成绩可获得 5 分加分。
警告:
- 如果没有按照题目要求定义结构体或修改结构体成员的数据类型,则本题最多按50%的成绩计入总分;
- 若直接按照测试用例输出结果,本题作答无效;
- 若使用C语言作答,仅允许引入
stdio.h和stdlib.h头文件;若使用C++语言作答,仅允许引入iostream和cstdlib头文件,引入其他任何头文件本题作答无效。
作答情况¶
| Title | Total | AC Rate | 通过人数 |
|---|---|---|---|
| 停车收费 | 364 | 9.07% | 33 |
| 卢卡斯数 | 244 | 3.69% | 9 |
| 简易图像模糊滤镜 | 130 | 11.54% | 15 |
| 单词倒序(文件版) | 70 | 4.29% | 3 |
| 成绩排序 | 146 | 7.53% | 11 |