mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
1590 字
4 分钟
填空题专项练习
2026-06-01

填空题专项练习#

本篇文章整理了三道典型的 C 语言程序填空题,涵盖字符串处理、矩阵外围元素旋转以及矩阵列移动等常见考点。每道题目均给出详细的解题思路、完整带注释代码以及关键知识点说明,帮助读者掌握填空题的解题方法。


题目一:统计字符串中的单词个数#

题目描述#

给定程序中,函数 fun 的功能是:计算出形参 s 所指字符串中包含的单词个数,作为函数值返回。为便于统计,规定各单词之间用空格隔开。

例如:形参 s 所指的字符串为 This is a C language program.,函数的返回值为 6

解题思路#

本题考查利用”标志位”思想统计单词个数。核心思路如下:

  1. 设置两个变量:n 用于统计单词个数,flag 作为标志位(0 表示当前不在单词中,1 表示当前正在一个单词中)。
  2. 从头到尾遍历字符串中的每个字符:
    • 当遇到非空格字符且 flag == 0 时,说明这是一个新单词的开始,将 n 加 1,并把 flag 置为 1
    • 当遇到空格字符时,说明单词已结束,将 flag 置为 0,准备统计下一个单词。
  3. 每次循环结束前需要将指针 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);
}

关键知识点#

  1. 指针遍历字符串:通过 *s 访问当前字符,s++ 移动指针,直到遇到 '\0' 结束符。
  2. 标志位思想:使用 flag 变量记录”当前是否在单词中”的状态,能够有效避免连续空格导致的重复计数。
  3. 单词定义:以空格分隔的字符序列视为一个单词,本题规定单词之间用空格隔开。

题目二:N×N 矩阵外围元素顺时针旋转#

题目描述#

下列给定程序中,函数 fun 的功能是:有 N×N 矩阵,将矩阵的外围元素做顺时针旋转。操作顺序是:

  1. 首先将第一行元素的值存入临时数组 r
  2. 然后使第一列成为第一行;
  3. 最后一行成为第一列;
  4. 最后一列成为最后一行;
  5. 再使临时数组中的元素成为最后一列。

例如:若 N=3,有下列矩阵:

1 2 3
4 5 6
7 8 9

操作后应为:

7 4 1
8 5 2
9 6 3

解题思路#

本题考查二维数组(矩阵)的元素旋转操作。核心思路是借助一个临时数组 r 保存第一行的值,然后按顺序完成四步赋值:

  1. 保存第一行:将 t[0][j](j 从 0 到 N-1)保存到临时数组 r[j] 中。
  2. 第一列变第一行:将第一列 t[j][0] 的元素从右往左填入第一行,即 t[0][N-j-1] = t[j][0]
  3. 最后一行变第一列:将最后一行 t[N-1][j] 的元素从上往下填入第一列,即 t[j][0] = t[N-1][j]
  4. 最后一列变最后一行:将最后一列 t[j][N-1] 的元素从右往左填入最后一行,即 t[N-1][N-1-j] = t[j][N-1],循环需从 N-1 递减到 0
  5. 临时数组变最后一列:将 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");
}
}

关键知识点#

  1. 二维数组与指向数组的指针:函数参数 int (*t)[N] 表示 t 是一个指向含有 N 个元素的一维数组的指针,等同于二维数组 int t[][N]
  2. 临时数组保存数据:在矩阵旋转等需要”腾出位置”的操作中,必须先用临时数组保存即将被覆盖的数据,避免数据丢失。
  3. 下标变换技巧:通过 N-j-1 实现索引的反转,是矩阵旋转类题目的常用技巧。

题目三:3×5 矩阵第 k 列左移#

题目描述#

给定程序中,函数 fun 的功能是:将 a 所指 3×5 矩阵中第 k 列的元素左移到第 0 列,第 k 列以后的每列元素依次左移,原来左边的各列依次绕到右边。

例如:有下列矩阵:

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

若 k 为 2,程序执行结果为:

3 4 5 1 2
3 4 5 1 2
3 4 5 1 2

解题思路#

本题考查矩阵列的循环左移操作。核心思路如下:

  1. 整体操作次数:要将第 k 列左移到第 0 列,需要进行 k 次单步左移(每次将所有行整体左移一列)。因此外层循环 p 从 1 到 k。
  2. 单步左移:对每一行进行如下操作:
    • 先用 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");
}
}

关键知识点#

  1. 循环移位思想:将元素整体左移一位,原最左端的元素”绕”到最右端,本质上是循环移位。
  2. 多次单步移位:将 k 列移到首位等价于执行 k 次单步左移,这是处理一般化移位问题的常用方法。
  3. 临时变量保存数据:在元素移动过程中,必须先用临时变量保存会被覆盖的数据,再执行覆盖操作。

总结#

填空题的核心解题方法是:

  1. 通读题目和代码:理解程序的整体功能和算法思路。
  2. 分析上下文:通过空格前后的代码逻辑推断应填入的内容。
  3. 注意数据流向:特别关注临时变量、循环变量、标志位等关键变量的变化。
  4. 验证结果:填空后用题目给出的示例数据手动模拟一遍,确认结果正确。

掌握上述三道题目涉及的字符串遍历、矩阵旋转和循环移位等技巧,能够应对大部分 C 语言填空题。

分享

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

填空题专项练习
https://blog.radarweb.top/posts/c/填空题专项练习/
作者
Sherry
发布于
2026-06-01
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录