目录:
一,计算机为什么能够实现计算;
二,第二讲:
三,第三讲:程序运行的基本原理
参考资料:
说明:学习笔记;
CPU公顷桑:AMD、英特尔、IBM
世界超级计算机排名:www.top500.org
绿色计算的课题:Google一下所消耗的电量:11瓦的灯泡亮1个小时;/可以煮熟一杯咖啡;》新型计算:云计算;
未来的计算:从摩尔定律到量子计算机;
摩尔定律/规律: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语言;
学习一门的程序设计语言怎么学(学习攻略)?
语言的种类千差万别,但是一般来说,基本成分不外四种(所有的程序设计语言,关注这4个部分就够了——计算机科学技术百科全书):
数据成分:用以描述程序中所涉及的数据;
运算成分:用以描述程序中所包含的运算;
控制成分:用以表达程序中的控制构造(顺序,分支,循环);
传输成分:用以表达程序中数据的传输;
下面开始理性认识C程序阶段(感性》理性》函数》指针);
感性:程序抄写;
理性:练习;
C语言的基本构成成分(1/9);
数据成分:
内存的认识:
每个字节属于一个存储单元,每个存储单元都有自己的地址,用十六进制的表示;
变量:C++里的变量必须先定义,再使用;
定义一个变量,计算机所做的操作:找到几个连续的存储空间,为这片存储空间取一个名字(变量名),将变量的初始值放到存储空间里,记下变量的名字和这片存储空间的起始地址的对应关系;然后就可以使用变量名对这片空间进行读写;
整形数据的分类(2/9)
基本型:int
短整型:short /short int
长整型:long /long int
按照在存储单元中所占的内存大小来区分的;
C语言的定于宽泛,整型和长整型长度相同的(所以C++里的长整型基本不用);
Sizeof 运算符 测定某种数据类型的长度(字节):
根据有无符号区分(无符号的不能表示负数,有符号的:第一位表示符号位,0表示正数,1表示负数):
在不写明的情况下,默认为都是有符号;
数据的存储(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;)
常量(9/9)
程序中,所有数都是有类型的—常量也一样;
常量的数据类型怎么表示?
字面常量:写在程序中的数;
符号常量:用一个标识符代表一个常量的,称为符号常量;
容易改;使用把过程中,它的值不会被改变;
是通过常量的后缀来表示的;
不写L即当做,整型数据来处理;
后缀可以联合使用;
变量的名字(9+1)
什么样的名字是合法的:标识符;标识符不能与保留字相同;
什么样的名字才是好名字?
匈牙利命名法;
驼峰命名法:
没必要使用一种命名法,命名所有的标识符,合适的地方使用合适的命名方法;
可以有自己的命名方法,清晰易懂即可(正确性的前提下,增加可读性);最好给变量加注释;
正确的学习方式:了解但不陷入细节;知道他的参考资料在哪里,但不是马上去了解;
计算概论(A) 程序设计部分 C语言的构成部分-运算成分
C语言中的运算符(1/9);
赋值运算的基本功能(2/9)
1,当两边的类型不同的时候;
2,长数赋值给短数(数值可能会变):
2-1,长数的低位按照短数的长度截断,赋值给短数;
2-2,赋值赋的是什么,短数的值就是什么,有可能与长数的值相差很多;
3,短数赋值给长数;
4,符号位的处理(数值可能会变);
小节:
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;
早期的程序控制方法 goto的故事(3/3)
goto 无条件暂转换;不建议使用,
Goto 之争;牛人站出来说句话:高德纳
C程序中的数组
数组是最常用的数据结构;
数组的定义(1/5)
补充说明:
数组的大小:定义下标不能为变量,C语言不支持变长的数组,可以使用符号常量或者宏定义来定义数组大小,以便于修改;
数组的初始化:只定义没有对元素进行初始化,数值为默认一个最大的负值;可以初始化但不给大小;定义了大小,只给部分元素赋值,其他剩余的元素默认为赋值0,如之定义第一个元素为0,剩余默认为全是0;定于元素多于下标,报错;
注意:下标从0开始;
数组的初始化:
二维数组的定义(2/5)
二维数组可以看做由多个一维数组的集合;
存储数据列表;
存储:拉成一条直线,存储到内存里;
初始化:内层的大括号可以不用写;只指定行数或列数也可以;只对部分元素进行初始化,剩下的默认赋值0;
可以利用下标的对应关系进行赋值;
三维数组的定义(3/5)
二维数组也可以看做由多个一维数组的集合;或多个二维数组的排列;
存储:将三维数组切成二维数组来存储,二维数组再拉成一维数组;
最好不要定义三维以上的数组,减少出错概率,提高程序可读性;
数组的作用之用数组做统计(4/5)
数组的下标与数据的对应关系,可以用来做整数的统计;下标特别有用;
数组的作用之下标做数轴(5/5)
筛法求素数:
找素数:
方法1:一个一个的区分是不是素数;
方法2:筛法求素数(删除所有的合数剩下的全是素数);
求开方,被开方的数必须为double,所以被开方数要写成小数;
以打基础为主,而不是达到一定的水平;
字符数组与字符串
什么是字符串(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程序设计进阶
参考资料:
程序设计与算法基础
网易公开课计算机专业课程体系
短绠不汲深泉!