突破信息奥赛生的天花板
一份合格的代码应该是怎么样的?
转载自 https://mp.weixin.qq.com/s?__biz=MzIwMzcxMTY4OQ==&mid=2247485213&idx=1&sn=cb5b09a977ffb2d2c83cae128ca1fdc5&chksm=96ca72bba1bdfbad02766c2c0403feb00d10a1b7e46a3721a8eafa1070ee81be0a71f47035da&mpshare=1&scene=23&srcid=0704KtET5ePmicTo4wnoKbi4&sharer_sharetime=1688438346254&sharer_shareid=250c7aecc8713bc61b5879e10802c7e6#rd。
大家好,这里是小周老师。
今天本来想写个短一点的,主要是来发个给家长在线答疑的时间。
而且,今天也是明确来招生的,所以写太长不是我的本意。
可是呢,偏就碰到了个有趣的事情。
所以,招生归招生,还是放点有趣的事情来分享。
在开始之前,先帮您规划一下阅读方式。
如果您是:
- 已经和我们接触过好几次的家长,目前还没有加入小周老师的奥赛队的,建议从头到尾读完。
- 关注这个公众号的家长,但在别的机构交了钱了,也不知道能不能退, 那也建议从头到尾读完。
- 特别关注信息学奥赛,上过或者没上过奥数两可,就想知道什么时候入坑信奥最合适,同样,建议从头到尾读完。
- 其他类型,那可以看省流,直接跃迁到最后一节。觉得合适,扫码联系我们。
省流:
- 赛季?就在期末考试之后!
- 小周老师奥赛队有何不同?
- 什么叫做名师?
- 十条秘籍
- 名师的考前讲座!
最近真是比较多产,这都是最近的第四篇公众号了。
原因其实也简单,那就是,马上初中联赛的赛季就开始了。
1- 赛季?就在期末考试之后!
所谓赛季的概念,就是时间安排,精确到天。
赛季开始的时刻,基本上就是7月8号的这个周末。
对于新人,就只有两种剧本:
A- 零基础起步。
既然是零基础,那就说明,只要差一天的课,六小时,那就跟不上了,所以就只能等暑假末或者秋季的另一次零基础;
如此一来,9月份的初中联赛的初赛,就算是一定打水漂了。为什么说一定呢? 是因为一个暑假过去了,甚至都不知道cout是干什么用的,这样的知识储备水平,不论是考什么,都只能蒙。
一定过不了。
同时,从另一个角度上来说,暑假是最能磨练新晋奥赛生的意志品质的时期。经过了暑假的集训,从强度上就一定能适应后面展开的每周的信息奥赛学习;同时,对于马上9月份到来的初中联赛的初赛,在心理上也有所准备。
B- 初赛夯实。
在初赛的战前准备上,中途插班显然可行性比较低。因为初赛的知识密度过大,差一天的课,听起来就费劲,更别说中间差个5天空降了。
到了9月份,差一分不过,就是5个小时的学习时间不到位。
而这五小时,绝不是考前熬夜两天一天两个半点儿弄出来的。这一定是平时每天的积累:每天多花30分钟做题,5个小时,是10天。算上一周工作5天,这就是两周。
基本上,这个时间线,就对了吧。
所以,等过了7月8号,小周老师的公众号就又要歇着了。
写了也没啥用了,赛季都已经开始了。
而且,赛季开始之后,就算是我想写,也没时间。
每天带奥赛,忙死了。
///
如果要用一个复句来说,那就是,
垃圾机构拖一个月的课,小周老师一次课完。
///
2- 小周老师奥赛队有什么不同?
如果用短语,那就是:
成绩好。
如果再用一个,那就是:
老师强。
所以小周老师不好约,是有原因的。
但这些,都太抽象了,是不是?
先说第一个短语好了,什么叫做,“成绩好”?
这个其实蛮好形容:
高中联赛一等奖几十个;
初中联赛一等奖几十个;
NOI国赛金牌,差不多到今年就有了。
NOI国赛银牌,三枚。
APIO银牌,三枚。
NOI全国冬令营铜牌一大把。
提高组初赛通过率,95%+
普及组初赛通过率,70%+
其实这些成绩,和新人家长们,都没啥关系。
新人家长就关心一件事:
我家的孩子,到底适合不适合学奥赛?
这件事儿,我说过了,你去问不咋样的机构,那就是与虎谋皮,绝对得不到答案。
本来不咋样的机构的老师质量就不咋样,您再问他这种有可能让您决定不在他这里学信奥的问题,这就好比您问:
我可以给您一万块钱,但现在我打算拿走,您觉得靠谱么?
他肯定觉得不靠谱。
所以,这就涉及到第二个短语: 老师强。
你去问名师,才有可能听到一个比较靠谱的评估。
比如小周老师。
原因非常自洽:
名师没时间和学不出来的孩子瞎耗着。
不差这个学费,差这个时间。
单位的时间,要产出单位的成果才行。
名师见得孩子也多了,稍微一问就能知道孩子的水平。
光说名师,就太抽象了,虽说小周老师的亲师哥是图灵奖,隔壁系的师姐是诺贝尔奖,师叔祖是居里夫妇吧,但这并不代表所有小周老师的同学,都能是名师。
学术和教育背景,和教学经验,这是两个件事儿。
所以,这就有了下一个有趣的实例。
3- 啥叫名师
回答这个问题之前,我们可以先想一下,什么叫做名医?
名医就是,稍微问一下病人的症状,略加观察,就知道什么问题,药到病除。
名师就是,连问都不用问,就知道您家孩子程序写的什么样,有什么问题。
至少小周老师的标准上,名师得是这样才行。
恰好,前几天有位家长,家里的娃算是有些基础,想要提升,通过朋友介绍,找到了我。
大致了解了一下情况之后,提出了一个疑虑:
您的要求看来挺严的,那是不是,娃要是和您学,得从头开始?
小周老师就乐了。
看来又是一个不信邪的家长。
于是,小周老师就这样和家长预测了一下:
这样吧,您可以发个他的程序给我看。
在我看程序之前,我可以预测一下大致写成什么样子:
- 有万能头文件
- 用C语言的格式
- 用scanf 或者/和 printf来读输入输出
- 用cin,大部分都用cin
- 如果用fin,如果用c++,用的就是freopen,不是ifstream
- 全部程序都在main里面,只有万不得已,才会写方法(函数)
- 命名一定是a,b,c
- 变量一定不会初始化
- 数据结构一定用的是静态数组而不是动态数组
我在微信里说,倒是不用从头开始学,但是,习惯不好,肯定有天花板。
小周老师: 那倒是不用,知识不会有大错,习惯一定是差的。
小周老师: 我预测好了,您随便发一个他平时的作业。
小周老师: 习惯差对于绝顶聪明的学生来说,影响有,但不会太大;习惯差对于一般聪明的学生来说,基本上就是盖上一个天花板。
小周老师: 所以这不是我个人喜好的问题。
小周老师: 您既然找过来了,就是我以前的家长推荐来的。一般来说,都是咨询老师来负责和家长对话。
小周老师: 我只负责和开始上课的家长对话。
小周老师: 看完程序之后,我再和您说一下价格,如果差不多在预算内,我就推咨询老师给您;如果不是,那也给您指出了潜在的问题,算是结个善缘。
然后,过了一会儿,这位家长就发来了程序。
(在新窗口查看)
于是,小周老师就标注了一下:
(在新窗口查看)
4- 十条秘籍
我来逐步注释一下:
1- 不要用万能头文件 (第一个错)
为什么不要用? 那我问问,初中高中数学考试,或者高考,为什么不让用计算器?
因为要考察的是计算。
这里是一样的:信奥考察的是对各个库的理解程度,以及之后衍生出来的灵活应用能力。
如果依赖万能头文件,是能少写一些程序,但最后,自己用了什么C++中的库,完全不知道。
这就任何体育项目(不管是脑力还是体力)中的训练,完全相悖。
2- 用C语言的格式
明明用的是C++,偏喜欢用C的格式,这就属于返祖。
这也说明,老师根本不会C++。
在这个例子中,这位同学还真不错,写得正经就是C++。
3- 同2, 是C的输入输出,略过
4- 用cin (第二个错)
cin是在console端读数据。
但为什么不要用cin?
简单,我给你一个长达100个字符的0和1的数列,来吧,手算吧。
行么?
别说100个了,就是10个字符,手动输入,也有误差的可能。
所以,当然不要用cin来手动输入。
肯定是读文件。
而且,真正参加初中联赛的复赛的时候,考试系统用的是cin判卷子吗?
当然不是cin,是文件读写。
所以再次的,当然不要用cin。
5- 这个和提高组的代码执行效率有关,就不介绍了,略过
6- 全部程序都在main里面,不到万不得已,一定不用函数(第三个错)
这是个三本出来的根本没有正经写过一行软件的小师傅的一个通病。
那就是把所有程序堆在main也就是程序入口里面。
能不能运行?
能运行。
容不容易错?
很容易错。
好不好纠错?
极难纠错。
我们游戏软件行业有个真实的笑话。
有个游戏开发团队,程序员跑路了。所以主策划就提刀上马开始自学程序。
但这个主策划是学中文毕业的,根本不是科班出身。
偏偏他又绝顶聪明,于是,他就把整个游戏都写在了main里面。
大概是二三十万行程序。
他也没觉得有啥问题。
游戏也确实能跑。
后来这个游戏上线之后,被好事者给反编译了,一看里面程序,当时就吓绿了!
反手就把程序截图发在论坛上了。
惊恐地说,“他们!竟然!全部!写在!MAIN里!!!!”
结果引来一大堆猎奇的玩家来围观。
到最后,销量确实出乎意料得不错。
其实,大家围观就是一件事儿:你是怎么把整个游戏写在程序入口的?
这就好像有人说要起个100层的高楼,然后用牙签搭了一个。
大家于是都来参观。
到今天,说起这个事儿,大家还是当成笑话说,而不是说这位游戏开发者如何力挽狂澜。
所以,不要把程序都写在main里面,丢人,
这是个基本要求。
7- 命名一定是abc(第四个错)
这应该是谭浩强老师傅的锅。
这位老先生我就不介绍了,基本上是在误人子弟上,走上了一条不归路。
在任何成熟或者半成熟的软件公司中,都绝对不允许a,b,c这样的命名。
为的,就是程序可读性。
程序可读性,是在危难时刻,能够拯救考场上的奥赛生的重要品质。
只可惜,三本小师傅们,听都没听说过这件事。
8- 变量一定不初始化 (第五个错)
在C++里面,全局变量不初始化还有个初值,局部变量不初始化,那,用的时候一定会是个随机值。
如果觉得不初始化,值也一定是0的话,那就大错特错了。
这种属于,高危险度的动作。
堪比过马路不看红绿灯。
对,就这种危险度。
9- 数据结构一定是静态数组不是动态数组 (第六个问题【不算是错】)
静态数组一般在初中联赛的范畴,完全是可以被更稳定,更不容易错,但稍微用起来有点麻烦的动态数组替代的。
但有些三本师傅,他们学的时候,就学的是遗臭万年的谭浩强老师傅的C语言设计,完全就没这根可以用STL库中的动态数组的弦儿,于是,很自然的,他们教出来的学生,也不知道有这么个东西可以用。
用动态数组不会出现插入数据的时候的数组越界啊,小朋友。
就初中联赛这么点儿运算量,动态数组比静态数组多浪费的这些腾挪数据的时间,完全就是可以忽略不计的。
真正需要用到静态数组,是DP,是哈希。
不是平时做的这种小破题。
所以,这虽然不算是个错,但是个潜在风险。
10- 能不加大括号,就不加(第七个错)
这个其实我是没想写,虽然我知道一定会有。
只不过当时写的时候,从1到9,凑9个,就没写。
不写大括号,这依然还是C语言的遗毒。
这都2023了,也都是学的C++,能不能把一些遗老遗少的东西,收拾收拾扔掉?
///
所以,一共我预测了9条,里面关于C++非常糟糕的编码习惯的预测...
100%全中。
所以这就叫做名师。
这样,就不抽象了吧?
5- 名师的考前讲座!
因为赛季马上开始了,所以真心是没有太多时间一一照顾各位想要咨询的家长。
那么,考前的唯一的一次的小周老师考前讲座,就安排在:
7月5号北京时间晚上8点
具体细节,您得扫码联系我们的咨询老师。
就算您有我的微信,也别找我。
真的,我不负责咨询。
就算是我愿意跟大家结个善缘,也真心没有时间一一接待和解答问题。
如果有问题,就一起问,我一起答。
不见不散哟!
扫描二维码咨询信息学奥赛
(图片)
扫码关注小周老师的信息奥赛公众号
(图片)
点击链接进入有趣的解密
(https://www.luogu.com.cn/paste/lu8p1tji)