程序设计与算法基础

目录:

一,计算机为什么能够实现计算;

二,第二讲:

三,第三讲:程序运行的基本原理

参考资料:

说明:学习笔记;


CPU公顷桑:AMD、英特尔、IBM

世界超级计算机排名:www.top500.org

绿色计算的课题:Google一下所消耗的电量:11瓦的灯泡亮1个小时;/可以煮熟一杯咖啡;》新型计算:云计算;

未来的计算:从摩尔定律到量子计算机;

李戈:[email protected]


摩尔定律/规律:1965年提出;

主流的结论:摩尔定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍

摩尔定律还能坚持多久/挑战?

1,散热:单位面积晶体管的密度和速度的提高,芯片会产生更多的电力,产生更多的热能;

2,晶体管的代销显示:晶体管不断变小,小到一个与那紫那么大就没办法了;

3,晶体管变小,电泄漏的情形增加;

芯片做大一点,需要的电压就会越高,是不能扩大芯片的体积的原因之一;


摩尔定律失效之后怎么办/寻找创造全新的计算理论和计算模式?

量子计算机的原理:利用量子体系实现通用计算;

量子计算机的进展相对较快;

使用传统计算机进行对量子进行分析计算(使用传统的计算机对量子世界进行量子现象的模拟和分析),远远不能满足需求;

功能与创痛计算机的区别是指数级的;

量子计算机存在的困难:

1,量子的计算:与外界环境隔离才能保持良好的相干性;

2,量子计算机的制造:与外界环境良好的耦合才能控制演化并读出结果;

1000个量子比特就相当于目前(传统)计算机计算能力(有14亿个晶体管);

当前量子计算机的成果:

首台可编程通用量子计算机,2个量子比特;需要绝对零度的环境;

Opportunity:Leading in a  Changing World;

第一讲:计算机为什么能够实现计算;

第二讲:


带三讲:程序运行的基本原理

什么是存储程序式计算机?它都包含哪些部分?

命令是什么样子?它是怎么被执行的?

程序是什么样子?跟命令一样吗?计算机怎么能认识程序,并执行程序的?


存储程序式计算机

存储器:

衡量存储能力大小;

程序能够控制的最小单位:1字节/B;

存储空间的单位:bit,Byte,KB,MB,GB,TB,PB,YB;

存储器的原理是什么?为什么能够 存住 数据?

存储器的种类有哪些?DDR什么意思?

为什么32位的CPU最多只能配备4G内存?》寻址空间只有那么大;

命令的执行;

程序解决了什么问题?

CPU能执行那些程序,怎么执行的?

指令集:

CPU中用来计算和控制计算机系统的一套指令集合;

CPU只能执行指令集里的指令;

CPU设计的时候就预先定义好了;是CPU性能的重要标志;

指令:

都是二进制码,包含指令码(说明要做的动作)和操作数(指要操作的数或地址,可以有一个、多个或没有操作数);

把你的指令转换成 满足指令集要求的二进制码,才能在计算机上运行,然后才能在CPU上执行;

CPU中指令的执行:

工作方式:

运算器(ALU):专门执行算数和逻辑运算的数字电路;

寄存器:暂存信息;

控制器:程序计数器PC:存放下一条指令的地址;指令寄存器IR:存放当前正在执行的指令;地址寄存器MAR:存放要访问的主存地址;

程序的执行:

程序和汇编代码都是CPU不能理解的;

程序》编译》转换成汇编代码》转换成机器码》CPU运行;

代码区:

数据区:

控制区:逐条执行程序;

运算区:

输入、输出;

程序必须经过编译才能转换成CPU所能接受的指令;

一句程序可能转换为多条语句;

在控制器的协调下连续,依次执行相关的指令;

程序的执行过程是在内存中完成的;

程序在执行过程中,在内存中的不同区域,存放代码和相关的数据

小节:

1,计算机是能用电路进行计算的!

数》二进制数》都可以用布尔运算来算》都能用电路实现;

2,CPU是制造号的电路,它能完成指令集里的运算!

指令是二进制的码,CPU能看懂,并执行它;

3,想要让CPU按照我们的想法做事情,我们应该:

把我们想要租的事情写出来(某种计算机语言);

把这个写出来的东西,翻译成CPU能看懂的二级制指令;CPU就会按照我们的想法去运行;


C++的学习方法论:

1,训练得技能;

2,抓大放小(对提高编程水平有用的东西);

3,多练简单题,由模仿开始,抄程序;

4,选一本薄书作参考;


感性认识C++程序

本质为C程序,C是C++的一部分;

