《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者


《从C++小白到算法高手:GESP 1---8级成长全地图》

第一讲:认识GESP------从编程新手到算法探索者

一、课程导入:我们为什么要学习C++?

老师想先问大家几个问题。

问题1:你们觉得计算机聪明吗?

它可以帮我们计算数学题,可以玩游戏,可以识别图片,可以和我们聊天,还可以控制机器人。

但是,你们有没有想过:

计算机为什么能够完成这么多事情?

因为计算机能够按照我们给它的指令,一步一步地执行任务。


问题2:如果我们想让计算机帮我们解决一个复杂问题,应该怎么办?

比如:

  • 怎样让计算机帮我们统计全班同学的成绩?

  • 怎样让计算机在迷宫中找到出口?

  • 怎样让计算机从100万个数字中快速找到我们想要的数字?

  • 怎样让计算机找到两个城市之间最短的路线?

  • 怎样让计算机帮助我们设计一个游戏?

这些问题,靠简单的输入、输出和加减乘除就能全部解决吗?

当然不行!

我们需要学习更多的编程知识,还需要掌握各种算法。

这就是我们学习C++和信息学竞赛的原因。


1. C++不仅仅是一门编程语言

老师希望大家记住一句话:

学习C++,不仅仅是学习怎样写代码,更是在学习怎样思考问题、分析问题和解决问题。

举个例子。

假设老师给大家一个任务:

班级有30名同学,已经知道每个人的成绩,现在要找出最高分。

一个刚接触编程的同学,可能会想:

我一个一个看,谁的分数最高,就把谁记下来。

这就是最初的解决问题思路。

等我们学会数组,就可以把30名同学的成绩统一保存起来。

等我们学会循环,就可以让计算机自动检查每一个成绩。

等我们学会排序,就可以把所有成绩从小到大排列。

等我们学会更复杂的算法,就可以处理更多数据,解决更加复杂的问题。

你会发现:

同一个问题,随着我们掌握的知识越来越多,解决问题的方法也越来越丰富。

这就是编程思维的成长。


2. 什么是GESP?

它是中国计算机学会(CCF)开展的编程能力等级认证。

我们今天重点介绍的是GESP C++方向。

GESP C++设置了一级到八级,一共八个等级。

大家可以把它想象成一场有八个关卡的编程冒险。

每通过一个阶段,我们就会掌握更多的编程知识,能够解决更加复杂的问题。

不过,大家要注意:

GESP不是简单地考查我们记住了多少条C++语法。

它还会考查计算机基础、数学知识、数据结构、算法思想,以及实际编程解决问题的能力。

所以,我们学习GESP的真正目标,不是只为了拿到一张证书,而是借助这套学习体系,一步一步提高自己的编程能力。


二、八个等级:我们的编程成长地图

接下来,我们来看看:

从GESP一级到八级,我们究竟会经历怎样的学习旅程?

我把八个等级设计成八个成长关卡。


八级编程成长之旅

  1. 第一级:编程小助手

    认识计算机指令

    学会变量、输入输出、条件判断和循环,让计算机听懂我们的基本指令。

  2. 第二级:逻辑设计师

    让程序更加聪明

    学会多层条件、循环嵌套、流程图、编码和数学函数。

  3. 第三级:数据探险家

    开始处理数据

    学习进制转换、位运算、数组、字符串、枚举和模拟。

  4. 第四级:程序建筑师

    学会组织程序

    学习函数、指针、结构体、二维数组、递推和排序。

  5. 第五级:算法探索者

    学会选择算法

    学习数论、链表、二分、递归、分治和贪心。

  6. 第六级:搜索与策略大师

    进入算法世界

    学习树、DFS、BFS、一维动态规划、背包、栈和队列。

  7. 第七级:综合算法工程师

    挑战复杂问题

    学习复杂动态规划、图的遍历、泛洪算法和哈希表。

  8. 第八级:算法挑战者

    综合运用算法

    学习组合数学、倍增、最小生成树、最短路径和算法优化。

这八个等级并不是八个互不相关的知识包。

它们之间有着非常紧密的联系。

例如:

  • 没有学会循环,就很难理解数组的遍历。

  • 没有理解数组和函数,就很难组织复杂程序。

  • 没有理解递归,就很难真正掌握DFS。

  • 没有理解递推,就很难进一步学习动态规划。

  • 没有理解图的存储和遍历,就很难学习最短路径。

所以,我们要按照知识之间的关系,一步一步向前走。


三、四次重要的能力跃迁:学习GESP究竟难在哪里?

这是今天最重要的一部分。

我想给各位解释下:为什么有些同学学习一级、二级时感觉很轻松,到了四级、五级以后,突然觉得难了?

原因是:

随着学习深入,我们需要掌握的不只是更多知识,而是更高级的思考方法。

整个GESP学习过程,可以看成四次重要的能力跃迁。


第一次跃迁:从认识代码到独立编程(GESP 1---3级)

这个阶段,学生就像刚刚进入编程世界的小学徒。

计算机不会自动知道我们想做什么,我们必须把任务变成它能够理解的指令。

例如:

老师让计算机计算1到100的和。

就需要思考:

第一步:从哪里开始?

第二步:每次增加多少?

第三步:什么时候停止?

第四步:怎样保存计算结果?

我们可以通过循环解决这个问题。

复制代码
#include <iostream>
using namespace std;

int main() {
    int sum = 0;

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

    cout << sum;

    return 0;
}

这段代码看起来很简单,但是它已经包含了编程的重要思想:

  • 使用变量保存数据;

  • 使用循环重复执行任务;

  • 使用累加不断更新结果;

  • 使用输出展示最终答案。

到了三级,我们还会继续学习数组、字符串、枚举和模拟算法。

这意味着我们不再只会处理一个数字,而是可以处理一组数据,甚至解决一些简单的算法问题。

这一阶段的成长目标:

从看得懂代码,成长为能够独立写出完整程序。


第二次跃迁:从写代码到组织程序(GESP 4级)

到了四级,我们开始进入一个新的世界。

之前,程序可能只有几十行代码。

现在,我们可能要编写一个学生成绩管理程序,需要保存很多学生的信息,还要完成查询、排序和统计。

如果所有代码都写在main函数里面,会发生什么?

程序越来越长,越来越难理解,也越来越难修改。


这时候,我们需要学习:

  • 函数:把大任务拆成小任务。

  • 结构体:把相关的数据组织在一起。

  • 指针:理解数据在内存中的地址。

  • 二维数组:处理表格和矩阵数据。

  • 递推:根据已有结果计算新的结果。

例如,一个学生有姓名、学号和成绩。

我们可以用结构体把这些信息组织起来:

复制代码
struct Student {
    string name;
    int id;
    int score;
};

这样,一个Student就可以表示一个完整的学生信息。

我们不再需要用很多彼此独立的变量来描述同一个学生。

这就是数据组织思想。

这一阶段的成长目标:

从会写程序,成长为能够合理组织数据、拆分任务和设计程序。


第三次跃迁:从按照步骤做题到主动选择算法(GESP 5---6级)

这是非常重要的一次转变。

前面学习编程时,题目往往会告诉我们要计算什么,我们只需要按照要求编写代码。

但是到了五级、六级,很多问题不再直接告诉我们应该使用什么方法。

我们需要自己判断。


例如:

现在有100万个已经排好序的数字,需要寻找其中一个数字。

我们有两种办法。

办法一:从头到尾一个一个找。

这叫顺序查找。


办法二:每次查看中间位置,排除一半不可能的数字。

这叫二分查找。

两种方法都可能找到答案,但是效率差别很大。


再比如:

给你一张迷宫地图,怎样找到出口?

我们可以使用DFS,沿着一条道路不断探索。

也可以使用BFS,一层一层向外扩展。

如果题目要求最少走多少步,在符合条件的无权图中,BFS就非常有用。

再往后,我们还会学习动态规划。


这时候,我们需要思考:

  • 怎样定义状态?

  • 当前状态和之前的状态有什么关系?

  • 怎样找到状态转移方程?

  • 怎样避免重复计算?

这已经不是简单的语法问题了,而是真正的算法思维。


这一阶段的成长目标:

从知道怎样写程序,成长为能够分析问题、选择算法并解释算法原理。


第四次跃迁:从解决单一问题到综合建模与优化(GESP 7---8级)

到了七级、八级,我们面对的问题会更加复杂。

例如:

有很多城市,城市之间有道路,每条道路都有不同的长度。

现在要求:

  1. 找出两个城市之间最短的路线。

  2. 用尽可能低的成本连接所有城市。

  3. 对大量数据进行高效处理。

这时候,我们需要学习图论。

我们会接触:

  • 图的存储与遍历;

  • 最短路径;

  • 最小生成树;

  • 倍增法;

  • 组合数学;

  • 复杂动态规划;

  • 时间复杂度和空间复杂度分析;

  • 算法优化。

例如,连接所有城市且总道路成本最低,这是最小生成树问题。

寻找两个城市之间最短的路线,这是最短路径问题。

这些问题需要把实际场景转化为数学模型,再选择合适的算法解决。

这一阶段的成长目标:

从能够解决单一算法问题,成长为能够综合运用数学、数据结构和算法解决复杂问题。


四、八个等级之间有什么联系?为什么不能跳着学?

同学们,老师再给大家讲一个很重要的道理:

算法知识不是一个个孤立的工具,而是一棵不断生长的知识树。

我们来看几个例子。

1. 循环 → 数组 → 枚举 → 搜索

  • 学会循环:让计算机重复做事情。

  • 学会数组:让计算机保存一组数据。

  • 学会枚举:让计算机逐一尝试各种可能。

  • 学会搜索:让计算机系统地寻找符合条件的答案。

你会发现,后面的知识都是在前面知识的基础上发展出来的。


2. 函数 → 递归 → DFS → 回溯

  • 函数:把一个任务独立出来。

  • 递归:函数可以调用自己。

  • DFS:沿着搜索树的一条路径不断深入。

  • 回溯:发现当前选择不合适时,返回上一步尝试其他选择。

所以,学习DFS之前,如果函数和递归没有真正理解,后面就容易遇到困难。


3. 递推 → 一维DP → 二维DP → 复杂DP

  • 递推:根据以前的结果计算现在的结果。

  • 一维DP:设计一个状态,记录已经计算的答案。

  • 二维DP:使用两个维度描述问题状态。

  • 复杂DP:进一步设计状态、优化转移和空间。

这也是为什么我们不能只背动态规划公式。

真正需要掌握的是状态设计和状态之间的关系。


4. 数组 → 树 → 图 → 图论算法

  • 数组:数据按照连续的位置组织。

  • 树:数据具有父子层次关系。

  • 图:数据之间可以存在更加复杂的连接关系。

  • 图论算法:利用这些关系解决路径、连通性和网络优化问题。

这几条知识链,大家在以后的学习中会反复遇到。

老师希望大家明白:学习新知识时,不仅要问它是什么,还要问它从哪里来、以后能用来做什么。


五、GESP考试究竟考什么?只会写代码够不够?

我们再认识一下GESP考试本身。

GESP不是只考编程题,它还包括选择题、判断题和编程题。

按照你们学习的C++方向大纲,考试通常包含三个部分:

题型 主要考查内容
单选题 概念、语法、数学、算法知识
判断题 对知识点和程序运行结果的理解
编程题 独立分析问题、设计算法、编写程序

不同级别的具体考试时间和题型安排,要以对应级别及当次考试通知为准。


为什么有些同学选择题很好,编程题却做不好?

老师举一个例子。

假设题目要求:

输入10个数字,输出其中最大的数字。

有的同学看到题目会说:

这个我会!最大值就是max!

但真正让他写程序时,却可能遇到这些问题:

  1. 不知道怎样读取10个数字。

  2. 不知道怎样保存数据。

  3. 不知道怎样设计循环。

  4. 不知道怎样更新最大值。

  5. 不知道怎样处理特殊情况。

这说明什么?

说明认识一个知识点,不等于能够使用这个知识点解决问题。


所以,我们学习每一个级别,都应该同时训练三个能力:

知识理解能力

知道知识是什么,理解它的原理。

算法分析能力

知道题目要求什么,能够设计解决步骤。

编程实现能力

能够独立写出代码,调试程序并验证结果。

这三个能力缺一不可。


六、看看你现在处于哪个成长阶段?

接下来,老师给大家准备几个小问题。

大家不需要紧张,也不需要全部答对。主要是看看自己对未来的学习有多少了解。

GESP成长地图小测验

1 . 如果要让计算机重复计算1到100的数字,最基础的知识是什么?

A、结构体

B、循环

C、指针

2 . 如果要保存30名学生的成绩,最适合先学习什么?

A、数组

B、递归

C、最短路径

3 . 如果要把学生的姓名、学号和成绩放在一起,应该学习什么?

A、循环

B、结构体

C、二分查找

4 . 在一个已经排好序的数组中快速寻找数字,可以使用什么算法?

A、二分查找

B、冒泡排序

C、DFS

5 . 如果要在无权迷宫中寻找最少步数,可以优先考虑什么?

A、高精度运算

B、BFS

C、结构体

6 . 如果要找到连接所有城市且总成本最低的道路网络,属于什么问题?

A、最小生成树

B、字符串匹配

C、进制转换


七、给同学们的一份八级成长任务

最后,老师想给大家布置一个小小的课堂任务。

请大家在纸上画出自己的GESP成长路线。


请完成三个问题:

任务一:找到自己的位置。

你现在学习到GESP哪个级别?已经掌握了哪些知识?

任务二:找到下一个目标。

下一个级别需要学习什么?你最期待学习哪个知识?

任务三:找到自己的挑战。

你认为自己目前最需要加强的是哪方面?

  • C++基础语法;

  • 独立编程能力;

  • 数组和数据处理;

  • 递归与搜索;

  • 动态规划;

  • 图论与综合算法。

写下自己的答案。

这不仅是一份作业,也可以成为以后每个学习阶段的成长记录。


八、总结:从今天开始,认识真正的编程世界

今天我们没有写很多代码,但是我们认识了一件非常重要的事情:

GESP 1---8级,其实就是学习如何一步一步提高自己解决问题的能力。

我们再回顾一下今天的四次能力跃迁:


老师最后送给大家三句话:

  1. 不要害怕新知识,每一个复杂算法都是从简单知识发展而来的。

  2. 不要只记代码,要理解代码背后的思想。

  3. 不要只关注考试成绩,更要关注自己是否越来越能够独立解决问题。


编程学习是一场长期的冒险。今天你可能只会写一个简单的循环,但未来,你可能用自己编写的算法找到迷宫出口、规划城市道路,甚至创造一个属于自己的智能程序。

这就是我们学习C++的乐趣。


相关推荐
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂1 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven1 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus12 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla14 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu19 小时前
一个通用游戏数据服务器
c++·架构
another heaven19 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论