计算机导论学习记录(二)
这个作业的目标 | <学习内容的系列记录> |
---|---|
这个作业属于哪个课程 | 计算机导论 |
这个作业要求在哪里 | https://www.bilibili.com/video/BV1EW411u7th/?spm_id_from=333.337.search-card.all.click&vd_source=2d58080e4c0c391c5f011713fd8b09b4 |
学习内容的系列记录(二)
一、知识要点(程序设计基础知识)
1、早期的编程方式
- 在早期,计算机没有内存的概念,人们通过打工纸卡等手段将程序输入计算机。
- 早期计算机的编程
- 打孔纸卡/纸带:在纸上打孔,用读卡器读取数据进行编程。
- 插线板:通过插拔线路的方式,改变器件之间的连接方式,进行编程。
- 面板开关:通过拨动面板上的开关,进行编程。输入二进制操作码,按存储按钮,推进至下一个内存位,直至操作完内存,按运行键执行程序。
- 程序和数据都存在一个地方,叫冯诺依曼结构。冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存。
2、编程语言发展史
-
二进制是计算机的母语,计算机只能理解二进制。这叫机器语言或机器码。用自然语言对程序的高层次描述,称为伪代码。然后用操作码表把伪代码转成二进制机器码。
-
汇编器读取用汇编语言写的程序,然后转成机器码。一条汇编指令对应一条机器指令。
-
A-0
- 1950年,为释放超算潜力,葛丽丝·霍普博士,设计了一个高级编程语言,叫 Arithmetic Language Version 0,一行高级编程语言 可以转成几十条二进制指令。但由于当时人们认为,计算机只能做计算,而不能做程序,A-0 未被广泛使用。
- 为了做到编程语言的复杂转换,霍普博士在1952年创造了第一个编译器,专门把高级语言转化为低级语言(比如汇编和机器码)。
-
1957年,IBM1957发布了高级编程语言FORTRAN,平均来说,FORTRAN 写的程序,比等同的手写汇编代码短 20 倍,FORTRAN 编译器会把代码转成机器码。但它只能运行于一种电脑中。
-
1959年,数据系统语言委员会开发了一门高级语言,简称COBOL。每个计算架构需要一个 COBOL 编译器,不管是什么电脑都可以运行相同的代码,得到相同结果。
-
现代编程语言
- 1990年,有LGOL, LISP 和 BASIC 等语言。
- 70年代,有Pascal,C 和 Smalltalk。
- 80年代,有C++,Objective-C 和 Perl。
- 90年代,有Python,Ruby 和 Java。
3、编程原理-语句和函数
- 首先要初始化变量:设置最开始的值。
- 程序的不只要从上到下运行,还要用控制流语句。
- If语句(条件语句):如果X为真,那么执行Y。If语句走那条路,取决于表达式的真假。
- while循环:当while条件为真,那么代码会重复执行。当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。
- for循环:for循环不判断条件,判断次数,会循环特定次数。foe的特点是每次结束,for会加一。
- 函数:为了隐藏复杂度,可以把代码打包成函数。其他程序想用函数,直接写函数名就可以了。
- 最后,我们还需要把结果交给使用这个函数的代码,所以用return语句,旨在返回什么。
4、算法:解决问题的具体步骤
- 算法的输入大小和运行步骤之间的的关系叫做复杂度,表示运行速度的量级。专业名称大O表示法。
- 选择排序:在一列数组中,从第一个数字开始,每个数组位置都跑一边循环,找最小数,然后互换位置。复杂度为O(n2)。
- 归并排序:首先检查数组是否大于一,如果是,就把数组分成两半,最后每个数组大小为一。然后就可以归并了。从前两个数组开始,读值排序合并,重复这个过程,按序排列。然后比较两个数组第一个数,取最小数,重复这个过程,就排好了。复杂度为O(n×logN)。
- Dijkstra算法:
- 一开始复杂度为O(n²),后来复杂度为O(nlog n +I),在下图中,n表示节点数,I表示有几条线。
5、数据结构
- 下标:为了拿出数组中某个值,我们要指定一个下标,大多数编程语言里,数组下标都从 0 开始,用方括号 [ ] 代表访问数组。注意**:很容易混淆 "数组中第 5 个数" 和 "数组下标为 5 的数",数组下标为5的数是数组里面的第6个数。
- 字符串:由字母、数字、标点符号等组成的数组。字符串在内存里以0结尾(二进制0)。
- 矩阵:是数组的数组。如一个3×4矩阵就是一个长度为3的数组。
- 结构体:把几个有关系的变量打包在一起的叫做结构体。
- 节点:以指针为变量的结构体叫节点。
- 指针:指针是一种特殊变量,指向一个内存地址,因此得名。
- 链表:是一种灵活数据结构,能存很多个节点。灵活性是通过每个节点指向下一个节点实现的。
- 队列: 就像邮局排队,谁先来就排前面,这叫先进先出。
- 栈:栈是后进后出。
- 树:在节点中改成多个指针就能做成树。在树中,最高的节点叫做根节点(root),根节点下的所有节点都叫子节点(children),任何子节点的指数上层节点叫母节点(parent node),树结束的地方叫叶节点。
6、阿兰 图灵
- 可判定性问题:是否存在一种算法,输入正式逻辑语句 输出准确的是或否答案?
- 美国数学家阿隆佐·丘奇,开发了一个叫Lambda算子的数学表达系统,证明可判定性问题不存在。
- 图灵机:只要有足够的规则,状态和纸带,图灵机可以解决一切计算问题。和图灵机一样完备,叫做图灵完备。
- 停机问题证明图灵机不能解决所有问题。
- 图灵测试:向人和机器同时发信息,收到的回答无法判断哪个是人,哪个是计算机,则计算机达到了智能程度。
7、软件工程
-
对象:当任务庞大,函数太多,我们需要把函数打包成层级,把相关代码都放一起,打包成对象。对象可以包括其他对象,函数和变量。把函数打包成对象的思想叫做面向对象编程,面向对象的核心是隐藏复杂度,选择性的公布功能。
-
API:API帮助不同程序员合作,不用知道具体细节,只要知道怎么使用就行了·。当团队接收到子团队编写的对象时,需要文档和程序编程接口来帮助合作。API控制哪些函数和数据让外部访问,哪些仅供内部。
-
集成开发环境(IDE):软件开发工具里集成了很多有用的功能,帮助写代码,整理,编译和测代码,因为集成了所有东西,所以叫IDE。DE帮你检查错误,并提供信息,帮你解决问题,这个过程叫调试(debug)。
-
文档与注释:文档一般放在一个叫做README的文件里,文档也可以直接写成注释,放在源代码里,注释是标记过的一段文字,编译代码时,注释会被忽略。注释的唯一作用是帮助开发者理解代码。
-
源代码管理(版本控制):大型软件公司会把会把代码放到一个中心服务器上,叫代码仓库,程序员可以把想修改的代码借出,修改后再提交回代码仓库。版本控制可以跟踪所有变化,如果发现bug,全部或部分代码,可以回滚到之前的稳定版。
-
质量保证测试(QA):找bug
-
beta版:接近完成的软件,相当于游戏里的测试服。
2、学习心得
- 从这期内容来看,对用计算机来如何做软件有了大致的认识,函数,语句,算法,数据结构等等。
- 一个软件需要很多程序员互相配合才能完成。