(。・∀・)ノ゙嗨,欢迎阅读计算机科学速成课!

上集讲到用机器码写程序,还要处理那么多底层细节对写大型程序是个巨大障碍。为了脱离底层细节,开发了编程语言,让程序员专心解决问题,不用管硬件细节。今天我们讨论大多数编程语言都有的基本元素,就像口语一样,编程语言有"语句",语句表达单个完整思想,比如"我想要茶"或者"在下雨"。用不同词汇可以代表不同含义比如"我想要茶"变成"我想要独角兽",但没法把"我想要茶"改成"我想要雨"语法毫无意义,规定句子结构的一系列规则叫语法。

英语有语法,所有编程语言也都有语法,a=5是一个编程语言语句,意思是创建一个叫a的变量,把数字5放里面,这叫"赋值语句",把一个值赋给一个变量。为了表达更复杂的含义,需要更多语句,比如a=5b=10c=a+b,意思是,变量a设为5,变量b设为10。把a和b加起来,把结果15放进变量c,注意,变量名可以随意取,除了abc,也可以叫苹果、梨、水果。计算机不在乎你取什么名,只要不重名就行,当然取名最好还是有点意义,方便别人读懂

程序由一个个指令组成,有点像菜谱:,烧水、加面,等10分钟,捞出来就可以吃了,程序也是这样,从第一条语句开始,一句一句运行到结尾。刚才我们只是把两个数字加在一起,无聊,我们来做一款游戏吧,当然,现在这个学习阶段来编写一整个游戏还太早了,所以我们只写一小段一小段的代码,来讲解一些基础知识。

假设我们在写一款老派街机游戏:GraceHopper拍虫子,阻止虫子飞进计算机造成故障,关卡越高,虫子越多。Grace要在虫子损坏继电器之前抓住虫子,好消息是她有几个备用继电器,开始编写时,我们需要一些值来保存游戏数据。比如当前关卡数、分数、剩余虫子数、,Grace还剩几个备用继电器。所以我们要"初始化"变量"初始化"的意思是设置最开始的值,关卡=1分数=0虫子数=5备用继电器=4玩家名=Andre。为了做成交互式游戏,程序的执行顺序要更灵活,不只是从上到下执行,因此用"控制流语句"。

控制流语句有好几种,最常见的是if语句,可以想成是"如果X为真,那么执行Y",用英语举例就是"如果累了就去喝茶"。如果"累了"为真,就去喝茶,如果"累了"为假,就不喝茶,if语句就像岔路口,走哪条路取决于"表达式"的真假,因此这些表达式又叫"条件语句"。在大多数编程语言中,if语句看起来像这样:if[条件]then[一些代码],结束if语句。比如,if[第一关],then[分数设为0]因为玩家才刚开始游戏,同时把虫子数设为1,让游戏简单些,注意依赖于if条件的代码,要放在IF和ENDIF之间。

当然,条件表达式可以改成别的,比如:,"分数>10"或者"虫子数<1",if还可以和else结合使用条件为假会执行else里的代码。如果不是第1关,else里的指令就会被执行,Grace要抓的虫子数,是当前关卡数*3。所以第2关有6个虫子,第3关有9个虫子,以此类推,else中没有改分数,所以Grace的分数不会变。这里列了一些热门编程语言if then else的具体语法,具体语法略有不同,但主体结构一样。if语句根据条件执行一次,如果希望根据条件执行多次,需要"条件循环",比如while语句,也叫"while循环"。当while条件为真,代码会重复执行,不管是哪种编程语言,结构都是这样,假设到达一定分数会冒出一个同事,给Grace补充继电器,棒极了!

把继电器补满到最大数4个我们可以用while语句来做,来过一遍代码,假设同事入场时,Grace只剩一个继电器。当执行while循环,第一件事是检查条件,继电器数量<4?,继电器数量现在是1,所以是真,进入循环!碰到这一行:继电器数量=继电器数量+1,看起来有点怪,变量的赋值用到了自己,我们讲下这个,总是从等号右边开始,"继电器数量+1"是多少?

当前值是1,所以1+1=2,结果存到"继电器数量",覆盖旧的值,所以现在继电器数量是2
,现在到了结尾,跳回开始点。和之前一样,先判断条件,看要不要进入循环,继电器数量<4?是,继电器数量是2,所以再次进入循环!3存入"继电器数量",回到开头,3<4?是! 进入循环,4存入"继电器数量",回到开头,不!

