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

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

本套题包含填空题、改错题、程序设计题三个部分,涵盖字符串数组排序、递归求阶乘、因子求和等核心考点。


一、填空题:字符串数组按长度排序#

题目说明#

给定程序中,函数 fun 的功能是:对形参 ss 所指字符串数组中的 M 个字符串按长度由短到长进行排序。ss 所指字符串数组中共有 M 个字符串,且串长小于 N。

解题思路#

采用选择排序,以”字符串长度”作为比较依据:

  1. 预先用 strlen 计算每个字符串的长度,存入数组 n[M],避免重复计算
  2. 外层循环 i 从 0 到 M-2,每轮在 i 到 M-1 范围内找最短字符串的下标 k
  3. 内层循环 ji 开始遍历,比较 n[k]n[j],若 n[k] > n[j] 则更新 k = j
  4. k != i,交换 ss[i]ss[k] 两个字符串(用 strcpy),同时交换长度数组对应元素

完整代码#

#include <stdio.h>
#include <string.h>
#define M 5
#define N 20
void fun(char (*ss)[N])
{
int i, j, k, n[M];
char t[N];
/* 预计算每个字符串的长度,存入数组n */
for (i = 0; i < M; i++)
n[i] = strlen(ss[i]);
for (i = 0; i < M - 1; i++)
{
k = i;
/* 填空1:内层循环j从i开始到M-1 */
for (j = i; j < M; j++)
/* 填空2:若n[k]大于n[j],说明找到更短的串,更新k */
if (n[k] > n[j]) k = j;
if (k != i)
{
/* 交换字符串ss[i]和ss[k] */
strcpy(t, ss[i]);
strcpy(ss[i], ss[k]);
/* 填空3:将临时串t(原ss[i])复制到ss[k]位置 */
strcpy(ss[k], t);
/* 同步交换长度数组对应元素 */
n[k] = n[i];
}
}
}
main()
{
char ss[M][N] = { "shanghai","guangzhou","beijing","tianjing","cchongqing" };
int i;
printf("\nThe original strings are :\n");
for (i = 0; i < M; i++)
printf("%s\n", ss[i]);
printf("\n");
fun(ss);
printf("\nThe result :\n");
for (i = 0; i < M; i++)
printf("%s\n", ss[i]);
}

关键考点#

  • 指向数组的指针char (*ss)[N] 是指向含 N 个元素的字符数组的指针,等价于二维数组 char ss[M][N]
  • 选择排序算法:每轮选出最值放到当前位置
  • strlen 求字符串长度:返回有效字符个数(不含 '\0'
  • strcpy 复制字符串:交换字符串内容的标准方法
  • 辅助数组优化:预先存储长度,避免排序时反复调用 strlen

二、改错题:递归求阶乘#

题目说明#

下列给定程序中,函数 fun 的功能是:求 k!(k<13),所求阶乘的值作为函数值返回。

例如:若 k=10,则应输出 3628800。

错误分析与修正#

该程序有一处 FOUND 标记:

错误 1:递归终止条件错误

  • 原错误写法:if (k > 0)if (k >= 1)
  • 修正写法:if (k > 1)
  • 错误原因:
    • 递归求阶乘 k! = k * (k-1)!,当 k 递减到 1 时应返回 1(即 1! = 1)作为递归出口。
    • 若写成 if (k > 0),当 k = 1 时仍会执行 return(1 * fun(0)),而 fun(0) 进入递归后 0 > 0 为假,返回 1,结果 1! = 1 虽然碰巧正确,但多了一层无意义的递归调用。
    • 更严重的是若写成 if (k >= 1) 且递归到 k = 0 时,0 >= 1 为假返回 1,逻辑上 0! 应为 1,看似也正确——但关键在于 k > 1 才是标准写法:只有当 k > 1 时才继续递归,k = 1 直接走 return 1,这是最清晰的递归出口。

完整代码#

#include <conio.h>
#include <stdio.h>
long fun(int k)
{
/* 修正1:递归终止条件k>1,k=1时返回1作为出口 */
if (k > 1)
return (k * fun(k - 1));
return 1;
}
void main()
{
int k = 10;
system("CLS");
printf("%d!=%ld\n ", k, fun(k));
}

关键考点#

  • 递归思想k! = k * (k-1)!,将大问题分解为同类小问题
  • 递归终止条件(递归出口):必须有明确的边界条件,否则无限递归导致栈溢出
  • 返回值类型:阶乘增长很快,用 long 类型存储结果(13! 已接近 int 上限)
  • 递归调用栈:每层递归占用栈空间,k < 13 的限制既保证不溢出又保证结果不超 long 范围

三、程序设计题:求因子之和#

题目说明#

请编写一个函数 fun,它的功能是:计算并输出给定整数 n 的所有因子(不包括 1 与自身)之和。规定 n 的值不大于 1000。

例如:若主函数从键盘给 n 输入的值为 856,则输出为 sum=763。

注意:请勿改动 main 函数和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

解题思路#

  1. 初始化因子和 sum = 0
  2. 遍历 i 从 2 到 n-1(排除 1 和自身)
  3. n % i == 0,说明 in 的因子,将其累加到 sum
  4. 返回 sum

注意:因子(约数)是指能整除 n 的数。题目明确排除 1 和 n 本身,所以循环范围是 [2, n-1]。如果允许包含 n 本身会导致 n 为质数时结果偏大。

完整代码#

#include <stdio.h>
#include <stdlib.h>
int fun(int n)
{
/**********Program**********/
int sum = 0;
int i;
/* 遍历2到n-1,排除1和自身 */
for (i = 2; i < n; i++)
{
/* 若i能整除n,则i是n的因子 */
if (n % i == 0)
sum += i;
}
return sum;
/********** End **********/
}
main()
{
int n, sum;
printf("Input n:");
scanf("%d", &n);
sum = fun(n);
printf("sum=%d\n", sum);
system("pause");
}

关键考点#

  • 因子(约数)的概念:能整除 n 的整数
  • 取余运算 % 判断整除n % i == 0 表示 i 整除 n
  • 循环范围控制:根据题意排除 1 和自身,范围是 [2, n-1]
  • 累加求和模式sum += i 是最常用的累加写法
分享

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

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

部分信息可能已经过时

目录