⼀⽂看懂扣哒世界CodeCombat信息学奥赛体系C++(⼲货超
多,免费学习)
CoCo来信
扣哒世界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.打开⽹站:koudashijie
2.点击右上⾓的注册按钮
3.注册成为学⽣
4.输⼊班级码:SickSinkHorse,点击继续
5.输⼊您的⽤户名等信息
6.定制⾃⼰的英雄
7.注册成功啦,快去玩玩吧~!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论