程序:你告诉计算机的话;编程序的方式代替插线的事情,告诉计算机做什么,怎么做;




什么是程序

如何创造一门 程序设计语言?

1,写什么样的词计算机才能明白,是不是什么样的词都能明白?

编程语言定义了一些特殊的“特殊的关键字”,计算机只能明白这些“词”的含义;C++里能够认识到 关键词 只有有限的35个,都有特殊的含义;以少量的“词”来定义可能用到的更多的词;

2,是不是什么样的数和计算符计算机都能明白?

计算机只能看懂某些类型的数据,这些“数据的类型”和相应的“操作符号”也是定义好的;

3,世界上需要“程序表达的逻辑”去做的事纷繁复杂,程序设计语言里面得有多少种“句式”才能够够用?

三种:顺序语句、循环语句(for)、分支语句(if);

1966年被证明这三个句式是够的;

三种语句



顺序语句
分支语句


循环语句

期刊:Communication of the ACM

小节:

C++编程语言:30几个关键字 + (十几种基本数据类型 + 30几个运算符) +  三种基本的逻辑语句; 



数据类型
运算种类


只要你客观的观察这个世界,你就会发现他是如此的简单,以至于像我们所想象的那样,正因为如此,我们的思考才有价值!



程序中的“套话”(引导执行程序+结束);

定义变量并给与初始值,形成习惯;

顺序结构:

int a = 0;

Cunt << “请输入一个数” << endl

cin >> a //键盘输入值给a;

Cunt << a << endl

Cunt::输出;

<< “” :必须为双引号;

分支结构:

循环结构:

char :只能放一个字符,单引号;

char =  ‘A’;

常用的结构:

数组;

注释,缩进:复杂的程序易读、可读性;

break:循环结束;

什么样的程序是好程序?

重视:

程序正确,解决了问题;

程序容易看懂;易于看懂的程序才会被维护下去,才会有生命力;

程序结构清楚,更美;

不重视:变量数目,行数,运行快慢;

积少成多!

IDE安装(都有免费版本):

Windows环境下:

Visual Studio;

Eclip :支持多种语言,跨平台;

NetBeans:

调试:http://open.163.com/movie/2018/11/T/8/MDVKV3H5A_ME04JM7T8.html;

《计算导论A》课程 程序设计部分

从现实问题到计算机程序

李戈

有了解决方案之后才会有程序;

问题》找到解决方案》写成程序》计算机执行;


1,在没有想到解决方案的时候,不要急着动手写程序;(急着写程序,会导致你找不到擦混高新兴的解决方案;改来改去的写程序,会造成程序的混乱,引入更多的错误;)

2,在结构化程序设计中,总是按照先粗后细,先抽象后具体 的办法,对所描述的解决方案,进行穷尽分解,直到分解为顺序,分支,循环三种结构;

3,可以先用 建模工具 建立框架,实现框架之后再填充;

Guanhu C程序设计语言学习进度:

课程内容:感性认识》理性认识》函数》指针等;

作业练习:初级阶段联系 》 正常联系;

为什么叫“C”语言?因效率高被称为高级语言(相对机器语言,汇编语言来说);

计算机的发展史上,贝尔实验室做出了重大的贡献;

关于语言:A语言》B语言》C语言;

1954年-1956年,第一门高级程序设计语言:FORTRAN,特别适合做数学计算;

1960年1月,Alan J.Perlis 在巴黎的软件专家讨论会上发表了“算法语言Algo 60报告”,宣告了长须设计语言的Algo 60 的诞生,标志着计算科学的诞生,是计算科学的里程碑,简称:A 语言;

1970年,贝尔实验室的 Ken Thompson 为了写一个游戏发现没有操作系统,写一个操作系统发现没有好用的语言,所以在A语言的基础上创造了 B 语言,然后写了一个操作系统,这个操作系统的名字叫做:UNIX,UNIX在计算机操作系统发展史上,具有不可撼动的位置,是当时甚至是现在,最先进的操作系统之一;

1972-1973 年的时候,贝尔实验室的另一个人Dennis Ritchie 和  Ken Thompson  在B语言的基础上发展和完善出C语言,并在C语言的基础上重写了 UNIX;

留有大胡子的程序员写出系统都会被流行;



目前为止,C语言的国际版本最新版本:C11,此标准下载需付钱,但可以搜索免费版;

C++ 语言的国际版本最新版本:C++2011(正文1180页);

C语言规范和C++语言规范是两个不同的规范,是相互独立的,C++包含了C 的所有的特性;

本次课程:才C++的环境中,学习C语言;


