mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
1282 字
3 分钟
考试套题-第三套
2026-06-15

C 语言考试套题 - 第三套#

本套题包含填空题、改错题、程序设计题三个部分,并附两道结构体综合练习题,涵盖结构体排序、进制转换、平均分计算等核心考点。


一、填空题:结构体数组按姓名排序#

题目说明#

程序通过定义学生结构体数组,存储若干名学生的学号、姓名和三门课的成绩。函数 fun 的功能是:将存放学生数据的结构体数组,按姓名的字典序(从小到大)排序。

解题思路#

  1. 定义结构体类型 student,包含学号 sno、姓名 name、成绩数组 score
  2. 选择排序法:外层循环 i 从 0 到 n-1,内层循环 j 从 i+1 到 n-1
  3. 比较姓名:使用 strcmp(a[i].name, a[j].name) > 0 判断,若前者大于后者则交换
  4. 整体交换:结构体变量可以直接赋值,借助临时变量 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 的花括号中填入你编写的若干语句。

解题思路#

  1. 定义累加变量 sum 初始化为 0.0,平均分变量 aver
  2. 遍历数组 a 的前 n 个元素,逐个累加到 sum
  3. sum / n 计算平均值
  4. 返回平均值

完整代码#

#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 字段。

解题思路#

  1. 定义结构体 STREC,含 num(学号)、s[N](成绩数组)、ave(平均分)
  2. 函数 fun 接收结构体指针 STREC* a,通过指针访问成员
  3. 累加 N 门成绩求总和,再除以 N 得到平均值
  4. 将平均值存入 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
  • 结构体作为函数参数传指针:通过指针修改原结构体内容,避免值传递的拷贝开销
  • 结构体初始化:定义时可直接按成员顺序赋初值
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

考试套题-第三套
https://blog.radarweb.top/posts/c/考试套题-第三套/
作者
Sherry
发布于
2026-06-15
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录