104|顺序结构与真题实战:把前三讲拼成完整程序

四季读书网 6 0
104|顺序结构与真题实战:把前三讲拼成完整程序

前三讲我们把三块拼图讲完了:第 101 讲认识了电脑和写程序的环境,第 102 讲学会了用变量把数据存下来,第 103 讲让程序能收数据、能算数。但到现在,我们写出来的都还是“一条直线”——从上往下走完就结束。

前三讲为了好懂,多用“游戏记分”当例子;从这一讲起,例子回归通用算法题型(判断奇偶、求和、成绩分档…)——因为分支和循环是所有题目的通用工具,考试题也不会只考游戏,早点熟悉通用写法没坏处。

这一讲是 1 级的收官一讲,干两件大事:一是讲清程序除了“一条直线”,还能按条件分岔、能重复做事(这就是大纲里的分支和循环);二是把前三讲串起来,配一套仿 1 级真题的实战演练。学完这一讲,你就有了独立写出一道完整 1 级编程题的能力。

导读:这一讲解决四个问题:① 顺序结构是什么(程序默认从上往下走,前三讲写的就是它);② 分支结构 if / if-else 怎么让程序“会判断”;③ 循环结构 for / while 怎么让程序“会重复”;④ 真题到底怎么考——先看清 1 级卷子的题型分值,再学“读题→找变量→定结构→写→自测”的解题套路,最后用三道仿真题练手,其中例 1 必须遮住答案自己先写一遍。

一、顺序结构:程序默认从上往下走

先说最简单、也最容易被忽略的——顺序结构。它的意思一句话:程序按你写的顺序,一句接一句从上往下执行,写完最后一句就结束。我们前三讲写的每一个程序,本质上都是顺序结构。

回头看第 103 讲那个“算平均分”的程序,它就是这个形状:

intmain() {

double level1, level2, level3;      // ① 先划格子

cin >> level1 >> level2 >> level3;  // ② 再收数据

double sum = level1 + level2 + level3;  // ③ 然后算

cout << sum / 3 << endl;            // ④ 最后输出

return0;

}

从 ① 到 ④,一条线走到底,没有任何分岔和重复——这就是顺序结构。它是所有程序的骨架:后面要讲的分支、循环,都是“嵌在顺序这条线里的某个环节”。

顺序结构里有一条铁律,前三讲反复强调、这里再点一次:变量必须先定义、后使用。你不能往一个还没划好的格子里装东西——在定义 double level1 之前就写 cin >> level1,编译器会直接报错。这一条在顺序结构里体现得最直白。

附:1 级标准程序模板——以后每次写程序,都从这四行出发。前面几讲每个例子都重复这几行,但一直没单独立起来讲清楚各自是干什么的。收官这讲把它立成模板:

#include <iostream>      // ① 工具箱

usingnamespace std;     // ② 命名空间

intmain() {             // ③ 程序入口

// 你的代码写在这里

return0;            // ④ 正常结束

}

① #include <iostream>:把“输入输出工具箱”搬进来。少了这一行,后面的 cin 和 cout 编译器都不认识。

② using namespace std;:声明“下面用的名字都来自标准库”。不写这行也可以,但 cin 就得写成 std::cin,麻烦。

③ int main() { }:程序入口。不管你写了多少行、写了几个函数,都从 main 里的第一句开始执行;花括号里就是“主流程”。

④ return 0;:告诉系统“程序正常结束”。1 级阶段照抄即可,不用深究。

记住这个起手式:先敲出这四行,再往 ③ 的花括号中间填“收数据 → 算一算 → 输出结果”。1 级的每一道编程题,都是往这个模板里填内容。

二、分支结构:让程序会判断

104|顺序结构与真题实战:把前三讲拼成完整程序-第1张图片-四季读书网

光有顺序结构,程序只能“一根筋”:不管输入什么,都走同一条路。但真实题目常常要“看情况”——比如成绩 >= 60 算及格、否则算不及格。这时候就要用分支结构,让程序按条件选不同的路走。

1. if:条件成立才做一件事。把判断条件写在圆括号里,条件成立(结果为真)才执行后面花括号里的语句:

int score;

cin >> score;

if (score >= 60) {        // 条件成立才进花括号

cout << 1 << endl;    // 及格,输出 1 表示

}

这里的条件是 score >= 60——还记得第 103 讲吗?关系运算的结果就是真或假,真在 C++ 里是 1、假是 0。所以“条件成立”等价于“括号里算出来是 1”。

2. if-else:二选一。条件成立走上面、不成立走下面,两条路必走其一:

if (score >= 60) {

cout << 1 << endl;    // 及格

} else {

cout << 0 << endl;    // 不及格

}

📌 1 级高频考点:判断相等要用两个等号 ==,一个等号 = 是“赋值”。这个坑第 103 讲专门讲过,在分支里它最致命——把 if (score = 60) 写成一个等号,程序不会报错,但意思完全变了(变成“把 60 放进 score”,永远为真)。

3. 复合条件:把几个判断合起来(&&、||)。光一个条件有时不够——比如“年龄满 8 岁、并且不超过 12 岁才能报名”,要同时满足两条。这就用上第 103 讲认识的逻辑运算了:&& 表示“并且”(两边都为 true 才 true)、|| 表示“或者”(有一边为 true 就 true)。

int age;

cin >> age;

if (age >= 8 && age <= 12) {   // 两个条件同时满足

cout << 1 << endl;         // 可以报名

} else {

cout << 0 << endl;         // 不可以

}

这里 age >= 8 && age <= 12 就是“并且”:两个判断都为真,整个括号才算真。逻辑运算 && || ! 在第 103 讲我们只记了符号,这里就是它的“用法现场”——1 级真题里偶尔会出这种“复合判断”,看到 && 读“并且”、|| 读“或者”就行。

4. 多档判断(if-else if)与“认得即可”的部分。当判断不止两档时,用 if - else if - else 连写,例如“成绩分档:不及格 / 及格 / 良好”。分档题在 1 级真题里很常见(典型如“输入分数输出 A/B/C/D/E 等级”),本讲真题区会用它做完整的“解题示范”,所以 if-else if 不是“认得即可”,而是要会写。大纲第 (11) 条另外列了 switch 多分支、以及三目运算 a > b ? x : y,它们 1 级很少单独考,认识符号即可。

边界提醒:1 级只要求单层分支——一个 if 里不再套另一个 if。分支的嵌套(if 里套 if)和 switch 的细讲,是 2 级的内容,留到那时再说。现在把“单层 if / if-else 写对、写熟”就够。

三、循环结构:把重复的事做 N 遍

有些活是重复的:比如“读出 10 个成绩求总和”“求从 1 加到 100 的和”。要是手写 100 遍,人和程序都受不了。这时候用循环结构,让同一段代码自动重复执行。

1. for:最常用的“计数循环”。下面这句的意思是“让 i 从 1 数到 100,每轮执行一次花括号里的语句”:

int sum = 0;

for (int i = 1; i <= 100; i++) {

    sum = sum + i;     // 把 i 不断加到 sum 上

}

cout << sum << endl;   // 输出 5050

for 后面圆括号里三段要记牢:int i = 1 是起点(i 从 1 开始)、i <= 100 是条件(只要 i 还不超过 100 就继续)、i++ 是每轮收尾(i 自动加 1,准备下一轮)。三段用分号隔开。

⚠️ 新手最懵的一行:sum = sum + i。记住一句白话:等号右边先算、再把结果放回左边。读法是“把 sum 里原来的数,加上 i,得到的结果重新存回 sum”。把 sum 想成一个存钱罐:每轮把“旧钱(旧 sum)+ 新硬币(i)”数一遍,再放回罐子里。所以这里的 = 不是数学里的“相等”,而是“更新”——下一轮的 sum,已经比上一轮多了 i。

2. 循环和顺序、分支能组合。比如用循环读入 5 个成绩并当场累加——这就是“顺序里套循环”:

int sum = 0, x;

for (int i = 1; i <= 5; i++) {

cin >> x;          // 每轮读一个数

    sum = sum + x;     // 当场累加

}

cout << sum << endl;   // 输出 5 个数之和

这里要分清两个角色:i 是计数器,只负责“数到第几轮”(从 1 数到 5),它和题目里的成绩数字没关系;真正装成绩的,是另一个变量 x。很多同学会问“i 不是已经 1 到 5 了吗,为什么还要输入 x”——答案就是:i 管“循环几轮”,x 管“每轮接什么数据”,各司其职。

3. while:先判断、后执行。大纲第 (12) 条明确要求for、while、do-while 以及 break、continue 全部掌握,不是“认得即可”。while 适合“循环次数事先不知道”的场景,比如“一直读、读到 0 就停”:

int x;

cin >> x;

while (x != 0) {        // 不是 0 就处理

cout << x * 2 << endl;

cin >> x;           // 再读下一个

}

和 for 比,while 把“条件”放在开头,先判断、后执行;do-while 则“先做一遍、再判断”(至少做一次)。break 是“直接跳出整个循环”、continue 是“跳过这一轮、进入下一轮”——这两个在 1 级真题里用得少,但大纲要求认识并能简单使用。

边界提醒:和分支一样,1 级只要求单层、简单的循环——循环里不再套循环(while 里也不套 for)。循环的嵌套(比如“外层数行、内层数列”)是 2 级内容。现在把“for / while 写对、i 从几到几算清楚”练熟就够。

四、注释与调试:写给人和编译器看

大纲第 (13) 条要求“理解程序的注释和调试”。这两件事不考你写多难的代码,但能决定你写代码顺不顺利。

1. 注释:// 后面写给人看的话。在代码行里写两个斜杠,从 // 到行尾的内容,编译器一律忽略,不会当成语法去执行。它是写给你自己和读代码的人看的“便签”:

// 下面这段:读入 5 个成绩并求总和

int sum = 0, x;

for (int i = 1; i <= 5; i++) {

cin >> x;

    sum = sum + x;     // 每轮把 x 加进 sum

}

结合第 102 讲“起个好名字”的习惯——好名字 + 必要注释,代码基本能自己说明白,别人(和一周后的你)读起来不费劲。

2. 调试:编译报错了,别慌。第 101 讲讲过在 Dev C++ 里编译运行。写程序时几乎一定会遇到报错(编译器下方的红色文字)。常见几类:

① 少了分号——每行 C++ 语句结尾要有 ;;

② 少了右括号或右花括号——() 和 {} 必须成对;

③ cin 和 cout 写反——箭头方向记反是新手常事;

④ 用了没定义的变量——又回到第一铁律:先定义、后使用。

编译器报错通常会告诉你是第几行出的问题,顺着行号去看那一行附近,多半就能定位。报错不是“你写错了”的羞辱,而是编译器在帮你找毛病——养成“看行号、就近排查”的习惯,比死记语法更重要。

3. 程序能运行、答案却错?编译报错好排查,更折磨新手的是“能跑、但结果不对”。别盯着整段发呆,用打印中间值的办法:在关键处临时加 cout << 把中间结果打出来,看它从哪一步开始不对。

int sum = 0, x;

for (int i = 1; i <= 5; i++) {

cin >> x;

    sum = sum + x;

cout << "i=" << i << " x=" << x << " sum=" << sum << endl;

}

比如上面,每轮都打印 i、x、sum,你一眼就能看出“是第几轮算错了、x 收对没有、sum 累加对不对”。定位到错的那一轮,问题往往就清楚了。查完记得把这行临时打印删掉——交卷时多输出内容会判错。

4. 练一道“改错题”:给一段有 bug 的代码,你来找茬。自己揪出来的错,比背十遍正确写法记得牢。下面这段想求“1 到 5 的和”(正确答案 15),但里面有 3 处错误,你能全部找出来吗?

int sum = 0;

for (int i = 1; i < 5; i++); {

    sum = sum + i

}

cout << sum << endl;

先别急着翻答案——自己在纸上改一遍,再往下看。(答案在本页最末尾)

五、真题实战:先学怎么想,再学怎么写

前三讲和本讲把“积木”(顺序 / 分支 / 循环)都讲完了,收官最关键的一步是:拿到一道题,怎么把积木拼成代码。直接把答案甩出来、照抄一遍,看着会了,真上机还是不会。这一节先给你一套通用解题套路,再用三道仿真题练手。

① 先看清 1 级卷子长什么样。满分 100 分、时长 120 分钟(以当期考试通知为准),题型分三块:

表 1 · C++ 1 级题型与分值(据官方考试说明整理)

题型
题量 × 分值
小计
单项选择题
15 题 × 2 分
30 分
判断题
10 题 × 2 分
20 分
编程题
2 题 × 25 分
50 分
合计
—
100 分

也就是说:编程题占了整整一半的分——前面几讲反复强调“一定要自己动手写”,原因就在这里。60 分(含)以上通过并获证;90 分(含)以上,下一次报名可以跳一级。题型分值以 CCF 官方最新公布为准。

② 通用解题套路:读题 → 找变量 → 定结构 → 写 → 自测

拿一道 1 级典型题,看这一步步怎么走:

题目:输入一个 0~100 的成绩,按档输出——不到 60 输出 0(不及格),60~84 输出 1(及格),85~100 输出 2(良好)。

读题:要输出“属于哪一档”,本质是按成绩范围分情况——这是分支题,不是循环题(只有一个数,不用重复)。

找变量:题目只给一个成绩,用 int score 存它就够。

定结构:三档用 if - else if - else 连写。关键技巧:后面的条件可以“偷懒”——走到第二档时,说明已经 score >= 60 了(否则早被第一档拦下),所以第二档只写 score < 85 即可:

#include <iostream>

usingnamespace std;

intmain() {

int score;

cin >> score;

if (score < 60) {

cout << 0 << endl;       // 不及格

    } elseif (score < 85) {

cout << 1 << endl;       // 及格

    } else {

cout << 2 << endl;       // 良好

    }

return0;

}

写:上面就是完整程序——把 if-else if 判断块,加上 cin >> score 收数据、套进 main 框架即可。

自测:写完别急着交,拿题目给的样例跑一遍,再换几个边界数试:59→0、60→1、84→1、85→2、100→2;再试端点 0 和 100。全对,才说明真写对了——这比背语法更重要。

③ 三道仿真题演练。下面三道按 1 级题型自编(非官方真题),都按真实考卷的样子写全:输入描述 + 输出描述 + 数据范围 + 输入输出样例。

例 1(分支 · 独立实战:先自己写,再看答案)

输入一个整数,如果是偶数就输出 0,否则输出 1。

【输入描述】一行,一个整数 n。

【输出描述】一行,一个整数:n 是偶数输出 0,是奇数输出 1。

【数据范围】0 ≤ n ≤ 10000

【输入样例】6

【输出样例】0 (6 是偶数,输出 0)

📌 这道题故意不给代码——参考程序放在本页最末尾答案块。按套路自己走一遍:要“分两种情况”→ 用分支;一个数用 int n 存;判断偶数用 n % 2 == 0。写完、编译跑通了,再翻到末尾对一遍——“看懂了”和“自己写出来”是两回事。

例 2(循环):求 1 到 N 的和。

输入一个正整数 N,输出 1 + 2 + … + N 的结果。

【输入描述】一行,一个正整数 N。

【输出描述】一行,一个整数:1 到 N 的累加和。

【数据范围】1 ≤ N ≤ 1000

#include <iostream>

usingnamespace std;

intmain() {

int n, sum = 0;

cin >> n;

for (int i = 1; i <= n; i++) {

        sum = sum + i;     // 累加器:旧 sum 加 i,再放回 sum

    }

cout << sum << endl;

return0;

}

【输入样例】100

【输出样例】5050 (1+2+…+100 = 5050)

例 3(循环套分支):统计能被 3 整除的数。

输入一个正整数 N,输出 1 到 N 当中能被 3 整除的数一共有几个。

【输入描述】一行,一个正整数 N。

【输出描述】一行,一个整数:1 到 N 中能被 3 整除的数的个数。

【数据范围】1 ≤ N ≤ 1000

#include <iostream>

usingnamespace std;

intmain() {

int n, cnt = 0;

cin >> n;

for (int i = 1; i <= n; i++) {

if (i % 3 == 0) {   // 分支:能被 3 整除才计数

            cnt = cnt + 1;  // 计数器加 1

        }

    }

cout << cnt << endl;

return0;

}

【输入样例】10

【输出样例】3 (1~10 中 3、6、9 共 3 个能被 3 整除)

例 2、例 3 都用上了累加器(sum = sum + i)和计数器(cnt = cnt + 1)——一个“把数加起来”、一个“把个数加起来”,套路一模一样。真题里这些考点从来不是孤立的,而是组合:基础打牢,组合就不慌。

给家长的话:这一讲故意留了一道“不给代码”的题(例 1),因为“看着代码读懂”和“自己写出来”是两回事。请把答案块遮住,让孩子从空白文件开始自己敲一遍:能不能自己想起模板那四行、自己判断该用 if 还是 for、自己拿样例跑对。这三件事做得到,1 级编程题才算真会;做不到,说明前面几讲的地基还要回炉——这比多做十道选择题有用。

六、1 级考点完整对照表

这是 1 级四讲的全局视图。前面三讲各管一块,本讲收尾,把 (10) (11) (12) (13) 补齐,1 级大纲就齐了:

表 2 · 1 级大纲 13 条 → 本系列落点

大纲条目
原文要点(节选)
本系列落点
第 (1) 条
计算机基本构成(CPU / 内存 / I/O)、操作系统概念
101
第 (2) 条
集成开发环境使用(如 Dev C++):编辑、编译、调试
101
第 (3) 条
cin / cout / scanf / printf、赋值语句
103
第 (4) 条
标识符、关键字、常量、变量、表达式
102
第 (5) 条
命名、定义、初始化与赋值、自加自减
102
第 (6) 条
算术表达式:加、减、乘、除、整除、求余
103
第 (7) 条
逻辑运算:与(&&)、或(||)、非(!)
103(识记)+ 本讲·二(&& || 用法示例)
第 (8) 条
关系运算六种(> >= < <= == !=)
103
第 (9) 条
基础数据类型:整型、实数型、字符型、布尔型
102
第 (10) 条
顺序结构程序的编写
本讲 · 一
第 (11) 条
分支:if / if-else / switch、三目运算
本讲 · 二
第 (12) 条
循环:for / while / do-while、break / continue
本讲 · 三(全部掌握)
第 (13) 条
程序的注释和调试的概念
本讲 · 四

下面四道题按 1 级题型自编(非真题),验收这一讲:

第 1 题(单选) 在 C++ 中,语句 if (score >= 60) { cout << 1 << endl; } 的含义是(  )

A. 只要 score 大于等于 60,就输出 1

B. 把 60 赋值给 score,再输出 1

C. 只要 score 等于 60,就输出 1

D. 无论 score 是多少,都输出 1

第 2 题(单选) 循环 for (int i = 1; i <= 5; i++) 的循环体一共会执行(  )

A. 4 次  B. 5 次  C. 6 次  D. 无限次

第 3 题(判断) 代码里的注释行(例如 // 这一步求总分)在程序运行时,会被当作计算来执行吗?(  )

第 4 题(编程) 输入两个整数,输出其中较大的一个。例如输入 7 3,输出 7——既练分支判断,又收本讲“会判断”的尾。

(四道题的答案在本页最末尾)

七、这一讲学完,1 级就通了

回头看 1 级四讲:101 带你进环境、写出第一行代码;102 教你用变量和数据类型存数据;103 让程序能收数据、能算数;本讲 给你分支和循环,把前三讲拼成完整程序,再配真题演练。

一个完整 1 级编程题,套路其实就是:cin 收数据 → 用顺序 / 分支 / 循环算一算 → cout 输出结果。把这条线吃透,1 级编程题就不可怕了。

动手清单(今天就能做完)

1. 照着“解题套路示范”的成绩分档题,自己补全 main 框架并编译运行,输入 59 / 60 / 85 看输出是不是 0 / 1 / 2

2. 把例 2 的循环条件改成 i <= 10(求 1 到 10 的和,应为 55),再跑一遍

3. 自己写例 1(奇偶)和第 4 题编程(输入两个数输出较大的),都用 if 比较两个大小——例 1 参考程序在本页最末尾答案块

4. 写完任何一题,拿题目给的输入样例跑一遍,再针对题目允许的范围选 2~3 个边界值试(比如 0、最大值、范围两端各试一次),确认输出符合预期再收工

注意:只测题目允许范围内的数——像例 2 规定 1 ≤ N ≤ 1000,就不必拿负数去试。

前三讲的内容如果还有模糊,可以往回翻:《变量与数据类型:给数字安个家》讲变量和类型,《运算符与输入输出:让程序动起来》讲 cin / cout 和整除求余——这两块是这一讲分支和循环的地基。

下一篇进入 2 级。先补一块“计算机自己那点事”:内存和硬盘到底有什么区别、网络为什么要分层、字符在计算机里其实是个数字(ASCII 编码)——这些都写在 2 级大纲里,是会考到的;补完这层底子,再进真正的重头戏:分支和循环的嵌套、多层判断,以及几个常用的数学函数(绝对值、开方、最大最小、随机数)。1 级你只学了“会一点点”,2 级才把它们用活。

如果这篇对你有用:点个收藏,备考时随手翻看;关注本号,「GESP 通关指南」系列从 1 级一路讲到 8 级,每个知识点都配可运行的代码和真实易错点,方便孩子照着练。

也欢迎在留言区说说:孩子写分支或循环时,最容易卡在哪一步?——留言里问得多的,我单独写一篇来讲。

▍自测题答案 与 真题参考程序

例 1(奇偶)参考程序:

#include <iostream>

usingnamespace std;

intmain() {

int n;

cin >> n;

if (n % 2 == 0) {

cout << 0 << endl;

    } else {

cout << 1 << endl;

    }

return0;

}

改错题答案(3 处):① 循环条件 i < 5 只加到 4,应改成 i <= 5;② for (...) 后面多了一个分号 ;,循环体变成空语句,后面大括号里那段只会执行一次;③ sum = sum + i 结尾少了分号。三处都改对后输出 15。

第 1 题:A——>= 是“大于等于”,条件成立才执行后面的输出。第 2 题:B——i 从 1 到 5 共 5 个值,循环体执行 5 次。第 3 题:错——// 后面是注释,编译器忽略,不会执行。第 4 题(编程):参考程序——读入 num1、num2,用 if 比较大小,输出较大的:

int num1, num2;

cin >> num1 >> num2;

if (num1 > num2) {

cout << num1 << endl;

} else {

cout << num2 << endl;

}

练一练:课上我们主要练写程序,但卷子上选择题 + 判断题一共 50 分(和两道编程题一样多),这部分靠“看过”没用,得刷。「GESP C++ 模拟考试」小程序里按级别放了 2944 道题——客观题 2312 道,其中 2090 道是往年真题里的原题,整理自 CCF 官网「真题解析」栏目公开发布的真题资料(2023 年 3 月到 2026 年 9 月共 15 场),另配 632 道编程练习;做完自动判分、错题带解析,点下面的卡片直达。

本文的知识点范围依据 CCF 官方《GESP 认证标准(C++)》第 1 级大纲整理,对应其中第 (10)、(11)、(12)、(13) 条。文中示例代码为教学示例,示例题系按 1 级题型自编、非官方真题,仅用于自测;题型与分值依据官方考试说明整理。考试大纲、题型与分值如有调整,一律以 CCF GESP 官方最新公布为准。

本文在整理资料与排版环节使用了 AI 辅助,知识点与官方口径均经人工核对。

抱歉,评论功能暂时关闭!