来自网络,联系侵删
1590 字
4 分钟
填空题专项练习
填空题专项练习
本篇文章整理了三道典型的 C 语言程序填空题,涵盖字符串处理、矩阵外围元素旋转以及矩阵列移动等常见考点。每道题目均给出详细的解题思路、完整带注释代码以及关键知识点说明,帮助读者掌握填空题的解题方法。
题目一:统计字符串中的单词个数
题目描述
给定程序中,函数 fun 的功能是:计算出形参 s 所指字符串中包含的单词个数,作为函数值返回。为便于统计,规定各单词之间用空格隔开。
例如:形参 s 所指的字符串为 This is a C language program.,函数的返回值为 6。
解题思路
本题考查利用”标志位”思想统计单词个数。核心思路如下:
- 设置两个变量:
n用于统计单词个数,flag作为标志位(0表示当前不在单词中,1表示当前正在一个单词中)。 - 从头到尾遍历字符串中的每个字符:
- 当遇到非空格字符且
flag == 0时,说明这是一个新单词的开始,将n加 1,并把flag置为1。 - 当遇到空格字符时,说明单词已结束,将
flag置为0,准备统计下一个单词。
- 当遇到非空格字符且
- 每次循环结束前需要将指针
s向后移动一位,以处理下一个字符。
完整代码
/*-------------------------------------------------------【程序填空】题目:统计字符串中单词个数-------------------------------------------------------*/#include <stdio.h>
int fun(char* s){ int n = 0, flag = 0; // n 用于统计单词个数,flag 为单词标志位 while (*s != '\0') // 遍历字符串直到结束符 { if (*s != ' ' && flag == 0) // 当前字符非空格且之前不在单词中 { /***********SPACE***********/ n++; // 【填空1】单词计数加 1 flag = 1; // 标记已进入单词 } if (*s == ' ') // 当前字符是空格 /***********SPACE***********/ flag = 0; // 【填空2】遇到空格,重置标志位,表示单词结束 /***********SPACE***********/ s++; // 【填空3】指针后移,处理下一个字符 } return n; // 返回单词个数}
main(){ char str[81]; int n; printf("\nEnter a line text:\n"); gets(str); // 读取一行字符串(注意:gets 在新标准中已被弃用) n = fun(str); printf("\nThere are %d words in this text.\n\n", n);}关键知识点
- 指针遍历字符串:通过
*s访问当前字符,s++移动指针,直到遇到'\0'结束符。 - 标志位思想:使用
flag变量记录”当前是否在单词中”的状态,能够有效避免连续空格导致的重复计数。 - 单词定义:以空格分隔的字符序列视为一个单词,本题规定单词之间用空格隔开。
题目二:N×N 矩阵外围元素顺时针旋转
题目描述
下列给定程序中,函数 fun 的功能是:有 N×N 矩阵,将矩阵的外围元素做顺时针旋转。操作顺序是:
- 首先将第一行元素的值存入临时数组
r; - 然后使第一列成为第一行;
- 最后一行成为第一列;
- 最后一列成为最后一行;
- 再使临时数组中的元素成为最后一列。
例如:若 N=3,有下列矩阵:
1 2 34 5 67 8 9操作后应为:
7 4 18 5 29 6 3解题思路
本题考查二维数组(矩阵)的元素旋转操作。核心思路是借助一个临时数组 r 保存第一行的值,然后按顺序完成四步赋值:
- 保存第一行:将
t[0][j](j 从 0 到 N-1)保存到临时数组r[j]中。 - 第一列变第一行:将第一列
t[j][0]的元素从右往左填入第一行,即t[0][N-j-1] = t[j][0]。 - 最后一行变第一列:将最后一行
t[N-1][j]的元素从上往下填入第一列,即t[j][0] = t[N-1][j]。 - 最后一列变最后一行:将最后一列
t[j][N-1]的元素从右往左填入最后一行,即t[N-1][N-1-j] = t[j][N-1],循环需从N-1递减到0。 - 临时数组变最后一列:将
r[j]填入最后一列t[j][N-1]。
完整代码
/*-------------------------------------------------------【程序填空】题目:N×N 矩阵外围元素顺时针旋转-------------------------------------------------------*/#include <stdio.h>
#define N 4
void fun(int (*t)[N]){ int j, r[N]; // 步骤1:将第一行的元素保存到临时数组 r 中 for (j = 0; j < N; j++) r[j] = t[0][j];
// 步骤2:第一列变第一行(从右向左填充) for (j = 0; j < N; j++) /***********SPACE***********/ t[0][N - j - 1] = t[j][0]; // 【填空1】第一列元素填入第一行(逆序)
// 步骤3:最后一行变第一列(从上向下填充) for (j = 0; j < N; j++) t[j][0] = t[N - 1][j];
/***********SPACE***********/ // 步骤4:最后一列变最后一行(从右向左填充) for (j = N - 1; j >= 0; j--) // 【填空2】循环变量 j 从 N-1 递减到 0 t[N - 1][N - 1 - j] = t[j][N - 1];
// 步骤5:临时数组变最后一列 for (j = N - 1; j >= 0; j--) /***********SPACE***********/ t[j][N - 1] = r[j]; // 【填空3】临时数组 r 的元素填入最后一列}
main(){ int t[][N] = { 21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10 }, i, j; printf("\nThe original array:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%2d ", t[i][j]); printf("\n"); } fun(t); printf("\nThe result is:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%2d ", t[i][j]); printf("\n"); }}关键知识点
- 二维数组与指向数组的指针:函数参数
int (*t)[N]表示t是一个指向含有 N 个元素的一维数组的指针,等同于二维数组int t[][N]。 - 临时数组保存数据:在矩阵旋转等需要”腾出位置”的操作中,必须先用临时数组保存即将被覆盖的数据,避免数据丢失。
- 下标变换技巧:通过
N-j-1实现索引的反转,是矩阵旋转类题目的常用技巧。
题目三:3×5 矩阵第 k 列左移
题目描述
给定程序中,函数 fun 的功能是:将 a 所指 3×5 矩阵中第 k 列的元素左移到第 0 列,第 k 列以后的每列元素依次左移,原来左边的各列依次绕到右边。
例如:有下列矩阵:
1 2 3 4 51 2 3 4 51 2 3 4 5若 k 为 2,程序执行结果为:
3 4 5 1 23 4 5 1 23 4 5 1 2解题思路
本题考查矩阵列的循环左移操作。核心思路如下:
- 整体操作次数:要将第 k 列左移到第 0 列,需要进行
k次单步左移(每次将所有行整体左移一列)。因此外层循环p从 1 到 k。 - 单步左移:对每一行进行如下操作:
- 先用
temp保存该行第 0 列的元素(因为左移后该元素会被覆盖,需要放到最后)。 - 将该行从第 0 列开始,每一列都赋值为后一列的值,即
a[i][j] = a[i][j+1],循环变量j从 0 到N-2。 - 将
temp中保存的原第 0 列元素放到该行最后一列a[i][N-1],实现”绕到右边”的效果。
- 先用
完整代码
/*-------------------------------------------------------【程序填空】题目:3×5 矩阵第 k 列左移-------------------------------------------------------*/#include <stdio.h>
#define M 3#define N 5
void fun(int (*a)[N], int k){ int i, j, p, temp; /***********SPACE***********/ for (p = 1; p <= k; p++) // 【填空1】外层循环,共进行 k 次单步左移 for (i = 0; i < M; i++) // 对每一行进行处理 { temp = a[i][0]; // 暂存当前行第 0 列元素 /***********SPACE***********/ for (j = 0; j < N - 1; j++) // 【填空2】内层循环,将该行元素左移一位 a[i][j] = a[i][j + 1]; /***********SPACE***********/ a[i][N - 1] = temp; // 【填空3】原第 0 列元素绕到最后一列 }}
main(){ int x[M][N] = { {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} }, i, j; printf("The array before moving:\n\n"); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) printf("%3d", x[i][j]); printf("\n"); } fun(x, 2); printf("The array after moving:\n\n"); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) printf("%3d", x[i][j]); printf("\n"); }}关键知识点
- 循环移位思想:将元素整体左移一位,原最左端的元素”绕”到最右端,本质上是循环移位。
- 多次单步移位:将 k 列移到首位等价于执行 k 次单步左移,这是处理一般化移位问题的常用方法。
- 临时变量保存数据:在元素移动过程中,必须先用临时变量保存会被覆盖的数据,再执行覆盖操作。
总结
填空题的核心解题方法是:
- 通读题目和代码:理解程序的整体功能和算法思路。
- 分析上下文:通过空格前后的代码逻辑推断应填入的内容。
- 注意数据流向:特别关注临时变量、循环变量、标志位等关键变量的变化。
- 验证结果:填空后用题目给出的示例数据手动模拟一遍,确认结果正确。
掌握上述三道题目涉及的字符串遍历、矩阵旋转和循环移位等技巧,能够应对大部分 C 语言填空题。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐












