第1章计算机与程序设计.docx
- 文档编号:11566580
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:19
- 大小:98.67KB
第1章计算机与程序设计.docx
《第1章计算机与程序设计.docx》由会员分享,可在线阅读,更多相关《第1章计算机与程序设计.docx(19页珍藏版)》请在冰点文库上搜索。
第1章计算机与程序设计
第1章计算机与程序设计
本章介绍计算机和程序设计的基本知识,主要内容包括计算机的基本结构、程序设计语言和面向过程程序设计等。
通过对这些内容的学习,可使读者对计算机和程序设计有一个初步的了解,为后面各章的学习奠定必要的基础。
1.1计算机的基本结构
1.1.1计算机硬件的基本组成
计算机是程序式电子数字计算机的简称。
1946年世界上第一台计算机问世。
最初,计算机只被当作一种现代化的计算工具,但随着技术的进步,现在,计算机已经远不只是一种计算工具,它的应用已经遍及国民经济和人类生活的各个领域,并带动着各行各业向现代化迈进。
计算机是作为一种计算工具出现的,它的工作过程和人使用算盘或计算器等简单计算工具解题的过程很相似。
为了了解计算机的组成和工作过程,下面先讲述使用算盘解题的步骤和所需要的设备。
1.用算盘解题的设备和步骤
假设需要计算半径为15的圆面积与边长为12的正方形面积之差,即计算下式的值:
3.1416×15×15–12×12
首先,需要有一个算盘作为计算工具,其次需要一张纸,以便记录原始数据、运算的中间结果和最后结果。
把这些原始数据和运算结果记录到纸上是由人用笔来完成的,整个运算过程也是在人的控制下进行的。
运算步骤概括如下:
(1)人把要计算的表达式(其中包含了原始数据)用笔记录在纸上。
(2)人用算盘计算3.1416×15×15,然后把中间结果706.86用笔记录在纸上。
(3)人用算盘计算12×12得到中间结果144,把这个中间结果也用笔记录在纸上。
(4)最后,人用算盘从第一个中间结果706.86中减去第二个中间结果144,得到最后结果562.86,再用笔把它记录在纸上。
2.用计算机解题需要的设备
用计算机来完成上述解题过程,首先需要一个能够代替算盘完成各种运算的部件,这个部件称为运算器。
其次,需要一个能存放原始数据和运算结果的部件,这个部件称为存储器,有内存储器与外存储器之分。
虽然计算机的工作过程和人用算盘解题的过程很相似,但是它们之间却有一个本质区别:
计算机工作过程是脱离人的干预的,人只要事先把解题步骤按先后顺序排列起来,输入到计算机的内存储器中,然后启动计算机运转,计算机就会自动按预先安排好的解题步骤完成计算。
这种事先编写好的解题步骤称为程序。
通常,把程序及其相关文档资料称为软件。
可见,存储器也是存放程序的部件。
用来把原始数据和程序输入到计算机中的设备,称为输入设备。
输出计算结果所用的设备称为输出设备。
人在使用计算机时应完成的任务只是编写程序和操作计算机,计算机解题的全过程是在程序控制下依次发出各种控制命令,操纵计算过程一步一步地进行,完全取代了人在用算盘计算过程中所起的控制作用。
把能够依次发出各种控制信息、代替人起控制作用的部件称为控制器。
综上所述,计算机主要由内存储器、运算器、控制器、输入设备和输出设备等5个部件组成。
此外,为了扩大存储容量和长期保存数据,通常还设有外存储器。
各部件的关系如图1.1所示。
3.计算机的内部组成
(1)中央处理器(CPU)
CPU即中央处理器,如图1.2所示。
它是计算机的大脑,计算机的运算、控制都是由它来处理的。
它的发展非常迅速,就像不断在加速的列车一样。
个人计算机从8088(XT)时代发展到现在的PentiumD时代,只经过了不到20年的时间。
从生产技术来说,最初的8088集成了29 000个晶体管,而高能奔腾的集成度超过了750万个晶体管。
从而,CPU的运行速度也有了本质上的提高。
图1.1计算机的基本结构 图1.2中央处理器(CPU)
(2)主板
主板是计算机中最重要的部件之一,是整个计算机工作的基础,如图1.3所示。
计算机技术已非常成熟,几乎都是模块化的设计。
对10种或20种主板进行研究发现,它们差不多是相同的,它分为许多个功能块,每个功能块由一些芯片或元件组成。
万变不离其宗,大致说来,主板由以下几个部分组成:
CPU插槽(插座),内存插槽,高速缓存,局域总线和扩展总线,硬盘、软驱、串口、并口等外设接口,时钟和CMOS芯片,BIOS控制芯片。
(3)内存
内存一般指的是随机存取存储器,简称随机存储器(RAM),如图1.4所示。
静态内存(SRAM)指静态随机存储器,用作系统的高速缓存,而平常所提到的计算机的内存指的是动态内存(DRAM)指动态随机存储器。
除此之外,还有各种用途的内存,如显示卡使用的VRAM,存储系统设置信息的CMOSRAM等。
图1.3主板图1.4内存
每条内存上有一排黑色的芯片,称为内存颗粒,每个内存颗粒里,又有很多个内存单元,一个内存单元由一个电容和一个晶体管组成,为了让系统对内存准确无误,有秩序的管理,所以给每个内存单元分配了在它所在系统里的唯一的一个内存地址,而内存范围就是很多内存地址中的一段,比如0x5b000005~0x5c0000010。
本书第4章将介绍指针的使用,指针就是地址。
可以将指针理解为它指向了内存中的某个内存单元(如地址为0x5b000005的单元),如果想获取此指针的值,这个指针值便是这个地址(0x5b000005)。
也可以这样来理解,把对内存单元的访问管理和学生公寓的情况类比,如图1.5所示。
图1.5存储结构和学生公寓结构对比图
假设每个学生住一间房,一个学生就相当于一个变量的内容,房间是内存单元,房号就是内存地址。
如果知道了学生姓名,可以通过这个名字来访问该学生,这相当于使用普通变量名访问数据。
如果知道了房号,同样也可以访问该学生,这相当于通过地址访问数据。
比如,要从303(如同0x5b000005一样)房间中取出某样物品,有了地址以后,就可以从地址所指定的房间取出所要的物品(即数据的调用)。
(4)硬盘
硬盘的结构和软盘差不多,是由磁道(tracks)、扇区(sectors)、柱面(cylinders)和磁头(heads)组成的,如图1.6所示。
拿一个盘片来讲,它和软盘类似,上面被分成若干个同心圆磁道,每个磁道被分成若干个扇区,每扇区通常是512B。
硬盘的磁道数一般为300~3000,每磁道的扇区数通常是63个,而早期的硬盘只有17个。
图1.6硬盘
和软盘不同的是,硬盘由很多个盘片叠在一起,柱面指的就是多个磁片上具有相同编号的磁道,它的数目和磁道数是相同的。
硬盘的容量按下式计算:
硬盘容量=柱面数×扇区数×每扇区字节数×磁头数
标准IDE接口最多支持1024个柱面、63个扇区、16个磁头,其最大容量为1024×63×16×512B=528482304B,即528MB。
增强型IDE(IntegratedDriveElectronics)接口最多可支持256个逻辑磁头,容量最大可达到8.4GB。
这里需要提到有关簇的概念,簇是文件存储的最小单位。
软盘的簇只有一个扇区。
在硬盘上,簇的大小和分区大小有关。
比如,当分区容量介于64MB和128MB之间时,每簇有4个扇区;介于128MB和256MB之间时,每簇有8个扇区;而当分区容量大于1024MB时,每簇的扇区数目将超过64个,容量达到32KB以上。
在此时,一个1B的文件在硬盘上也会占用32KB的空间。
因此,要根据具体情况来进行合理分区,以免浪费很多的硬盘空间。
如果用户使用的Windows95OSR2或者Windows98的话,可以利用它们提供的FAT32分区,使硬盘的每一个簇小到4KB。
如果使用的是Windows2000或WindowsXP,使用NTFS分区,每个簇的大小不要超过4KB。
(5)其他部件
一般来说,一台完整的功能强大的计算机还配备有软驱(floppydrive)、光驱(CD/DVD-ROM)、刻录机(CD/DVD-RW)、显示卡(videocard)、声卡(audiocard)、网卡(networkcard)及显示器(display)、音箱(soundbox)、键盘(keyboard)、鼠标(mouse)、扫描仪(scanner)、打印机(printer)等,本书不做详细介绍,请有兴趣的同学自行查找相关资料。
1.1.2计算机的工作过程
如图1.1所示,在计算机中有两类信息在流动。
一类信息是数据,包括原始数据、中间结果、最后结果和程序指令等,数据流在图中用粗线表示,箭头表明流动方向。
另一类信息是控制命令,在图中用细线表示,箭头同样表明流动方向。
不论是数据还是控制命令,在计算机中都是仅用“0”和“1”表示的二进制信息。
通过输入设备把程序和原始数据按指定地址输入存储器保存,图1.7是存储器存储程序和数据的示意图。
然后启动计算机,则计算机按照存入的顺序依次取出存储器中的指令送入控制器分析,控制器根据分析结果发出相应的控制命令,从而按照人的意图自动完成全部运算,最后再通过输出设备输出计算结果。
在运算过程中,数据从存储器取出并输入运算器进行运算,运算的中间结果和最后结果可存入存储器保存,也可由运算器经过输出设备输出。
必要时,可将内存储器的成批数据送入外存储器保存,或将外存储器中的成批数据调入内存储器参加运算。
前面概括地说明了计算机工作的大致过程,下面,仍以前面所举的计算
3.1416×15×15–12×12
为例,具体说明计算机的工作过程。
图1.7程序和数据在存储器中存储示意图
第一步,用输入设备把事先编写好的解题步骤(即程序)和原始数据(3.1416,15,12)输入到存储器指定编号的地方存储起来。
第二步,命令计算机从第一条指令开始执行程序,则计算机在程序控制下自动完成解题的全过程。
具体说来,解题过程包括下列操作:
(1)把第一个数据3.1416从存储器中取到运算器内。
(2)把第二个数据15从存储器中取到运算器内,进行乘法运算3.1416×15,得到中间结果47.124。
(3)用第二个数据15再次乘中间结果47.124,得到新的中间结果706.86。
(4)把运算器中的中间结果706.86送到存储器中暂时保存。
(5)把第三个数据12从存储器中取到运算器内。
(6)进行乘法运算12×12,得到中间结果144。
(7)把运算器中的中间结果144送到存储器中暂时存放。
(8)把暂存的中间结果706.86取到运算器内。
(9)把暂存的中间结果144取到运算器内,进行减法运算706.86–144,得到最后结果562.86。
(10)把最后结果562.86通过输出设备输出给用户(例如,用打印机打印在纸上或显示在显示器的荧光屏上)。
(11)停机。
1.2程序设计语言
计算机本身并不知道如何解决一个问题,必须由人事先把解题步骤设计好,编写成程序输入到计算机中,计算机才能在程序控制下按照人的意图解决这个问题。
因此,人们必须用计算机能够接受的语言和它通信,告诉它对什么数据进行什么运算,以及运算的次序。
程序设计语言就是为了表达程序而由人设计出来的计算机能够接受的人工语言,它是用来表达用户意图指挥计算机工作的通信工具。
目前,程序设计语言的发展已经经历了4代,第五代程序设计语言尚处于萌芽状态。
下面简单介绍一下各代程序设计语言的基本特点。
1.第一代程序设计语言
第一代程序设计语言是机器语言,它是计算机所特有的,也就是说,不同计算机有不同的机器语言。
机器语言的基本组成成分是若干条机器指令,每条指令指明作什么运算及对哪个单元中的数据进行运算。
这些指令是计算机硬件可以直接识别和执行的。
计算机只能存储和识别二进制的数据和指令,因此,机器语言也称为二进制语言。
用机器语言编写程序时,数据和指令必须分别存储在不同的单元中。
例如,计算半径为15的圆面积:
A=3.1416×15×15
用某种型号计算机计算时,内存中存储的数据及用机器语言编写的程序如表1.1和表1.2所示。
表1.1数据
地址
数值
地址
数值
地址
数值
0010
3.1416
0011
15
0012
A
表1.2程序
地址
指令
注释
操作码
地址码
0100
021
0010
取3.1416
0101
012
0011
×15
0102
012
0011
×15
0103
022
0012
存A
0104
035
0012
打印A
0105
007
0000
停机
计算机可以直接识别和执行用机器语言编写的程序,因此效率较高。
但是,人工编写机器语言程序很繁琐,容易出错,而且不同计算机有不同的机器语言,通用性很差。
2.第二代程序设计语言
为了克服机器语言的缺点,人们设计出第二代程序设计语言——汇编语言,也称为符号语言。
相对于第一代程序设计语言,第二代程序设计语言的主要进步是,用含义较鲜明的符号代替机器语言中的二进制编码,因此看起来较直观,不易出错。
例如,上面的计算圆面积的例子,如果用汇编语言编程序,则源程序如下:
LOAD3.1416
MUL15
MUL15
SAVEA
PRINTA
STOP
计算机硬件并不能直接识别和执行汇编语言源程序,因此,必须用一个编译程序(一种系统软件)把汇编语言源程序转换(即翻译)成机器语言程序(称为目标程序)之后,才能执行。
汇编语言仍然是依赖于计算机的,不同计算机有不同的汇编语言,彼此不能通用。
此外,汇编语言指令与机器语言指令是一一对应的,一个复杂的程序需要包含大量汇编语言指令,编写起来仍然很繁琐。
为了克服汇编语言的缺点,人们开发出第三代程序设计语言。
3.第三代程序设计语言
前面曾经讲过,为了利用计算机解决一个特定问题,必须首先设计出解题步骤。
通常,把为了在计算机上解决一个问题而采用的方法和步骤称为算法。
更确切地说,算法是在有限步骤内解决某一问题所使用的有精确定义的一系列操作规则。
第三代程序设计语言特别适合用来表达算法,因此也称为算法语言。
算法语言的基本组成成分是各种语句。
通常一个语句的功能相当于多条机器指令的功能,因此,用算法语言编写程序远比用机器语言或汇编语言编写程序更加方便、简单和直观,而且更不容易出错。
此外,算法语言不依赖于机器,同一个算法语言程序可以在众多不同类型的计算机上运行,通用性很强。
因此,第三代程序设计语言也称为高级语言。
常用的高级语言有BASIC、FORTRAN、ALGOL、COBOL、C、Pascal、PL/1等。
例如,计算前述圆面积的BASIC源程序如下(每行前数字为行号):
10A=3.1416*15*15
20PRINTA
30END
显然,计算机硬件并不能直接识别和执行高级语言源程序,因此,必须首先使用编译程序(一种系统软件)把高级语言源程序编译(即翻译)成机器语言程序(称为目标程序),然后才能执行。
4.第四代程序设计语言
虽然比起机器语言和汇编语言来,第三代程序设计语言有了很大进步,但是,为了能熟练地使用这种语言解决实际问题,仍然需要经过长期的专业训练。
为了提高软件开发效率,增强软件的可维护性,人们研究出第四代程序设计语言。
所谓第四代程序设计语言,实质上是可以快速开发应用软件的各种高生产率的软件工具的统称。
5.第五代程序设计语言
多数人认为,第五代程序设计语言将是智能化的语言。
到目前为止,还没有公认的第五代程序设计语言出现。
PROLOG语言可能是第五代程序设计语言最著名的雏形。
1.3面向过程程序设计
如前所述,使用传统程序设计语言进行程序设计时,不论所使用的语言是第一代程序设计语言或第二代程序设计语言,还是第三代程序设计语言,都必须详细准确地描述解题过程。
也就是说,当人们用这类语言表达自己意图指挥计算机工作时,必须向计算机详细说明怎样完成预定的功能:
第一步做什么、第二步做什么、第三步做什么……哪些操作按程序编写顺序只做一遍,哪些操作重复做多遍,哪些操作在某个条件成立时做,等等。
因为程序设计工作主要围绕设计解题过程来进行,这种传统的程序设计方法称为面向过程程序设计,传统的程序设计语言称为过程性语言。
使用过程性语言编写的程序,其功能是隐含在程序代码中的。
为了搞清楚程序的功能,必须反复阅读程序,仔细分析程序的每个语句,根据该程序设计语言的语法确定语句的执行顺序,并要综合每个语句的语义及执行顺序才能推断出程序的功能。
因此,理解面向过程的程序相当困难。
显然,当应用系统的功能比较复杂时,应用程序的规模必然十分庞大,包含的语句很多,程序元素(数据、语句)相互之间的关系十分复杂。
因此,用面向过程程序设计方法开发应用系统时,需要耗费大量人力物力,只有经过严格训练的有经验的程序员才能胜任编程工作。
这样的应用系统不仅不易开发,维护起来也十分困难。
所谓维护,就是在软件交付给用户使用期间,出于种种原因,而对软件进行修改。
人们在开发软件的长期实践过程中,总结出一些设计原理并研究出一些系统化的技术方法,把它们用于面向过程程序设计,能够提高开发效率,增加系统的可理解性、可阅读性和可维护性。
这些原理和技术方法,在进行面向对象程序设计时也有借鉴意义。
下面简要介绍主要设计原理和技术方法。
1.3.1模块化
模块是数据说明、可执行的语句等程序元素的集合,它是单独命名的而且可以通过名字来访问,也就是说,可以用名字代表该模块。
所谓模块化,就是把一个程序划分成若干个模块,每个模块完成一个子功能,把这些模块组装成一个整体,可以完成指定的功能。
模块化是为了使一个复杂的大型程序能被人的智力所管理、程序应该具备的基本属性。
如果一个大型程序仅由一个模块组成,例如,程序由几十万个语句一个语句接着一个语句堆积而成,那么它将很难被人所理解。
下面根据人类解决问题的一般规律,论证上面的结论。
设函数C (x)定义问题X的复杂程度,函数E (x)确定解决问题X需要的工作量(时间)。
对于两个问题P1和P2,如果
C (P1)>C (P2)
显然E (P1)>E (P2)
根据人们解决一般问题的经验,另一个有趣的规律为:
C(P1+P2)>C (P1)+C (P2)
也就是说,如果一个问题由P1和P2两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和。
综上所述,得到下面的不等式:
E (P1+P2)>E (P1)+E (P2)
这个不等式导致“各个击破”的结论——把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。
这就是模块化的根据。
从上面的不等式并不能得出“如果无限地分割程序,最后为了开发程序而需要的工作量也就小得可以忽略了”的结论。
事实上,还有另一个因素在起作用,从而使得上述结论不能成立。
当模块数目增加时每个模块的规模将减小,开发单个模块的工作量确实减少了;但是,随着模块数目增加,设计和实现模块接口所需要的工作量也将增加。
综合这两个因素,每个程序都有一个最适合的模块数目,使得开发该程序的总成本(开发模块的成本加上开发模块间接口的成本)最小。
换句话说,在把程序划分成模块的时候,模块规模应该适当。
模块太大则模块化带来的好处不明显,模块太小,则模块间接口的成本过大。
采用模块化原理可以使程序结构清晰,不仅容易设计也容易阅读和理解。
因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的稳定性。
因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。
模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。
1.3.2抽象
人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。
人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。
把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。
在求解问题的过程中使用抽象原理,就是忽略该问题与当前目的无关的那些方面,以便集中精力考虑与当前目的有关的那些方面。
由于人类思维能力的限制,如果每次面临的因素太多,是不可能做出精确的思维的。
处理复杂系统的唯一有效的方法是用层次的方式构造和分析它。
一个复杂的动态系统首先可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,如此进行下去,直至最低层次的具体元素。
这种层次的思维和解题方式必须反映在定义动态系统的程序结构之中,每层的一个概念将以某种方式对应于程序的一组成分。
考虑问题的模块化解法时,可以提出许多抽象的层次。
在抽象的最高层次使用描述问题环境的语言,以概括的方式叙述问题的解法;在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法;最后,在最低的抽象层次用可以直接实现的方式叙述问题的解法。
逐步求精和模块化的概念,与抽象是密切相关的。
随着程序开发工作的进展,在程序结构每一层次中的模块,表示了对程序抽象层次的一次精化。
事实上处于程序结构顶层的模块,控制了程序的全部功能并且影响全局;在程序结构底层的模块,完成对数据的一个具体处理。
用自顶向下由抽象到具体的方式分配控制,简化了程序的设计和实现,提高了程序的可理解性、可修改性和可测试性,使程序更容易维护。
1.3.3信息隐藏和局部化
信息隐藏原理指出,在设计和确定模块时,应该使得一个模块内包含的信息(数据和操作)对于不需要这些信息的其他模块来说,是不能访问的。
局部化的概念和信息隐藏概念是密切相关的。
所谓局部化,是指把一些关系密切的程序元素物理地放得彼此靠近,处于同一局部区城内。
在模块中使用局部数据元素是局部化的一个例子。
显然,局部化有助于实现信息隐藏。
“隐藏”意味着有效的模块化可以通过定义一组独立的模块来实现,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。
如果在测试期间和以后的维护期间需要修改程序,那么用信息隐藏原理指导模块化系统设计就会带来极大好处。
因为绝大多数数据和处理过程对于程序的其他部分而言是隐藏的(也就是“看不见”的),在修改期间由于疏忽而引入的错误传播到程序的其他部分的可能性就很小。
1.3.4模块独立
模块独立原理是模块化、抽象、信息隐藏和局部化原理的直接结果和进一步发展。
开发具有独立、完整功能而且和其他模块之间没有过多相互作用的模块,就可以做到模块独立。
换句话说,应该这样设计程序结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系尽可能简单。
为什么模块的独立性很重要呢?
主要有两条理由:
第一,有效的模块化(即具有独立的模块)的软件比较容易开发出来。
这是由于能够分割功能而且接口可以简化,当许多人分工合作开发同一个软件时,这一优点尤其重要。
第二,独立的模块软件比较容易测试和维护。
这是因为相对说来,修改设计和程序需要的工作量比较小,错误传播范围小,需要扩充功能时能够“插入”模块。
总之,模块独立是好设计的关键,而设计又是决定软件质量的关键环节。
模块的独立程度可以由两个定性标准量度,这两个标准分别称为耦合度和内聚度。
耦合度衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚度衡量一个模块内部各个元素彼此结合的紧密程度。
在程序设计时应该追求尽可能松散耦合的系统。
在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解。
此外,由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小。
因此,模块间的耦合程度强烈影响系统的可理解性、可测试性、稳定性和可维护性。
一般说来,如果两个模块彼此间通过参数交换信息,而且交换的信息基本上是数据,则这样的耦合是松耦合。
内聚表示一个模块内部各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。
简单地说,理想内聚的模块只做一件事情。
设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多。
但是,低内
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 程序设计