C版本版本





学习一门的程序设计语言怎么学(学习攻略)?

语言的种类千差万别,但是一般来说,基本成分不外四种(所有的程序设计语言,关注这4个部分就够了——计算机科学技术百科全书):

数据成分:用以描述程序中所涉及的数据;

运算成分:用以描述程序中所包含的运算;

控制成分:用以表达程序中的控制构造(顺序,分支,循环);

传输成分:用以表达程序中数据的传输;

程序设计语言的构成


学习攻略

下面开始理性认识C程序阶段(感性》理性》函数》指针);

感性:程序抄写;

理性:练习;


C语言的基本构成成分(1/9);

数据成分:





内存的认识:

每个字节属于一个存储单元,每个存储单元都有自己的地址,用十六进制的表示;

变量:C++里的变量必须先定义,再使用;

定义一个变量,计算机所做的操作:找到几个连续的存储空间,为这片存储空间取一个名字(变量名),将变量的初始值放到存储空间里,记下变量的名字和这片存储空间的起始地址的对应关系;然后就可以使用变量名对这片空间进行读写;


整形数据的分类(2/9)

基本型:int

短整型:short /short int

长整型:long /long int

按照在存储单元中所占的内存大小来区分的;

C语言的定于宽泛,整型和长整型长度相同的(所以C++里的长整型基本不用);

Sizeof 运算符 测定某种数据类型的长度(字节):

根据有无符号区分(无符号的不能表示负数,有符号的:第一位表示符号位,0表示正数,1表示负数):

在不写明的情况下,默认为都是有符号;

整型数据的分类


sizeof运算


数据分类

数据的存储(3/9):

signed  VS. unsigned 

正整数的表示方法,和负整数的表示方法是不同的;正整数存储的是原码,负整数存储的是补码;

负数补码的求法;

负数为什么不存储原码?计算机原理的课会说明,总的来说是非常有利于在计算机中的运算,效率会高很多;

负数的存储


负数补码的求法


整数的输出(4/9):

打印一个数的二进制表示》打印一个数的十六进制表示即可,打印控制写成 hex,可以看到任何一个数的十六进制表示,也就看到了2进制的表示,(f:1111);八进制表示:oct(7:111);十进制:dec;

把一个二进制数写入到程序里:

转化为十六进制,再写(只要以0x开头,如oxffff 计算机就会把ffff识别为十六进制数,同理,以0开通的数,默认为是八进制的数如0375);

十六进制输入程序


输入八进制
打印一个数的八进制

最大、最小的整数(5/9)

某一种数据整数的最大值(整型无符号:42亿,定义的数不能超过这个数,整型有符号:最大21亿,最小-21亿);

1000 0000 0000 0000 0000 0000 ,此处,1即表示符号位,也表示最高位;

使用须知:

变量一定要初始化,不初始化,值会错乱;


最小的整数


整型数据范围


浮点型的分类(6/9)

浮点型=实型;

精度:


浮点型





字符型(7/9)

字符集不超过256个;ASCII Character Codes;

字符型的是可以和整型的数混用;

转义字符(利用字符的方式,表达一些相关的信息):

\n:换行; \a :滴 响一下;


使用须知



布尔型(8/9)

占一个字节;

字节是计算机所能控制的,最小存储单位,布尔虽然只用一位就可以了,但是要分配一个字节;

即使是位运算,也是以字节为单位进行操作的;

布尔类型的存储:非0即1;(BOOL A = -100; 打印结果:A= 1;)

布尔型


C++基本数据类型


常量(9/9)

程序中,所有数都是有类型的—常量也一样;

常量的数据类型怎么表示?



常量
常量类型

字面常量:写在程序中的数;

符号常量:用一个标识符代表一个常量的,称为符号常量;

容易改;使用把过程中,它的值不会被改变;

是通过常量的后缀来表示的;

不写L即当做,整型数据来处理;

后缀可以联合使用;




变量的名字(9+1)

什么样的名字是合法的:标识符;标识符不能与保留字相同;


标识符

什么样的名字才是好名字?

匈牙利命名法;

驼峰命名法:

驼峰命名法

没必要使用一种命名法,命名所有的标识符,合适的地方使用合适的命名方法;

可以有自己的命名方法,清晰易懂即可(正确性的前提下,增加可读性);最好给变量加注释;


正确的学习方式:了解但不陷入细节;知道他的参考资料在哪里,但不是马上去了解;



计算概论(A) 程序设计部分    C语言的构成部分-运算成分

C语言中的运算符(1/9);

C语言中的运算符

赋值运算的基本功能(2/9)

1,当两边的类型不同的时候;

2,长数赋值给短数(数值可能会变):

        2-1,长数的低位按照短数的长度截断,赋值给短数;

        2-2,赋值赋的是什么,短数的值就是什么,有可能与长数的值相差很多;

3,短数赋值给长数;

4,符号位的处理(数值可能会变);

赋值运算符


赋值运算符


赋值运算符


赋值运算符-要点3



小节:

1,当两边类型不同,自动完成类型转换;

2,当长数赋值给短数,截取长数的低位给短数;

3,当短数赋值给长数,原来什么数,现在还是什么数;

4,符号位的赋值处理,直接赋值,不管是符号位还是数字位;


赋值运算 附加说明-表达式

C语言‘=’ 属于表达式;

1,赋值语句也是一种表达式,也是有返回值的;

2,复合的赋值运算算;

3,连续的赋值运算;

表达式:运算符的优先级,同一级别的,自右向左的结合顺序;

连续赋值运算可读性不好,不建议写(容易被别人读懂的程序,才更有可能被维护下去,才更有生命力);

表达式


赋值表达式
赋值表达式


算术运算符之符号优先级(4/9)

编译器不同,小数的精确取值方法有可能不同,有可能四舍五入,有可能是五舍六入;

优先级的问题很重要:%(模运算)与乘数是同一级的;

加减:同一级别的混合,从左向右计算;

算术运算符和算术表达式



横向箭头是计算之前必定要先进行的一步转换;

纵向箭头是,低级别的数要转换成高级别的之后再进行计算;

类型转换


算术运算符之输出自增、自减(5/9)

 ++ 和 — — 只适用于变量,不适用于表达式;(-i)++ ;报错; ++i++ ;也会报错因为 右边++优先计算,i++而且本身就是表达式,而++ 不能修饰表达式;也会报错;

VC下面打印中,如果包含多个表达式,是遵循从右向左计算的;

注意:d = (a=b++)+(e=b)的运算,‘+’ 运算之后再 ‘++ ’ ;结果:d = d*2;

如果对运算的顺序感兴趣,编译器在debug的状态下可以看到每一步的编译顺序/运算顺序;


自增、自减


自增、自减


自增、自减


关系运算(6/9)

关系运算表达式的值,成立返回‘真’,不成立返回‘假’;

运算符的优先级:算术运算符》关系运算符》赋值运算符;

关系运算符


运算符的优先级


逻辑运算(7/9)

三种最基本的逻辑运算:与&& 、或 || ,非!

逻辑运算符的优先级: 非 》 与 》 或;

在不熟悉各种运算优先级的情况下,加括号;

逻辑运算的取舍;

逻辑运算之混合运算;

逻辑运算符


逻辑表达式的值


混合运算的优先级


路基运算的取舍


路基运算的取舍---举例


示例


运算对象的扩展


示例


其他运算符(8/9)

1,逗号运算符

在所有运算符的优先级中,级别是最低的;

2,条件运算符(等同于if语句,if语句可读性更高)

3,强制类型转换;

逗号运算和表达式


条件运算符


强制类型转换


选讲内容 --- 位运算(9/9)

通过对字节为单位的操作实现位运算;

双目运算符:由两个操作数参与;

单目运算符:只有一个操作数参与;

与运算:按位与;

或运算:按位或;

异或运算:按位与或;

取反运算:每一位都取反;

左移位运算:

在没有溢出(有1 被移出)的情况下相当于乘以/除以2倍;

优先级,具体参照运算优先级列表;

C语言的基本成分-控制成分

位运算


与运算


或运算


异或运算


取反运算


左移运算


右移运算


右移运算的符号处理



不同长度数据的位运算


复合赋值运算


算符优先级


按位与的用途


异或的用途


抑或用途


计算机长须的基本结构

控制成分(1/3)

顺序语句,分支语句,循环语句;

单入口,单出口的程序:我们所写的所有的程序都具备这个特点,任何程序的执行,都是有唯一的一个入口,唯一的一个出口的;这是结构化程序语言的特点;

结构化程序设计(后面讲);

分支语句:if ,switch;

Case 只提供一个执行的入口;不加break的情况下,找到入口会一直向下执行,直到遇到break;

default 也是一个入口,与default放在前面或后面都一样,而且需要break;

计算机程序的基本结构


if语句


switch语句


举例


早期的程序控制方法    goto的故事(3/3)

goto 无条件暂转换;不建议使用,

Goto 之争;牛人站出来说句话:高德纳



Goto语句的讨论


Goto语句的讨论


Goto语句的讨论


C程序中的数组

数组是最常用的数据结构;

数组的定义(1/5)

补充说明:

数组的大小:定义下标不能为变量,C语言不支持变长的数组,可以使用符号常量或者宏定义来定义数组大小,以便于修改;

数组的初始化:只定义没有对元素进行初始化,数值为默认一个最大的负值;可以初始化但不给大小;定义了大小,只给部分元素赋值,其他剩余的元素默认为赋值0,如之定义第一个元素为0,剩余默认为全是0;定于元素多于下标,报错;

注意:下标从0开始;

数组的定义


变量不能做下标


符号常量可以做下标


宏定义可以做下标


数组的初始化:

数组的初始化


元素都不赋值的情况


只初始化元素不写下标


为一部分元素赋值


只给第一个元素赋值


元素个数超过下标


二维数组的定义(2/5)

二维数组可以看做由多个一维数组的集合;

存储数据列表;

存储:拉成一条直线,存储到内存里;

初始化:内层的大括号可以不用写;只指定行数或列数也可以;只对部分元素进行初始化,剩下的默认赋值0;

可以利用下标的对应关系进行赋值;

二维数组


二维数组的存储


二维数组的初始化


不写小括号


不写行的下标


下标或元素不全


初始化为0


使用下标


三维数组的定义(3/5)

二维数组也可以看做由多个一维数组的集合;或多个二维数组的排列;

存储:将三维数组切成二维数组来存储,二维数组再拉成一维数组;

最好不要定义三维以上的数组,减少出错概率,提高程序可读性;

三维数组


三维数组的存储


数组的作用之用数组做统计(4/5)

数组的下标与数据的对应关系,可以用来做整数的统计;下标特别有用;

数组的作用


数组统计应用1


数组统计应用1


数组统计应用2


数组统计应用2


数组的作用之下标做数轴(5/5)

筛法求素数:

找素数:

方法1:一个一个的区分是不是素数;

方法2:筛法求素数(删除所有的合数剩下的全是素数);

求开方,被开方的数必须为double,所以被开方数要写成小数;

以打基础为主,而不是达到一定的水平;

数组统计应用3


数组统计应用3


数组统计应用3


数组统计应用3


数组统计应用3



字符数组与字符串

什么是字符串(1/5)

字符数组的初始化

认识字符串:

所有的字符串都是以 \0 结尾的,所有以 \0 结尾的字符数组都可以被看作为“xxx”的字符串;

关于赋值:字符串对字符数组赋值,只能出现在定义环节;但可以对单个元素进行赋值;

字符数组可以当数组使用;

二维字符数组:也是直接赋值字符串;












输入缓冲区(2/5)

单独来讲:太常用了;

字符/字符数组/字符串的输入与输出

输入缓冲区:键盘打印完毕 回车,输入内容包括回车就会被临时存储到一个叫做输入缓冲区的地方;程序就会到输入缓冲区读取字符;使用指针来标定哪些字符是被读取过的,那些是尚未被读取的;指针只能向后移动;

关于cin输入:数据存储到数据缓冲区之后,cin就负责读取这一块数据,将数据给与对应的变量;cin不能进行数据类型转换,输入的数据类型不正确,cin即没办法读取;cin会把空格和回车都当做数据输入区分的标志;如果cin能够读到正确的数,就会返回一个非零的数,否则就会返回0,表示读取错误,可以使用cin这个特性,来书写很多支持连续输入的程序;







一个字符的输入(3/5)

方法1,cin输入;

cin读取的时候,会跳过空格和回车;如何终止输入:control+z;

方法2,cin.get()输入;是cin里面的一个方法;cin.get()读取的过程中,不会跳过空格和回车,会将空格和回车都读取并且打印出来;停止:control+z;

EOF:文件结束的标志;

cin.get(char)

读取赋值给C,并且打印;

方法3,getchar()输入

读取的时候不跳过任何字符,把^Z也会打印出来;








第66节和第67节是一样的,没有(4/5)


字符串例题(5/5)

字符串加密:凡是使用字符串替换字符串的方法,都容易被破解,使用自出出现的概率进行破解;

字符串拼接

统计单词数:

找到一个单词开始的标志位;不用关心单词是什么有多长;

讲述这么多细节,是因为缺少了北大的实验课而网络课没有试验课;








课程结束



课程结束

下次课程:

C程序设计进阶





参考资料:

程序设计与算法基础

网易公开课计算机专业课程体系



短绠不汲深泉!

你可能感兴趣的:(程序设计与算法基础)