现在条件为假,退出循环,执行后面的代码,while循环就是这样运作的! 另一种常见的叫"for循环",不判断条件,判断次数,会循环特定次数,看起来像上图。现在放些真正的值进去,上图例子会循环10次,因为设了变量i,从1开始,一直到10。for的特点是,每次结束,i会+1,当i等于10,就知道循环了10次,然后退出,我们可以用任何数字,104210亿。假设每关结束后给玩家一些奖励分,奖励分多少取决于继电器剩余数量,随着难度增加,剩下继电器会越来越难。因此奖励分会根据当前关卡数,指数级增长,我们要写一小段代码来算指数。指数是一个数乘自己,乘特定次数,用循环来实现简直完美!

首先,创建一个叫"奖励分"的新变量,设为1(看上图),然后for循环,从1到[当前关卡数],[奖励分]x[继电器剩余数],结果存入[奖励分]。比如继电器数是2,关卡数是3,for会循环3次,奖励分会乘,继电器数量x继电器数量x继电器数量,也就是1×2×2×2,奖励分是8,2的3次方。这个指数代码很实用,其他地方可能会用到,如果每次想用就复制粘贴,会很麻烦,每次都要改变量名。如果代码发现问题,要补漏洞时要把每一个复制黏贴过的地方都找出来改,而且会让代码更难懂,少即是多!

我们想要某种方法,把代码"打包"可以直接使用,得出结果,不用管内部复杂度,这又提升了一层抽象!为了隐藏复杂度,可以把代码打包成"函数",也叫"方法"或"子程序"(有些编程语言这么叫)其他地方想用这个函数,直接写函数名就可以了,现在我们把指数代码变成函数第一步,取名,叫什么都行,比如"快乐独角兽"。但因为是算指数直接叫"指数"合适一些,还有,与其用特定变量名,比如"继电器"和"关卡数",用更通用的名字,比如底数(Base)和指数(Exp)Base和Exp的初始值需要外部传入,剩余代码和之前一样,现在完成了,有函数名和新变量名。最后我们还需要把结果交给使用这个函数的代码,所以用RETURN语句,指明返回什么,完整版代码是这样。

现在可以随意用这个函数,只需要写出名字然后传入2个数字就可以了,如果要算2的44次方,写exponent(244) 结果是18万亿左右,幕后原理是,2和44存进Base和Exp,跑循环,然后返回结果。我们来用这个新函数算奖励分,首先,奖励分初始化为0,然后用if语句,看剩不剩继电器(看上图的>0)如果还剩,用指数函数,传入[继电器数]和[关卡数],它会算[继电器数]的[关卡数]次方存入奖励分,这段算奖励分的代码,之后可能还会用,也打包成一个函数。没错,这个函数(CalcBonus)会调用另一个函数(Exponent) 还有!这个CalcBonus函数,可以用在其他更复杂的函数,我们来写一个函数每一关结束后都会调用

叫LevelFinished(关卡结束),需要传入[剩余继电器数][关卡数][当前分],这些数据必须传入。里面用CalcBonus算奖励分,并加进总分,还有,如果当前分>游戏最高分,把新高分和玩家名存起来,现在代码变得蛮"花哨"了。函数调函数调函数,我们写这样一行代码时,复杂度都隐藏起来了,不需要知道内部的循环和变量,只知道结果会像魔术一样返回,总分53。但是这不是魔术,是抽象的力量。如果你理解了这个例子,就明白了函数的强大之处,和现代编程的核心,比如浏览器这样的复杂程序,用一长串语句来写是不可能的。会有几百万行代码,没人能理解,所以现代软件由上千个函数组成,每个负责不同的事。

如今超过100行代码的函数很少见,如果多于100行,应该有东西可以拆出来做成一个函数。模块化编程不仅可以让单个程序员独立制作App,也让团队协作可以写更大型的程序,不同程序员写不同函数,只需要确保自己的代码工作正常,把所有人的拼起来,整个程序也应该能正常运作!现实中,程序员不会浪费时间写指数函数这种东西,现代编程语言有很多预先写好的函数集合,叫"库",由专业人员编写,不仅效率高,而且经过了仔细检查。几乎做所有事情都有库,网络、图像、声音,我们之后会讲这些主题,但在此之前,我们先讲算法,好奇吗?你应该才是!

