来自网络,联系侵删
1013 字
3 分钟
考试套题-第四套
C 语言考试套题 - 第四套
本套题包含填空题、改错题、程序设计题三个部分,涵盖字符串过滤、指针排序、数位拆分合并等核心考点。
一、填空题:删除字符串中的指定字符
题目说明
功能:删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。
解题思路
采用”双指针(双下标)覆盖法”删除指定字符:
- 用
i遍历原字符串的每个字符 - 用
k记录保留字符的存放位置 - 当
str[i]不等于要删除的字符ch时,将其复制到str[k]并让k自增 - 遍历结束后,在
str[k]处补上字符串结束符'\0'
这种方法原地修改字符串,无需额外数组空间。
完整代码
#include <stdio.h>
main(){ char str[80], ch; int i, k = 0; /* 填空1:读取字符串(含空格用gets) */ gets(str); /* 读取要删除的字符 */ ch = getchar(); /* 填空2:遍历字符串直到结束符'\0' */ for (i = 0; str[i] != '\0'; i++) if (str[i] != ch) { /* 填空3:保留的字符前移到位置k */ str[k] = str[i]; k++; } /* 填空4:在新字符串末尾添加结束符'\0' */ str[k] = '\0'; puts(str);}关键考点
- 双下标覆盖法:用一个下标遍历、另一个下标写入,实现原地删除
- 字符串结束符
'\0':C 字符串以'\0'结尾,删除后必须补上 gets与getchar的配合:gets读整行字符串,getchar读单个字符- 字符串遍历:
for (i = 0; str[i] != '\0'; i++)是标准遍历模式
二、改错题:三个数排序
题目说明
下列给定程序中函数 fun 的功能是:把从主函数中输入的 3 个数,最大的数放在 a 中,中间的数放在 b 中,最小的数放在 c 中。
例如:若输入的数为:55 12 34,输出的结果应当是:a=55.0,b=34.0,c=12.0。
错误分析与修正
该程序有两处 FOUND 标记:
错误 1:临时变量类型错误
- 原错误写法:
int k; - 修正写法:
float k; - 错误原因:函数处理的是
float类型的数据,若临时变量k用int,交换时会发生截断丢失小数部分。
错误 2:比较方向错误
- 原错误写法:
if (*a > *c)(写成大于) - 修正写法:
if (*a < *c) - 错误原因:目标是让
a存最大值。当a比c小时才需要交换,使较大的值进入a。若写成>则逻辑相反。
完整代码
#include <stdio.h>
void fun(float* a, float* b, float* c){ /* 修正1:临时变量k应为float类型,与数据类型一致 */ float k; /* 第1步:保证a >= b */ if (*a < *b) { k = *a; *a = *b; *b = k; } /* 修正2:当a < c时交换,保证a中存最大值 */ if (*a < *c) { k = *c; *c = *a; *a = k; } /* 第3步:保证b >= c,使b存中间值,c存最小值 */ if (*b < *c) { k = *b; *b = *c; *c = k; }}
main(){ float a, b, c; printf("Input a b c: "); scanf("%f%f%f", &a, &b, &c); printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n", a, b, c); fun(&a, &b, &c); printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n", a, b, c);}关键考点
- 指针参数与解引用:通过
*a、*b、*c修改主调函数的变量 - 变量类型匹配:临时变量的类型必须与交换数据类型一致
- 比较交换排序:通过两两比较交换,实现三个数的排序
- 指针传址调用:
fun(&a, &b, &c)传入地址,函数内可修改原变量
三、程序设计题:两位数合并
题目说明
函数 fun 的功能是:将 a、b 的两个两位正整数合并成一个新的整数放在 c 中。
合并的方式是:将 a 中的十位和个位数依次放在变量 c 的百位和个位上,b 中的十位和个位数依次放在变量 c 的千位和十位上。
例如:当 a=45,b=12,调用该函数后 c=1425。
注意:请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
解题思路
将 c 拆解为千位、百位、十位、个位四个部分,分别填入对应数字:
c的千位 =b的十位 =b / 10,需乘 1000c的百位 =a的十位 =a / 10,需乘 100c的十位 =b的个位 =b % 10,需乘 10c的个位 =a的个位 =a % 10,需乘 1
验证:a=45, b=12
- b/10=1 → 1000
- a/10=4 → 400
- b%10=2 → 20
- a%10=5 → 5
- 合计:1000+400+20+5 = 1425 ✓
完整代码
#include <stdio.h>
void fun(int a, int b, long* c){ /**********Program**********/ /* a的十位放c百位,a的个位放c个位 */ /* b的十位放c千位,b的个位放c十位 */ *c = a % 10 + (b % 10) * 10 + (a / 10) * 100 + (b / 10) * 1000; /********** End **********/}
void main() /* 主函数 */{ int a, b; long c; printf("Input a, b:"); scanf("%d%d", &a, &b); fun(a, b, &c); printf("The result is: %ld\n", c);}关键考点
- 数位拆分:
a / 10取十位,a % 10取个位 - 数位合并:通过乘以不同权值(1、10、100、1000)拼接到对应位置
- 指针输出参数:
long* c通过解引用*c = ...将结果写回主调函数 - 数据类型选择:结果用
long类型存储,避免溢出
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐












