codecombat吧 关注:1,814贴子:3,528
  • 0回复贴,共1

CodeCombat上线C++,提供信息学竞赛学习内容

只看楼主收藏回复

CodeCombat 首席支持者,你好,
CodeCombat信息学奥赛体系C++上线啦,下面是童老师为大家准备的介绍文章,看完后记得在底部领取免费试用班级码哈~
C++ 基本概念
我们首先介绍一些 C++ 语言的基本概念,这些概念有助于理解下文。
注释。以 // 开头的单行内容或者被 /* … */ 包含的内容为 C++ 的注释内容,注释内容并不被电脑使用,是纯粹提供给编程者阅读的内容。
变量。用来储存数据的结构。
函数。用来完成某种功能的结构。
声明。由于在 C++ 中默认只认可预先定义好的像 if, while 之类的大约六十个关键字,其他所有单词都被 C++ 认为是不可理解的。如果我们希望在代码中使用一个自定义变量或者函数,我们需要利用声明来向电脑宣告这个自定义的名字是合法的。即声明是保证 C++ 认识编程者书写的代码的基础。
命名空间。简单的说 namespace 的功能是最大化的利用一个名字,就好比汉语里我们知道张三和李三表示两个人是因为虽然他们的名相同,但他们的姓不同。而命名空间就很像这个姓的作用。C ++ 中使用双冒号表达命名空间从属关系,如 std::cin 指的是 std 命名空间中的 cin 函数。如果我再定义一个 std2::cin 那么它与 std::cin 是两个不同的函数。
编译。编译指电脑确认每一行 C++ 代码是否合法的过程。编译顺序是解析 C++ 代码的顺序,这个顺序基本按照代码的行数进行。如上文提到在 C++ 中使用变量需要提前声明,即是指在编译顺序中(C++ 代码顺序)需要将声明语句写在使用语句之前。此处不涉及运行过程,因此如果出现错误通常是语法错误,即为 C++ 的书写规范书写代码。
运行。运行指 C++ 代码在作为程序开始执行功能。运行顺序以主函数 (main函数) 为运行起点,从主函数的第一行代码开始依次执行语句,由于编译过程保证了电脑能够理解每一条代码,因此此处出现的错误通常才是编程者设计代码时出现的逻辑错误。

C++ 基本结构
了解过基本概念后,想要知道如何学习 C++,还需要知道 C++ 代码的基本结构。通常我们可以把一个常见的单文件(针对信奥)的 C++ 代码分为三个代码部分:
全局变量区。在 C++ 中我们通常会将引用头文件、定义全局命名空间(namespace)、定义全局变量这三种语句放在代码的开头。
因为头文件是声明我们在代码中需要使用的函数/变量的文件,将其放在文件开头可以避免使用到相应函数/变量时出现未声明的编译错误。
因为命名空间是 C++ 中区分某些名字(变量名,函数名或者对象名)唯一性的,某些常用且不容易出现重名的名字(如 cin, cout)就会利用 using 语句去全局声明命名空间,表示代码中可以出现该命名空间中的名字且不加前缀。因此该语句通常也放在代码最前面保证全局有效性。
全局变量。为了使全局变量全局有效,我们通常会把其声明尽可能提前,因此也会放在文件开头。
自定义函数/对象区。同样,为了让我们自己定义的函数/对象在主函数中运行时被 C++ 认可,我们通常都会将自定义函数与对象放在主函数之前。(当然也可以只把声明放在这里,把定义延后)
主函数区。为了让代码运行时所有变量/函数/对象都合法,我们通常将主函数放在最后,但这同时也是 C++ 代码的核心。一个 C++ 程序可以没有前面两项代码,但一定要有主函数。

CodeCombat 的C++关卡了解过 C++ 基本结构后我们可以看一看 CodeCombat 的关卡。

CodeCombat 的关卡分左中右三部分,左边是游戏界面,右边是控制游戏界面的代码区,我们通过在代码区书写 C++ 代码来控制左边的游戏运行。中间是知识区,用来介绍每个关卡可能使用到的函数知识点。这样的设计可以使编程者直接看到自己写的代码的运行效果。
为了控制关卡难度,CodeCombat 的代码区只要求(也只能)书写函数定义区与主函数区的代码,同时相对比较复杂的对象定义也并没有支持。我们的核心目标是帮助初学者掌握基本语法,能完成大部分 C++ 代码的书写。以信奥为例,除去极少数需要通过自定义数据结构(如链表,树)才能完成的题目,其他所有信奥习题需要的知识点在 CodeCombat 的闯关中都能学习和训练到。
针对信奥的分析
其实刚刚已经提到一部分,信奥中需要掌握的 C++ 知识除去基本语法外,核心是简单算法的实现,以及小部分指针与数据结构的知识。接下来我们可以一一分析这些知识点。
分号。C++ 以分号作为语句的结束标志。C++ 不区分多余的空格与回车,因此在识别到分号之前一条语句是不会结束的,也就是你可以把一条 C++ 语句写成任意多行,这无关紧要。只有两个例外:以 # 开头的预编译语句,如 #include ,这种语句不需要分号结尾。以 } 结束的语句,如 if, for, while, 以及函数定义,右大括号后可以不需要分号。
声明。开头已经说明过声明的作用,这里再强调一次,每一个自定义的变量名,函数名,对象名都需要提前声明,如果你没有看到提前声明,看看声明在哪一个 #include 语句引入的文件中。
变量与数据类型。C++ 的任何一个变量都需要数据类型,即整数,浮点数(小数),字符,字符串,布尔(真假),以及其他对象(对象也是一种数据类型)。在 CodeCombat 的关卡中我们使用 auto 替代了大部分类型的显式声明,但学习 C++ 不可避开对数据类型的学习,因为 auto 只是简化代码,并没有改变 C++ 的运行方式。
条件语句。C++ 使用形如
if () {}else if () {}else () {}
的代码表示条件分支,注意在这个例子中所有(除去 else if 中的空格)空格和回车都是不必须的,只需要在小括号中写上条件表达式,在大括号中写上逻辑代码即为 C++ 条件语句。
循环语句。C++ 有三种大同小异的循环结构:
while () {}do {} while();for ( ; ; ) {}
分别为按条件循环,先运行一次代码再判断是否循环,指定初始条件和每次循环的变化的循环。三者的循环本质没有什么差异。注意 do while 循环需要在 ) 后补充分号,因为右小括号不能作为语句结束的标志。
函数。C++ 函数在定义时有两处需要数据类型,一个是函数名的前面,一个是参数名的前面,这两者均为指定变量的数据类型,前者是函数返回值的数据类型,后者是参数类型。函数本身没有数据类型的说法。也可将返回值的数据类型理解为函数类型,但这并非标准。函数有一些高级用法,包括参数传值还是传引用,以及嵌套调用与递归,都属于 C++ 高级用法,后文会简单介绍。
对象。对象在信奥中几乎没有应用,数据结构的定义可以使用对象,也可以使用 C 标准的 struct. 由于对象也属于高级知识,此处略去不说。
算法。信奥中常用的算法不算很多,大多是数学方法,需要的是数学理解。程序算法主要有下面几种:
排序。冒泡排序与快速排序是排序算法中比较常用的两种。冒泡排序相对比较简单。快速排序利用了分治的算法思想。
二分查找。二分查找同样是分治思想。在有序数列中可以以中点判断要查找的数字在数列前半部分还是后半部分,从而每次减少一半的查找时间。
递归与回溯。理解递归并不容易,可以从 a 调用 b, b 调用 a 的双向嵌套来理解。而 a 调用 a 自己则相当于 b 只做调用 a 这一件事。这两个算法中的常见例题是汉诺塔与八皇后,信奥特别喜欢考。
动态规划。动态规划实际上也是一个数学算法,核心是找出从一个状态计算下一个状态的递推式。如下题中寻找从 a 到 b 不经过对角线的所有路径数量,只接受右行和上行。

指针。指针的核心是对内存存储数据的理解,一个萝卜一个坑,一个大萝卜两个坑。
数据结构。利用指针代表内存片段就能够理解如何保存指向相同结构的链表节点或者树节点了。
总结
在 CodeCombat ,我们提供了很好的练习平台来训练学生,加深他们对 C++ 绝大部分实用语法的理解。熟练地掌握语法能解决 C++ 中的编译问题,也就相当于解决了一半的代码问题。而实际上 C++ 学习过程中编译问题还不止占错误数量的一半,这些都是 CodeCombat 能很好解决的。因为 CodeCombat 有着所写即所得的游戏,游戏为什么能吸引孩子,因为用键盘或者鼠标的每一个操作都有直观的游戏动作,这是一种很强的控制感,会让孩子觉得自己确实在做什么事。传统的信奥练习以数学题为主,对孩子们来说难以理解使用计算机的意义——因为数学解法往往比编程解法更为快捷,既然课堂上已经学习过数学解法,那么课外再学习编程解法的成就感就会大大降低。但利用编程控制游戏角色就回到了游戏的控制感中,因为每一行代码都有了更丰富的意义,学习的兴趣也就会更强。而一旦对代码有了兴趣,同时又熟悉了基本语法,那么学习算法并实现就是一件如鱼得水的事了。
免费学习步骤:
1.打开网站:CodeCombat官方|信息学奥赛|AI世青赛|编程等级认证
2.点击右上角的注册按钮
3.注册成为学生
4.输入班级码:SickSinkHorse,点击继续
5.输入您的用户名等信息
6.定制自己的英雄
7.注册成功啦,快去玩玩吧~!


IP属地:北京1楼2020-03-10 20:53回复