【计算机科学速成课】[40集全/文字版] - 12.编程原理-语句和函数相关推荐

  1. 【计算机科学速成课】[40集全/文字版] - 15.阿兰·图灵

    (。・∀・)ノ゙嗨,欢迎阅读计算机科学速成课! 前几集我们聊了基础,比如函数,算法和数据结构,今天,我们来看一位对计算机理论贡献巨大的人,计算机科学之父,长得不怎么像本尼的阿兰·图灵.阿兰·马蒂森·图 ...

  2. 【计算机科学速成课】[40集全/文字版] - 20.文件系统

    (。・∀・)ノ゙嗨,欢迎阅读计算机科学速成课! 上集我们讲了数据存储,磁带和硬盘这样的技术,可以在断电状态长时间存上万亿个位,非常合适存一整块有关系的数据,或者说"文件".你肯定见 ...

  3. 【计算机科学速成课】[40集全/文字版] - 1.计算机的早期历史

    Hello,World! 欢迎阅读计算机科学速成课! 在这个系列中,我们会学习Bits(位).Bytes(字节).晶体管.逻辑门,一直到操作系统,虚拟现实和机器人! 我们要学很多东西,但预先说明:我们 ...

  4. 【计算机科学速成课】[40集全/文字版] - 9.高级CPU设计

    (。・∀・)ノ゙嗨,欢迎阅读计算机科学速成课! 随着本系列进展,我们知道计算机进步巨大,从1秒1次运算,到现在有千赫甚至兆赫的CPU.你现在看视频的设备八成也有GHz速度,1秒十亿条指令,这是很大的计 ...

  5. 20210301计算机科学速成课40集(34-35)

    机器学习Machine Learning&人工智能AI,Artificial Intelligence:机器学习算法让计算机可以从数据中学习,然后自行做出预测和决定.(1)分类Classifi ...

  6. 计算机科学速成课 Crash Course Computer Science 笔记(摘要形式)

    Crash Course Computer Science总共40节课,架构式地详细介绍了计算机从底层到顶层的构造和新的技术,一节课十分钟左右,可让小白在很短时间内产生对计算机的总体理解 本文是听课后 ...

  7. 计算机科学速成课】[40集全/精校] - Crash Course Computer Science

    计算机科学速成课][40集全/精校] - Crash Course Computer Science Transistor have two electrodes separated by a mat ...

  8. 计算机科学速成课 Crash Course Computer Science 第三十集 万维网 The World Wide Web

    GitHub链接:https://github.com/WilliamWuLH/My-notes-about-CCCS 如果你觉得不错可以 ⭐Star 和 Fork ❤ 计算机科学速成课 Crash ...

  9. @程序员,这份 2 万人收藏的计算机科学速成课速码!

    整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 作为一枚程序员,很多人可能都不太能清晰地说出计算机发展脉络,要想成为优秀的程序员,只会编程是不够的."读史使人明智&qu ...

最新文章

  1. 好程序员HTML5大前端分享常用开发工具大集合
  2. 1.1.2 标准化工作及相关组织
  3. java有没有求组合的函数_如何在Java 8中使用compose和andThen组合函数
  4. 对象之function
  5. pycharm无法识别css,PyCharm中HTML页面CSS class名称自动完成功能失效的问题
  6. ffmpeg 命令过滤器裁剪
  7. C++——OOP(Object-Oriented Programming) vs. GP(Generic Programming)
  8. 2019福布斯中国富豪榜发布:马云蝉联榜首 王健林排名跌至第14位
  9. 深入C++面试题总结
  10. python下载网页中的pdf文件_Python读取网页上的pdf文件,输出字符串
  11. 使用驱动器h中的光盘之前需要将其格式化怎么办_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...
  12. Unity 游戏中近战攻击判定检测——射线检测
  13. 【院士等重磅嘉宾齐聚珠海】第二届人工智能与工业设计国际会议 (AIID 2022)
  14. Kafak入门第三课:kafka数据格式及各版本占用的空间大小对比
  15. 22fall HKU港大CS 笔试+面试回忆
  16. 转:2013年各大小IT公司待遇,绝对真实,一线数据!
  17. sketch web组件_在Sketch中设计受VSCO启发的Web Journal
  18. mp4box-h264-ftyp-moov-mvhd-thkd-avcC-sps-pps 详解
  19. [学习经验] 考研经验略谈
  20. 直流电机单闭环调速matlab仿真,单闭环直流电机调速Simulink仿真

热门文章

  1. android 设置繁体环境,Android更改中文和繁体中文的区域设置无法正常工作
  2. jq中添加和去掉class类
  3. 2018 Multi-University Training Contest 4__全部题解+标程
  4. 小程序request接口的封装
  5. MongoDB数据库修改数据库和集合名称
  6. C++学习的方法以及四大名著(荐)
  7. C++-proto文件
  8. c/c++ sizeof(数组名) 的解析 sizeof如何计算数组大小
  9. 互联网、网络安全技术
  10. 全网最全技术电子书免费发放