编程题做题策略 · 专项
🎯 一句话秒杀:编程题 = 输入 → 处理 → 输出 三步走;30 分必拿区,会模板就得分。
① 📊【历年真题考情】
编程题(应用题)在广东专升本计算机统考中的位置:
| 项目 | 结论 |
|---|---|
| 题型 | 六、应用题(编程题)——每年必考 |
| 分值 | 3 题 × 10 分 = 30 分 / 200 分(15%),全卷单题分值最大 |
| 考纲定位 | 2026 考纲:控制结构、数组、函数、指针"能独立手推和编写完整程序" |
| 关联资料 | 真题原题见 考点拆分 05 手写编程 |
历年编程题类型:
| 年份 | 题目 | 题型归类 |
|---|---|---|
| 2023 | 三次成绩取最大 / 正负零判断 / 十班人数查 y | 找最值 + 条件判断 + 数组查找 |
| 2024 | 3×3 填 201-209 / 30 成绩最高分 / 1-300 奇偶求和 | 二维数组 + 找最值 + 累加求和 |
六大高频题型(按出现频率):
- 找最值(最高分/最大/最小)——2023、2024
- 循环累加/分别求和(奇偶、区间)——2024
- 二维数组填充 + 输出——2024
- 条件判断分类(正负零、闰年、奇偶)——2023
- 数组查找/统计——2023
- 排序(冒泡/选择)——与 2.8 联动
🎯 学习目标:学完本专项,你能 ① 用"输入→处理→输出"三步法拆解任何编程题;② 套用六大题型模板;③ 避开初始化/边界易错点;④ 把伪代码流畅转成真实 C 代码——30 分稳拿。
② 🗣️【零基础大白话引入】
编程题是什么? 编程题就是"给你一个任务,让你写一份菜谱(程序)"。考官出一道菜(如"算 30 个学生的最高分"),你要写出完整的做菜步骤(C 代码)。
为什么用"三步法"? 就像做菜前先想"要买什么菜、怎么炒、怎么装盘"——任何程序都是三件事:
- 输入 = 准备食材(读入数据)
- 处理 = 下锅炒(核心逻辑)
- 输出 = 装盘上桌(打印结果)
"先步骤后代码"是什么意思? 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 编程题标准框架(三件套)
任何编程题都必须有的"骨架"——少了就扣分:
#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); |
三步法的意义:① 防止漏条件(输入/处理/输出三部分清楚);② 得分点清晰(每步都有分);③ 方便检查(哪一步错改哪一步)。
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 必考)
// 找最大:先假设第一个最大,再逐个比较
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 必考)
// 求 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 必考)
// 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 必考)
// 判断正负零
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 必考)
// 查找某个值是否存在
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 联动)
// 冒泡排序(升序)
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 的二维数组,并输出矩阵。
三步法拆解:
- 输入:无(数据是固定的 201-209)
- 处理:双重循环填充
a[i][j] = num++ - 输出:双重循环打印矩阵
伪代码:
num = 201
对每行 i (0~2):
对每列 j (0~2):
a[i][j] = num; num = num + 1
对每行 i:
对每列 j: 打印 a[i][j] + 空格
换行完整代码(逐步推演):
#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 名学生的成绩,输出最高分。
三步法拆解:
- 输入:
scanf读 30 个成绩进数组 - 处理:找最大值(max 初始化为 a[0])
- 输出:打印 max
伪代码:
对 i (0~29): 读入 scores[i]
max = scores[0]
对 i (1~29):
如果 scores[i] > max: max = scores[i]
打印 max完整代码(逐步推演):
#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 ...):
max = scores[0]= 85- i=1: scores[1]=72 < 85 → 不变
- i=2: scores[2]=93 > 85 → max=93
- 继续比较... 最终 max = 最大值
✅ 对应 2024 应用题第 2 题。关键:max 初始化为 scores[0] 不是 0(全负时 0 会出错)。
例题 3:2024 真题(1-300 奇偶分别求和)
题目:编程:求 1~300 中奇数和与偶数和的差。
三步法拆解:
- 输入:无(固定 1~300)
- 处理:循环 1~300,i%2 判断奇偶分别累加
- 输出:打印两个和
伪代码:
sum_odd = 0; sum_even = 0
对 i (1~300):
如果 i 是奇数: sum_odd += i
否则: sum_even += i
打印 奇数和 偶数和完整代码(逐步推演):
#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;
}推演:
- i=1: 1%2=1 → sum_odd=1
- i=2: 2%2=0 → sum_even=2
- i=3: 3%2=1 → sum_odd=4
- ... 直到 i=300
✅ 对应 2024 应用题第 3 题。注意
i % 2为真(1)表示奇数,为假(0)表示偶数。
例题 4:2023 真题(三次成绩取最大)
题目:编程:输入三次成绩 a、b、c,输出最大值。
三步法拆解:
- 输入:
scanf读 a、b、c - 处理:m=a,逐个比较更新
- 输出:打印 m
伪代码:
读入 a, b, c
m = a
如果 b > m: m = b
如果 c > m: m = c
打印 m完整代码:
#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,判断正数、负数还是零。
三步法拆解:
- 输入:scanf 读 x
- 处理:if-else if-else 判断
- 输出:打印结果
完整代码:
#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,输出该班人数。
三步法拆解:
- 输入:读入 a[10] 和 y
- 处理:数组下标访问 a[y](班号对应下标)
- 输出:打印 a[y]
完整代码:
#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]。
⑤ ⚠️【历年真题高频扣分坑】
| # | 陷阱 | 错误做法 | 正确做法 | 出处 |
|---|---|---|---|---|
| 1 | sum 不初始化 | int sum; sum+=i; | int sum = 0; | 2024 累加 |
| 2 | max 初始化为 0 | int max = 0; | int max = a[0];(全负会错) | 2024 最高分 |
| 3 | scanf 忘 & | scanf("%d", a[i]) | scanf("%d", &a[i]) | 2023/2024 |
| 4 | 数组名加 & | scanf("%s", &s) | scanf("%s", s) | 经典 |
| 5 | 循环边界错 | i < n 求 1~n | i <= n | 2024 求和 |
| 6 | 整数除法截断 | sum/30 当小数 | sum/30.0 | 平均值题 |
| 7 | 二维数组列数省略 | int a[3][] | 列数不能省 | 2024 3×3 |
| 8 | 忘 return 0 | main 无返回 | return 0; | 三件套 |
| 9 | 忘换行 | 输出无 \n | 每行结尾换行 | 2024 矩阵 |
| 10 | n-- 边界 | 交换/排序内层边界错 | 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题(求和):
#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题(找最值):
#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题(统计):
#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题(闰年):
#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题(二维数组):
#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题(平均值):
#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题(查找):
#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题(偶数求和):
#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题(从大到小):
#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题(素数):
#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 |
📺 配套视频
编程题靠练,先看模板再动手。
- 翁恺 P25~P40 循环/数组实战 · 浙大翁恺编程实战
- 升本啦 P17~P19 数组应用