Skip to content

3.3 编程题做题策略

计算机程序设计 · 专项策略 · 编程题做题策略(三步法+六大题型库)

编程题做题策略 · 专项

🎯 一句话秒杀:编程题 = 输入 → 处理 → 输出 三步走;30 分必拿区,会模板就得分。


① 📊【历年真题考情】

编程题(应用题)在广东专升本计算机统考中的位置:

项目结论
题型六、应用题(编程题)——每年必考
分值3 题 × 10 分 = 30 分 / 200 分(15%),全卷单题分值最大
考纲定位2026 考纲:控制结构、数组、函数、指针"能独立手推和编写完整程序"
关联资料真题原题见 考点拆分 05 手写编程

历年编程题类型:

年份题目题型归类
2023三次成绩取最大 / 正负零判断 / 十班人数查 y找最值 + 条件判断 + 数组查找
20243×3 填 201-209 / 30 成绩最高分 / 1-300 奇偶求和二维数组 + 找最值 + 累加求和

六大高频题型(按出现频率):

  1. 找最值(最高分/最大/最小)——2023、2024
  2. 循环累加/分别求和(奇偶、区间)——2024
  3. 二维数组填充 + 输出——2024
  4. 条件判断分类(正负零、闰年、奇偶)——2023
  5. 数组查找/统计——2023
  6. 排序(冒泡/选择)——与 2.8 联动

🎯 学习目标:学完本专项,你能 ① 用"输入→处理→输出"三步法拆解任何编程题;② 套用六大题型模板;③ 避开初始化/边界易错点;④ 把伪代码流畅转成真实 C 代码——30 分稳拿。


② 🗣️【零基础大白话引入】

编程题是什么? 编程题就是"给你一个任务,让你写一份菜谱(程序)"。考官出一道菜(如"算 30 个学生的最高分"),你要写出完整的做菜步骤(C 代码)。

为什么用"三步法"? 就像做菜前先想"要买什么菜、怎么炒、怎么装盘"——任何程序都是三件事:

  1. 输入 = 准备食材(读入数据)
  2. 处理 = 下锅炒(核心逻辑)
  3. 输出 = 装盘上桌(打印结果)

"先步骤后代码"是什么意思? 2026 考纲策略提示:先写伪代码(用大白话描述步骤),再翻译成 C 代码——就像先列购物清单再进超市,不容易漏东西。

伪代码 → 真实代码 过渡示例:

题目:输入 3 个数,输出最大值

伪代码(大白话):
1. 读入 a, b, c
2. 让 m = a
3. 如果 b 比 m 大,m = b
4. 如果 c 比 m 大,m = c
5. 输出 m

真实代码(C 语言):
#include <stdio.h>
int main() {
    int a, b, c, m;
    scanf("%d%d%d", &a, &b, &c);
    m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    printf("%d\n", m);
    return 0;
}

💡 口诀:先想清楚"输入什么、怎么算、输出什么",再动手写代码——思路占 70%,代码只占 30%


③ 📖【正式核心知识点讲解】

3.1 编程题标准框架(三件套)

任何编程题都必须有的"骨架"——少了就扣分:

c
#include <stdio.h>   // ① 头文件(必须)
// 可能还需要 #include <string.h> 或 <stdlib.h>

int main() {         // ② 主函数(必须)
    // 变量声明
    // 输入
    // 处理
    // 输出
    return 0;        // ③ 返回值(必须)
}

三件套清单:

必须项说明漏掉后果
#include <stdio.h>头文件printf/scanf 未声明
int main()主函数无程序入口
return 0;正常结束标志部分判卷扣分

3.2 三步法模板(输入 → 处理 → 输出)

通用做题步骤(任何题都适用):

步骤做什么例子(找最高分)
① 输入读入数据(scanf/数组)for(i=0;i<30;i++) scanf("%d",&s[i]);
② 处理核心逻辑(循环/判断/累加)max=s[0]; for(i=1;i<30;i++) if(s[i]>max) max=s[i];
③ 输出打印结果(printf)printf("最高分=%d\n",max);

三步法的意义:① 防止漏条件(输入/处理/输出三部分清楚);② 得分点清晰(每步都有分);③ 方便检查(哪一步错改哪一步)。

mermaid
flowchart LR
    A["① 输入<br/>scanf/数组<br/>读入数据"] --> B["② 处理<br/>核心逻辑<br/>循环/判断/累加"]
    B --> C["③ 输出<br/>printf<br/>打印结果"]

    style A fill:#2F6B9E,color:#fff
    style B fill:#E67E22,color:#fff
    style C fill:#27AE60,color:#fff

📌 先写伪代码再翻译 C 代码(2026 考纲策略):输入 → 处理 → 输出,任何编程题都适用。

3.3 六大高频题型模板库

模板 1:找最值(2023/2024 必考)

c
// 找最大:先假设第一个最大,再逐个比较
int max = a[0];
for (int i = 1; i < n; i++)
    if (a[i] > max) max = a[i];

要点:max 初始化为 a[0](不是 0!——数组全负时 0 会出错);循环从 i=1 开始。

模板 2:循环累加/分别求和(2024 必考)

c
// 求 1~n 的和
int sum = 0;
for (int i = 1; i <= n; i++)
    sum += i;

// 奇偶分别求和
int sum_odd = 0, sum_even = 0;
for (int i = 1; i <= n; i++) {
    if (i % 2) sum_odd += i;    // 奇数
    else sum_even += i;         // 偶数
}

要点:sum 必须初始化 0;边界用 <=(包含 n)。

模板 3:二维数组填充 + 输出(2024 必考)

c
// 3×3 按行填充并输出
int a[3][3], num = 201;
for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        a[i][j] = num++;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++)
        printf("%d ", a[i][j]);
    printf("\n");   // 每行结尾换行
}

要点:双重循环 i 行 j 列;输出时每行末尾 printf("\n")

模板 4:条件判断分类(2023 必考)

c
// 判断正负零
if (x > 0) printf("正数\n");
else if (x < 0) printf("负数\n");
else printf("零\n");

// 判断闰年
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    printf("闰年\n");
else printf("平年\n");

要点:else if 链;闰年条件 (能被4整除且不能被100整除) 或 能被400整除

模板 5:数组查找/统计(2023 必考)

c
// 查找某个值是否存在
int key = 5, found = 0;
for (int i = 0; i < n; i++)
    if (a[i] == key) { found = 1; break; }
if (found) printf("找到了\n");
else printf("没找到\n");

// 统计满足条件的个数
int count = 0;
for (int i = 0; i < n; i++)
    if (a[i] % 3 == 0) count++;
printf("能被3整除的个数 = %d\n", count);

要点:found 标志变量;count 初始化 0。

模板 6:排序(与 2.8 联动)

c
// 冒泡排序(升序)
for (int i = 0; i < n-1; i++)
    for (int j = 0; j < n-1-i; j++)
        if (a[j] > a[j+1]) {
            int t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        }

要点:内层 j < n-1-i(每轮少比较已排好的);交换需临时变量 t。

3.4 变量初始化与边界(易错点强化)

🚨 初始化三必查

变量初始化错误后果
累加器 sum= 0垃圾值导致结果错
计数器 count= 0统计个数错
最值 max/min= a[0](或第一个元素)全负时 max=0 出错
标志 found= 0无法判断是否存在

🚨 边界四必查

边界检查错误后果
循环边界含不含 n?用 <= 还是 <少算/多算一项
数组下标0~n-1,别越界到 n越界=运行错误
除法sum/n 还是 sum/n.0整数除法截断
scanf变量要 &,数组名不用 &输入无效

④ 🧪【真题同源例题】(2023/2024 完整推演)

例题 1:2024 真题(3×3 按行填 201-209)

题目:编程:将 201~209 这 9 个数按行存入 3×3 的二维数组,并输出矩阵。

三步法拆解:

  1. 输入:无(数据是固定的 201-209)
  2. 处理:双重循环填充 a[i][j] = num++
  3. 输出:双重循环打印矩阵

伪代码:

num = 201
对每行 i (0~2):
    对每列 j (0~2):
        a[i][j] = num; num = num + 1
对每行 i:
    对每列 j: 打印 a[i][j] + 空格
    换行

完整代码(逐步推演):

c
#include <stdio.h>
int main() {
    int a[3][3], num = 201;       // ① 变量:数组 + 起始数
    for (int i = 0; i < 3; i++)   // ② 填充:行循环
        for (int j = 0; j < 3; j++) {  // 列循环
            a[i][j] = num;        // 填当前格
            num++;                // 下一个数
        }
    for (int i = 0; i < 3; i++) { // ③ 输出:行循环
        for (int j = 0; j < 3; j++)
            printf("%d ", a[i][j]);
        printf("\n");             // 每行换行
    }
    return 0;
}

运行结果推演:

201 202 203
204 205 206
207 208 209

✅ 对应 2024 应用题第 1 题。num 从 201 开始,每填一格 +1——注意 num++ 是先赋值后自增。

例题 2:2024 真题(30 成绩找最高分)

题目:编程:输入 30 名学生的成绩,输出最高分。

三步法拆解:

  1. 输入:scanf 读 30 个成绩进数组
  2. 处理:找最大值(max 初始化为 a[0])
  3. 输出:打印 max

伪代码:

对 i (0~29): 读入 scores[i]
max = scores[0]
对 i (1~29):
    如果 scores[i] > max: max = scores[i]
打印 max

完整代码(逐步推演):

c
#include <stdio.h>
int main() {
    int scores[30], max;              // ① 数组 + max
    for (int i = 0; i < 30; i++)
        scanf("%d", &scores[i]);      // 输入(注意 &)
    max = scores[0];                  // ② max 初始化为第一个
    for (int i = 1; i < 30; i++)      // 从第2个开始比
        if (scores[i] > max)
            max = scores[i];          // 更新最大值
    printf("最高分 = %d\n", max);     // ③ 输出
    return 0;
}

推演示例(输入 85 72 93 ...):

  1. max = scores[0] = 85
  2. i=1: scores[1]=72 < 85 → 不变
  3. i=2: scores[2]=93 > 85 → max=93
  4. 继续比较... 最终 max = 最大值

✅ 对应 2024 应用题第 2 题。关键:max 初始化为 scores[0] 不是 0(全负时 0 会出错)。

例题 3:2024 真题(1-300 奇偶分别求和)

题目:编程:求 1~300 中奇数和与偶数和的差。

三步法拆解:

  1. 输入:无(固定 1~300)
  2. 处理:循环 1~300,i%2 判断奇偶分别累加
  3. 输出:打印两个和

伪代码:

sum_odd = 0; sum_even = 0
对 i (1~300):
    如果 i 是奇数: sum_odd += i
    否则: sum_even += i
打印 奇数和 偶数和

完整代码(逐步推演):

c
#include <stdio.h>
int main() {
    int sum_odd = 0, sum_even = 0;    // ① 两个累加器初始化0
    for (int i = 1; i <= 300; i++) {  // ② 循环 1~300
        if (i % 2)                    // i%2=1 是奇数
            sum_odd += i;
        else                          // i%2=0 是偶数
            sum_even += i;
    }
    printf("奇数和 = %d\n", sum_odd); // ③ 输出
    printf("偶数和 = %d\n", sum_even);
    return 0;
}

推演

  1. i=1: 1%2=1 → sum_odd=1
  2. i=2: 2%2=0 → sum_even=2
  3. i=3: 3%2=1 → sum_odd=4
  4. ... 直到 i=300

✅ 对应 2024 应用题第 3 题。注意 i % 2 为真(1)表示奇数,为假(0)表示偶数

例题 4:2023 真题(三次成绩取最大)

题目:编程:输入三次成绩 a、b、c,输出最大值。

三步法拆解:

  1. 输入:scanf 读 a、b、c
  2. 处理:m=a,逐个比较更新
  3. 输出:打印 m

伪代码:

读入 a, b, c
m = a
如果 b > m: m = b
如果 c > m: m = c
打印 m

完整代码:

c
#include <stdio.h>
int main() {
    int a, b, c, m;
    scanf("%d%d%d", &a, &b, &c);   // 输入
    m = a;                          // 先假设 a 最大
    if (b > m) m = b;               // b 更大就换
    if (c > m) m = c;               // c 更大就换
    printf("%d\n", m);              // 输出
    return 0;
}

✅ 对应 2023 应用题第 1 题。不需要数组——三个数用 if 链即可(找最值模板的简化版)。

例题 5:2023 真题(正负零判断)

题目:编程:输入一个整数 x,判断正数、负数还是零。

三步法拆解:

  1. 输入:scanf 读 x
  2. 处理:if-else if-else 判断
  3. 输出:打印结果

完整代码:

c
#include <stdio.h>
int main() {
    int x;
    scanf("%d", &x);
    if (x > 0) printf("正数\n");
    else if (x < 0) printf("负数\n");
    else printf("零\n");
    return 0;
}

✅ 对应 2023 应用题第 2 题。条件判断分类模板

例题 6:2023 真题(十班人数查 y)

题目:编程:已知 10 个班的人数存入数组 a[10],输入要查询的班号 y,输出该班人数。

三步法拆解:

  1. 输入:读入 a[10] 和 y
  2. 处理:数组下标访问 a[y](班号对应下标)
  3. 输出:打印 a[y]

完整代码:

c
#include <stdio.h>
int main() {
    int a[10], y, i;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);      // 读入10个班人数
    scanf("%d", &y);             // 要查询的班号
    printf("%d\n", a[y]);        // 直接下标访问
    return 0;
}

✅ 对应 2023 应用题第 3 题。数组查找模板的"已知下标"版——直接 a[y]


⑤ ⚠️【历年真题高频扣分坑】

#陷阱错误做法正确做法出处
1sum 不初始化int sum; sum+=i;int sum = 0;2024 累加
2max 初始化为 0int max = 0;int max = a[0];(全负会错)2024 最高分
3scanf 忘 &scanf("%d", a[i])scanf("%d", &a[i])2023/2024
4数组名加 &scanf("%s", &s)scanf("%s", s)经典
5循环边界错i < n 求 1~ni <= n2024 求和
6整数除法截断sum/30 当小数sum/30.0平均值题
7二维数组列数省略int a[3][]列数不能省2024 3×3
8忘 return 0main 无返回return 0;三件套
9忘换行输出无 \n每行结尾换行2024 矩阵
10n-- 边界交换/排序内层边界错j < n-1-i排序联动

📌 最值钱的一条:第 2 条(max 初始化)是 2024 最高分题的核心——"最值变量初始化为第一个元素" 是找最值模板的命门。


⑥ 📝【课后自测练习题】(闭卷挑战 10 题)

1. 编程:输入 10 个整数,输出它们的和。(累加模板)



2. 编程:输入 5 个整数,输出最大值和最小值。(找最值模板)



3. 编程:输入 n,输出 1~n 中能被 3 整除的数的个数。(统计模板)



4. 编程:输入一个年份,判断是否闰年。(判断模板)



5. 编程:将 1~9 存入 3×3 二维数组并按行输出。(二维模板)



6. 编程:输入 10 个成绩,输出平均值(保留 1 位小数)。(累加+除法)



7. 编程:输入 n 和 n 个数,查找某个值是否存在。(查找模板)



8. 编程:输出 1~100 所有偶数之和。(累加模板)



9. 编程:输入 3 个数,从大到小输出。(排序模板简化版)



10. 编程:输入一个正整数,判断它是否为素数。(判断模板)



👆 点击展开参考答案与解析

第1题(求和)

c
#include <stdio.h>
int main() {
    int a[10], i, sum = 0;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < 10; i++)
        sum += a[i];
    printf("和 = %d\n", sum);
    return 0;
}

第2题(找最值)

c
#include <stdio.h>
int main() {
    int a[5], i, max, min;
    for (i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    max = min = a[0];
    for (i = 1; i < 5; i++) {
        if (a[i] > max) max = a[i];
        if (a[i] < min) min = a[i];
    }
    printf("最大 = %d, 最小 = %d\n", max, min);
    return 0;
}

第3题(统计)

c
#include <stdio.h>
int main() {
    int n, i, count = 0;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
        if (i % 3 == 0) count++;
    printf("个数 = %d\n", count);
    return 0;
}

第4题(闰年)

c
#include <stdio.h>
int main() {
    int year;
    scanf("%d", &year);
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        printf("闰年\n");
    else
        printf("平年\n");
    return 0;
}

第5题(二维数组)

c
#include <stdio.h>
int main() {
    int a[3][3], num = 1;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            a[i][j] = num++;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
    return 0;
}

第6题(平均值)

c
#include <stdio.h>
int main() {
    int a[10], i, sum = 0;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < 10; i++)
        sum += a[i];
    printf("平均 = %.1f\n", sum / 10.0);  // 用10.0防截断
    return 0;
}

第7题(查找)

c
#include <stdio.h>
int main() {
    int a[100], n, key, i, found = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &key);
    for (i = 0; i < n; i++)
        if (a[i] == key) { found = 1; break; }
    if (found) printf("存在\n");
    else printf("不存在\n");
    return 0;
}

第8题(偶数求和)

c
#include <stdio.h>
int main() {
    int i, sum = 0;
    for (i = 2; i <= 100; i += 2)
        sum += i;
    printf("偶数和 = %d\n", sum);
    return 0;
}

第9题(从大到小)

c
#include <stdio.h>
int main() {
    int a, b, c, t;
    scanf("%d%d%d", &a, &b, &c);
    if (a < b) { t = a; a = b; b = t; }
    if (a < c) { t = a; a = c; c = t; }
    if (b < c) { t = b; b = c; c = t; }
    printf("%d %d %d\n", a, b, c);
    return 0;
}

第10题(素数)

c
#include <stdio.h>
int main() {
    int n, i, flag = 1;
    scanf("%d", &n);
    if (n < 2) flag = 0;
    for (i = 2; i * i <= n; i++)
        if (n % i == 0) { flag = 0; break; }
    if (flag) printf("是素数\n");
    else printf("不是素数\n");
    return 0;
}

📖 关联导航

内容关联位置
2024 真题原题代码考点拆分 05 手写编程
循环基础1.5 循环结构程序设计
数组基础1.6 数组
排序算法2.8 排序
返回计算机笔记索引index

📺 配套视频

编程题靠练,先看模板再动手。

仅供个人学习 · 考生回忆版 · 非考试院原卷