来自网络,联系侵删
1061 字
3 分钟
考试套题-第七套
C 语言考试套题 - 第七套
本套题包含填空题、改错题、程序设计题三个部分,涵盖字符串数组排序、递归求阶乘、因子求和等核心考点。
一、填空题:字符串数组按长度排序
题目说明
给定程序中,函数 fun 的功能是:对形参 ss 所指字符串数组中的 M 个字符串按长度由短到长进行排序。ss 所指字符串数组中共有 M 个字符串,且串长小于 N。
解题思路
采用选择排序,以”字符串长度”作为比较依据:
- 预先用
strlen计算每个字符串的长度,存入数组n[M],避免重复计算 - 外层循环
i从 0 到 M-2,每轮在i到 M-1 范围内找最短字符串的下标k - 内层循环
j从i开始遍历,比较n[k]与n[j],若n[k] > n[j]则更新k = j - 若
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 的花括号中填入你编写的若干语句。
解题思路
- 初始化因子和
sum = 0 - 遍历
i从 2 到n-1(排除 1 和自身) - 若
n % i == 0,说明i是n的因子,将其累加到sum - 返回
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是最常用的累加写法
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐












