来自网络,联系侵删
1282 字
3 分钟
考试套题-第三套
C 语言考试套题 - 第三套
本套题包含填空题、改错题、程序设计题三个部分,并附两道结构体综合练习题,涵盖结构体排序、进制转换、平均分计算等核心考点。
一、填空题:结构体数组按姓名排序
题目说明
程序通过定义学生结构体数组,存储若干名学生的学号、姓名和三门课的成绩。函数 fun 的功能是:将存放学生数据的结构体数组,按姓名的字典序(从小到大)排序。
解题思路
- 定义结构体类型
student,包含学号sno、姓名name、成绩数组score - 选择排序法:外层循环
i从 0 到 n-1,内层循环j从 i+1 到 n-1 - 比较姓名:使用
strcmp(a[i].name, a[j].name) > 0判断,若前者大于后者则交换 - 整体交换:结构体变量可以直接赋值,借助临时变量
t完成两个结构体元素的交换
完整代码
#include <stdio.h>#include <string.h>
struct student{ long sno; char name[10]; float score[3];};
void fun(struct student a[], int n){ /* 填空1:定义结构体临时变量t,用于交换 */ struct student t; int i, j; /* 填空2:外层循环i从0到n-1 */ for (i = 0; i < n; i++) /* 内层循环j从i+1到n-1,与i位置的元素逐一比较 */ for (j = i + 1; j < n; j++) /* 填空3:若a[i].name字典序大于a[j].name,则交换 */ if (strcmp(a[i].name, a[j].name) > 0) { t = a[i]; a[i] = a[j]; a[j] = t; }}
main(){ struct student s[4] = { {10001, "ZhangSan", 95, 80, 88}, {10002, "LiSi", 85, 70, 78}, {10003, "CaoKai", 75, 60, 88}, {10004, "FangFang", 90, 82, 87} }; int i, j; printf("\n\nThe original data :\n\n"); for (j = 0; j < 4; j++) { printf("\nNo: %ld Name: %-8s Scores: ", s[j].sno, s[j].name); for (i = 0; i < 3; i++) printf("%6.2f ", s[j].score[i]); printf("\n"); } fun(s, 4); printf("\n\nThe data after sorting :\n\n"); for (j = 0; j < 4; j++) { printf("\nNo: %ld Name: %-8s Scores: ", s[j].sno, s[j].name); for (i = 0; i < 3; i++) printf("%6.2f ", s[j].score[i]); printf("\n"); }}关键考点
- 结构体数组的定义与初始化
- 选择排序算法:双重循环实现,每次将最小的元素换到当前位置
strcmp字符串比较函数:返回值大于 0 表示前者大于后者- 结构体整体赋值:C 语言允许结构体变量之间直接用
=赋值
二、改错题:八进制字符串转十进制
题目说明
下列给定程序中函数 fun 的功能是:将一个由八进制数字字符组成的字符串转换成十进制整数。规定输入的字符串最多只能包含 5 位八进制数字字符。
例如:若输入 77777,则输出 32767。
错误分析与修正
该程序有两处 FOUND 标记:
错误 1:字符转整数未减去 ‘0’
- 原错误写法:
n = *p; - 修正写法:
n = *p - '0'; - 错误原因:
*p是字符的 ASCII 码值(如 ‘7’ 的 ASCII 码是 55),直接赋值会得到错误数值。减去'0'(ASCII 码 48)才能得到对应的数字 7。
错误 2:进制基数错误
- 原错误写法:
n = n * 10 + *p;(按十进制处理) - 修正写法:
n = n * 8 + *p - '0'; - 错误原因:八进制转十进制应乘以基数 8,而非 10;同时字符也需要减去
'0'转为数值。
完整代码
#include <stdio.h>#include <string.h>#include <stdlib.h>
int fun(char* p){ int n; /* 修正1:首字符转数值,需减去'0' */ n = *p - '0'; p++; while (*p != 0) { /* 修正2:八进制按基数8累加,且字符需减'0' */ n = n * 8 + *p - '0'; p++; } return n;}
main(){ char s[6]; int i; int n; printf("Enter a string (Ocatal digits): "); gets(s); /* 输入校验:字符串长度不超过5 */ if (strlen(s) > 5) { printf("Error: String too longer !\n\n"); exit(0); } /* 输入校验:每个字符必须是0~7的八进制数字 */ for (i = 0; s[i]; i++) if (s[i] < '0' || s[i] > '7') { printf("Error: %c not is ocatal digits!\n\n", s[i]); exit(0); } printf("The original string: "); puts(s); n = fun(s); printf("\n%s is convered to integer number: %d\n\n", s, n);}关键考点
- 字符与数值的转换:
ch - '0'将数字字符转为对应整数 - 进制转换算法:
n = n * base + digit是通用的权值累加公式 - 指针遍历字符串:
p++逐字符处理直到'\0' - 输入合法性校验:检查长度和字符范围
三、程序设计题:计算课程平均分
题目说明
编写函数 fun,其功能是:计算 n 门课程的平均分,结果作为函数值返回。
例如:若有 5 门课程的成绩是:90.5, 72, 80, 61.5, 55,则函数的值为:71.80。
注意:请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
解题思路
- 定义累加变量
sum初始化为 0.0,平均分变量aver - 遍历数组
a的前n个元素,逐个累加到sum - 用
sum / n计算平均值 - 返回平均值
完整代码
#include <stdio.h>
float fun(float* a, int n){ /**********Program**********/ float sum = 0.0, aver; int i; /* 第1步:累加n门课程成绩 */ for (i = 0; i < n; i++) { sum += a[i]; } /* 第2步:计算平均值 */ aver = sum / n; return aver; /********** End **********/}
main(){ float score[30] = { 90.5, 72, 80, 61.5, 55 }, aver; aver = fun(score, 5); printf("\nAverage score is: %5.2f\n", aver);}关键考点
- 一维数组作为函数参数:
float* a接收数组首地址 - 累加求和与求平均:最基本的数组统计操作
- 浮点数运算:注意
sum应定义为float以保证精度 - 指针与数组的关系:
a[i]等价于*(a + i)
四、附加练习 1:结构体模板代码
题目说明
这是一道结构体练习的模板代码,包含基本的文件头注释和空的 main 函数框架,可作为结构体编程练习的起点。
完整代码
// @item item name// @author Zhang San// @date 2026-07-04 23:08:18// @brief 简要功能描述// @version 1.0
#include <stdio.h>
int main() {
return 0;}关键考点
- 代码注释规范:文件头应包含作者、日期、功能描述等信息
- 标准程序框架:
#include头文件 +main函数 +return 0
五、附加练习 2:结构体学生平均分计算
题目说明
定义一个结构体 STREC,包含学号 num、N 门课程成绩数组 s 和平均分 ave。编写函数 fun 计算该学生的平均分并存入 ave 字段。
解题思路
- 定义结构体
STREC,含num(学号)、s[N](成绩数组)、ave(平均分) - 函数
fun接收结构体指针STREC* a,通过指针访问成员 - 累加 N 门成绩求总和,再除以 N 得到平均值
- 将平均值存入
a->ave
完整代码
// @item item name// @author Zhang San// @date 2026-07-04 22:55:52// @brief 简要功能描述// @version 1.0
#include <stdio.h>#define N 8
/* 定义结构体类型:学生记录 */typedef struct{ char num[10]; /* 学号 */ double s[N]; /* N门课程成绩 */ double ave; /* 平均分 */} STREC;
/* 计算学生平均分,结果存入a->ave */void fun(STREC* a){ int i; double sum = 0.0; /* 累加N门课程成绩 */ for (i = 0; i < N; i++) { sum += a->s[i]; } /* 求平均并写入ave字段 */ sum = sum / N; a->ave = sum;}
int main() { STREC s = { "AG005", 85.5, 76, 69.5, 85, 91, 72, 64.5, 87.5 }; int i; fun(&s); printf("The %s 's student data:\n", s.num); for (i = 0; i < N; i++) { printf("%4.1f\n", s.s[i]); } printf("\nave=%7.3f\n", s.ave);
return 0;}关键考点
typedef定义结构体别名:typedef struct {...} STREC;简化类型名- 结构体指针访问成员:使用
->运算符(a->s[i]、a->ave) - 结构体作为函数参数传指针:通过指针修改原结构体内容,避免值传递的拷贝开销
- 结构体初始化:定义时可直接按成员顺序赋初值
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐












