《第一章 计算机程序设计基础.doc》由会员分享,可在线阅读,更多相关《第一章 计算机程序设计基础.doc(45页珍藏版)》请在金锄头文库上搜索。
1、第一章 计算机程序设计基础1.1 编程语言及其发展1.1.1 计算机编程语言所谓计算机程序,是计算机所执行的一系列指令的集合,通过这些指令集合,计算机可以实现数值计算、信息处理、信息显示等功能。计算机系统采用电信号表示其内部的所有信息,而每个电信号往往采用通、断两个状态表示,因而,计算机内的所有信息均采用二进制格式保存,无论是执行指令、需要处理的数据,还是显示的文字符号。例如,文字处理时,在屏幕某个位置显示字母“A”,实际是将65这个数据的二进制格式送给了显卡,则由显卡根据65对应的字母A的点阵特征,输出视频信号给显示器,从而在显示器的某个位置“画”出字母“A”。从第一台电子计算机开始,就采用
2、二进制格式存储计算机指令,这种格式的指令称为机器语言,是CPU唯一能够识别的内容。例如,将数18送给普通微机CPU内部的某个寄存器BX(寄存器是CPU内部用于存放数据的单元),其机器语言格式如下: 10111011 00010010 00000000这样以若干0和1组成的指令不利于记忆,一般人往往无法记住CPU某个指令的二进制格式,为此,引入了助记符的概念,即采用便于记忆的英文单词或其缩写格式代表相应的机器语言,如,对上面的机器语言,采用下面格式表示: MOV BX,18用“MOV”这样的缩写表示传送数据,一般程序员只要了解代表指令的这样助记符,就可以编写程序。但是,这样书写的计算机程序,计算
3、机的CPU是没法识别的,为此需要把助记符格式的程序翻译成对应的机器语言,这个过程称为编译(Compile),是由专门的工具实现的,如微软公司提供的MASM工具就可以进行编译工作。采用助记符格式的编程语言,称为汇编语言,所有的CPU系统都具有自己的汇编语言。汇编语言虽然解决了程序设计的基本问题(不需要记忆那些0、1的组合),但仍然存在如下问题:汇编语言需要程序员了解CPU的结构和基本工作原理。如果需要计算18+20的结果,必须先将参与计算的一个数送到计算机内部的某个寄存器中(如上面的BX寄存器),然后才能执行加法指令,加的结果还需要再送回内存的某个区域,以便CPU进行下一步的计算。程序员必须知道
4、CPU内部有哪些寄存器,其中又有哪些寄存器能够用于存放参与计算的数据。上面的例子用汇编书写如下: MOV BX,18 ADD BX,20 MOV 1000,BX对编程人员来说,仅仅需要确定让CPU计算加法,不想了解其细节。基于这样的目的,发明了各种高级编程语言,如Fortran、Basic、C等,它们均采用符合人类自然描述语言的语法书写计算机程序,如Basic语言实现上述计算的格式如下: A=10+20高级语言简化了程序设计的难度,程序员不必了解细节,编写的程序由专门的编译工具转换成机器语言。正是这些高级语言的产生,才使得计算机编程能够推广开来。常见的高级编程语言包括:l DOS应用程序:Fo
5、rtran、Basic、Pascal、Cl Windows应用程序:Visual C+、Visual Basic、Delphi、C+ Builder、Java编程语言除了进行简单的加、减、乘、除计算外,有时还需要进行更复杂的科学计算,如三角、指数、对数等函数计算,而CPU并没有与这些函数对应的指令,只能采取一些近似的数值算法。这些数值算法并非每个编程人员都清楚,因而每个编程语言都提供了这些函数的通用算法,并以库函数的形式提供给程序员,程序员编程时,只需要简单地调用这些标准函数即可,如Visual Basic采用sin(x)进行正弦函数计算。当编译工具把程序员编写的高级语言程序(称为源程序)编译
6、成机器语言时,遇到其中的函数,并不能转换成机器语言。这样编译的程序称为目标程序,以.obj为后缀。不管是什么编程语言,编译后的目标程序都是统一的机器格式。为了产生真正可以运行的程序,还需要将编译好的目标程序与编程语言提供的库文件中某些函数的指令连接在一起。这个步骤称为链接(Link),只有经过链接的程序才能产生可执行的.exe文件。所有语言的编程步骤如下: 编辑(编写源程序)、编译(转换成目标程序)、链接(生成可执行程序)需要说明的是,不同语言编译的方式不同。有的语言是先将所有程序代码一起编译成机器语言,再链接生成可执行文件,如C语言、Pascal语言,这种语言称为编译型语言,最后以可执行的e
7、xe文件运行;有的语言则可以边编译边执行,如Basic语言、Java语言,这种语言称为解释型语言;也有些语言既提供编译运行的方式,也提供解释运行的方式,如Visual Basic,在调试程序时可以采用解释型,一旦调试完成,则采用编译型,将源程序编译成可执行的exe文件。编译型语言的程序执行速度比解释型语言的程序执行速度快。编程语言种类很多,初学者究竟应该选择哪种语言?在常用的Windows应用程序编程语言中,Visual Basic难度最小,功能也最弱,而Visual C+难度最大,功能也最强大。如果只希望编写简单初级程序,尽量选择Visual Basic,如果需要编写功能强大的程序,特别是需
8、要与计算机硬件打交道的程序,则选择Visual C+。其实,语言本身的语法都比较简单,掌握起来也不难。Visual Basic将Windows应用程序设计的许多细节都隐藏起来了,程序员不需要了解其细节,只要依照其语法编程即可。而采用Visual C+语言编程,必须了解Windows程序设计的细节,以及封装这些细节的几百个类(即微软基本类库MFC),而这正是Visual C+学习的难点。虽然Visual Basic隐藏了许多细节,但了解掌握Windows程序设计的细节对学好Visual Basic也有很大的帮助,还可以应用这些细节编写出功能强大的应用程序。本章也将以一定的篇幅介绍Windows程
9、序设计的特点,更多的细节可以参考有关Windows程序设计的书籍。1.1.2 编程语言涉及的主要内容各种编程语言的语法不同,但都涉及以下内容:变量定义、赋值语句、条件语句、循环语句、结构与类等一、变量与类型程序设计过程中,往往涉及到大量的数据,这些数据一般都存放在存储器中(主要是内存中)。所谓变量定义,就是在内存中申请一个区域保存某个数据。内存以8位二进制为单元保存信息,这样一个单元称为字节(Byte),实际申请内存时,可能需要一个或多个字节单元,申请的内存单元数量越多,可以保存的数据也越大。变量的类型就是申请内存时的单元数量以及数据存放在这些单元中的格式。编程语言往往都提供一些变量类型存放:
10、整数、小数和字符。其中整数的存放可以申请的内存单元一般为1个、2个、4个、8个;小数的存放可以申请的内存单元一般为4个和8个;而字符的存放一般为1个和2个。以Visual Basic6.0为例,整数类型分成:字节型(Byte)、整型(Integer,占2个单元)、长整型(Long,占4个单元);小数类型分成:单精度(Single,4个单元)、双精度(Double,8个单元);字符类型为String。每一种类型表示的数据范围一定,在定义时一定要了解数据的范围,再选择合适的类型。例如:Visual Basic6.0的字节型(Byte)可以保存0到255的数据,如果把256赋给它,则保存不下,运行程
11、序时就会提示出错。不同的编程语言,各种类型需要的内存单元数量和表示的数据范围不同,例如整数Integer,Visual Basic6.0采用两个内存单元,表示数据范围为-32768(2的15次方)到32767;而Visual Basic.NET则采用四个内存单元,表示数据范围为-2147483648(2的31次方)到2147483647。计算机保存正整数比较容易,采用其二进制格式即可,负整数则需要采用特殊的补码格式保存,对于n位的负整数,其表示范围为。小数的存放则比较麻烦,一般采用浮点格式,即把小数表示为指数和尾数的格式分别保存,单精度和双精度小数的表示范围大约为和,它们的有效位数分别为7位和
12、15位。例如,Visual Basic6.0将某个变量定义成单精度(Single),则数据100000.01保存时,最后的1不能存放,实际保存为1000000.0。在处理小数时一定注意这样的问题。小数保存时,先转换成对应的二进制格式,再按照指数和尾数格式存放。并非所有的十进制小数都能准确地转换成相应的二进制格式,如十进制小数0.1表示成二进制(乘2取整法,即每次乘以2,将整数部分提出,保留小数部分继续乘以2,直到结果为1),为无限循环,如果保存为单精度,则保存从1向后的23位二进制(单精度格式共4个单元32位,其中1位表示正负,8位表示指数,23位表示尾数)。绝大多数小数都是保存的近似值。对于
13、同一类型的一批数据,可以采用数组形式进行定义,这样就可以使用循环结构进行处理。程序执行时,可以申请的内存区域有三处:程序中定义的数据段。每个应用程序保存其特定数据的区域,在应用程序进入内存开始运行时,就已经确定了其位置和大小。其中保存什么样的数据,每个数据存放在哪儿,都是固定的。这段内存在应用程序执行的整个过程中都是有效的,任何别的应用程序都不能占用它,只有应用程序结束后才可以释放它们再分配给其它应用程序。只要在这个区域定义的变量,在整个应用程序执行过程中都有效,这样的变量称为全局变量。实际上,应用程序在开始执行时,就是按照全局变量的定义情况来分配数据段的。另外,子程序或函数中定义的静态变量也
14、是在数据段内申请内存,因而它们在子程序或函数结束后数据仍然有效。静态变量与全局变量的区别在于静态变量只能由某个子程序或函数访问,而全局变量可以由所有的子程序和函数访问。程序中定义的堆栈段(Stack)。每个应用程序保存其临时数据的区域,该区域的位置和大小也是确定的,但程序开始运行时并不确定其中保存什么数据。在应用程序运行过程中,根据需要把特定数据保存在其中。保存在这里的数据按照先进后出的方式管理,在不同的时刻,其中的数据代表的含义不同。定义在这里的变量称为局部变量,只在某个特定范围内有效。一般,在子程序或函数内部定义的普通变量都是定义在堆栈中的,进入子程序时申请堆栈中的内存存放这些变量,数据有效,一旦子程序运行结束,系统自动释放这些内存,则数据无效。 当前系统剩余的内存。应用程序执行时根据需要从系