《第二章程序设计语言.ppt》由会员分享,可在线阅读,更多相关《第二章程序设计语言.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一章第一章 程序设计语言程序设计语言软件技术基础软件技术基础北航可靠性工程研究所 2005,软件技术基础 第二章第二章 程序设计语言程序设计语言程序设计语言是也是人人交换信息的工具程序设计语言是人机交换信息的媒体北航可靠性工程研究所 2005,软件技术基础2.1 高级程序设计语言概述最初的语言是机器语言,例:AXAX46北航可靠性工程研究所 2005,软件技术基础用容易记忆的英文单词代替约定的指令,易读写程序,导致了汇编语言的诞生导致了汇编语言的诞生使用汇编语言编程需要:直接安排存储,规定寄存器、运算器动作次序了解数据表示的约定(定点、浮点、双精度)不同的计算机在指令长度、寻址方式、寄存器数
2、目、指令表示等都不同,使得汇编程序不仅不可移植而且读起来也很费劲 导致了高级语言的出现导致了高级语言的出现 汇编语言和高级语言的诞生汇编语言和高级语言的诞生DATA SEGMENT XX DB X YY DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,XX CMP AL,0 JGE BLGR MOV AL,0FFH MOV YY,AL HLTBLGR:JE EQUT MOV AL,01H MOV YY,AL HLTEQUT:MOVE YY,AL HLTCODE ENDS END
3、START例汇编:高级语言:如果用VB编写,本程序是:Dim x,y As Integer if x 0 then Y=1 else if x=0 then Y=0 else Y=-1 endif endif北航可靠性工程研究所 2005,软件技术基础2.2 高级程序设计语言实现计算的方式高级语言程序必须经过翻译变成机器语言程序翻译有两种做法:编译和解释,相应的翻译工具分别叫做编译器和解释器2.2.1 编译器工作原理首先是识别符号串:关键字、字面量、标识符、运算符、注释行、特殊符号等六类符号,这个过程就是词法分析(Lexical Analysis)第二步作语法分析(Syntax Analysi
4、s)一个语句就作为一串记号流由语法分析器处理。按照语言的文法检查每个语法分析树第三步作语义分析(Semantic Analysis)对各句子的语法树作检查:运算符两边类型是否相兼容;该作哪些类型转换;控制转移到不该去的地方;是否有重名等等。若有错转出错处理,否则生成执行代码第四步是中间代码生成。中间代码是向目标码过渡的一种编码,形式尽可能和机器的汇编语言相似,但不涉及具体机器的操作码和地址码。好处是可在中间码上作优化第五步是优化。对中间码程序作局部和全局优化,使运行更快,占用空间最小第六步是代码生成。生成目标机器的目标码(或汇编)程序源程序.c目标程序.obj可执行程序.exe结果编译连接执行
5、北航可靠性工程研究所 2005,软件技术基础2.2.2 高级语言程序的解释执行解释执行需要有一个解释器(lnterpretor),它先作词法分析,建立内部符号表;再作语法和语义分析,即以中间码建立语法树,并作类型检查。完成检查后把每一语句压入执行堆栈,压入后立即解释执行北航可靠性工程研究所 2005,软件技术基础操作系统的命令、BASIC、VB、Prolog、LISP、Java、Java Script、Post Script都是解释执行的,各种应用软件提供的界面语言(一般都很小)多半是解释执行的。解释器不大,工作空间也不大、能根据程序执行情况决定下一步做什么(人工智能经常是这样的)是它的优点,
6、不过,解释执行难于优化、效率较低,这是这类语言的致命缺点北航可靠性工程研究所 2005,软件技术基础2.3 高级程序设计语言基本特征2.3.1 变量、表达式、赋值计算的数据对象特别是计算结果的对象在编程时是不存在的。我们只能用变量变量表示它例:已知三角形三边长度求面积:s:=0.5*(a+b+c)area:=sqrt(s*(s-a)*(s-b)*(s-c)其中a,b,c,s,area是变变量量,0.5是常常量量(也是字面量),“+”和“*”是运算符运算符,sqrt是开平方函数函数表表达达式式是常量、变量、函数调用或者由它们和运算符组成的序列:=:=是是赋赋值值号号它将右端表达式算出的结果赋给左
7、端的变量北航可靠性工程研究所 2005,软件技术基础2.3.2 程序的控制结构-条件语句有了条件判断if(E)then TB else FB end if,打破了自上至下逐句执行的模式当表达式E E为真时,执行TBTB块那一组语句 为假时跳过TBTB块执行FBFB块那一组语句早期的if 语句借助goto语句改变执行顺序但这种无条件goto不能保证结构的完整性,即另外某处也可以goto到这个条件分支中北航可靠性工程研究所 2005,软件技术基础2迭代语句例如,求自然数1到10000之和的程序北航可靠性工程研究所 2005,软件技术基础迭代结构的一般式有几种:while(E)do S enddo
8、表达式E为真执行S,直至E为假 (a)当循环Do S Until(E)先执行S再查看E,E为真不重复 (b)直到循环for(i=E0;E1;E2)do S enddo i得 初 值 E0,判 断iE2,执行S后i增量E1,判断若iE2,出for-do (c)计数循环北航可靠性工程研究所 2005,软件技术基础(1 1)结构化程序控制)结构化程序控制北航可靠性工程研究所 2005,软件技术基础北航可靠性工程研究所 2005,软件技术基础(2)其它控制结构)其它控制结构方便使用的变体:Case语句是嵌套if的简化Do-until,for-do均为while-do变体北航可靠性工程研究所 2005,
9、软件技术基础其它控制其它控制Call-return:程序单元间的转移,执行后返回原地。Exception-raise:程序出了异常情况,raise(引发)后,正常执行转到异常处理程序段,并不再返回。在C+中,使用的是try throw结构,在VB中是ON ERROR GOTO 语句。Abort(STOP):强行停止执行。Exit:转到本程序块末端。Delay XX:延迟XX时间后继续执行。北航可靠性工程研究所 2005,软件技术基础 2.3.2 数据类型计算机中计算对象(不管是常量、变量)都是有类型的,类型不同内部表示不同,就是象12+32.7这种简单的计算也是不允许的,要先做类型转换才能计算
10、1.常用的基本类型北航可靠性工程研究所 2005,软件技术基础强类型语言(所谓强类型,就是编译时所有变量类型均确定,类型转换必须显式地给出)无类型语言则无需变量的类型声明,给它什么值它就是什么类型。2.2.数组数组Dim Names(15)As String声明16个元素数组,每个元素都是字符串类型Dim Matrix(9,9)As Double是10*10=100元素的方阵,元素为双精度浮点数不同类型的一维数组能否组成一多维数组?一般语言不可以,VB利用Variant可以把它们联接起来并把它叫做数组的数组北航可靠性工程研究所 2005,软件技术基础3.3.记录记录相同或不同类型数据组成的结构
11、叫记录。记录型记录了对象的属性信息,记录的各个组成部分,称为记录域,各个域的数据类型可以不相同。用VB声明的一个例子:Type Person RecordName As StringAge As IntegerSex As StringTelnumber As StringLable As IntegerEndtype北航可靠性工程研究所 2005,软件技术基础在VB中,可以这样声明数组型变量:Dim Student1 As Person Record访问记录元素用点表示法:Student1.Name=“ChangShan”Student1.Age=20Student1.Sex=“Male”S
12、tudent1.Telnumber=“(010)62783294”北航可靠性工程研究所 2005,软件技术基础4.4.指针类型指针类型变量P中存放的是另一个变量A的地址,而变量A中存放的却是数值:123在讲述指针之前,让我们首先来看一个例子(我们采用C语言来描述):int I;/*定义一个整型变量 I */I=1;/*I赋值为1 */I=I+1:/*表达式计算 */计算机语言中的变量,代表的只是计算机内存中的一个存储单元,单元中存放的内容是变化的若变量中存放的不是对象,而是另一个变量在计算机内存中的存储地址,则 这种变量被称为指针变量指针变量指针变量指针变量北航可靠性工程研究所 2005,软件
13、技术基础提供指针类型的语言一般都提供两种与指针有关的操作:取地址操作和取值操作取值操作取值操作取的是指针所指的变量的值,*P=123取地址操作取地址操作取的是变量的内存地址,P=&A若给指针赋了初值,并在程序的运行期间不再改变,则称这种指针为常量指针常量指针指针是一种简洁、灵活的语言对象。审慎的使用可以显指针是一种简洁、灵活的语言对象。审慎的使用可以显著提高编程的灵活性和效率,但不负责任的使用将使你著提高编程的灵活性和效率,但不负责任的使用将使你掉进错误的深渊。掉进错误的深渊。北航可靠性工程研究所 2005,软件技术基础 2.3.4 过程北航可靠性工程研究所 2005,软件技术基础函数过程Fu
14、ncion Fname(形参表)As 返回类型 类型和数据声明 语句集End Function子程序过程Sub 名字(形参表)类型和数据声明 语句集End Sub主程序中的数据通过型构型构中的形参表形参表进入过程1.过程的定义过程的定义(由型构和过程体组成)在过程中声明的变量是局部变量,只在过程中有效2.过程调用函数过程用函数名引用,需有与形参表变元的个数、类型、次序一样的实参表,子程序过程的引用是过程调用,也要有实参表形参和实参匹配后,主程序中声明的变量在过程中自动可用。但反过来不行外块的变量与内块同名:就近声明优先通过点表示法才能出现在内块(P.X5.0)and X北航可靠性工程研究所 2
15、005,软件技术基础2.3.5 过程的数据传递-无参过程过程的型构中没有形参表定义,调用时不需要实参。过程中用到的数据是所在环境的全程量或自己内部声明的局部量2.2.传递变元传递变元从主程序向过程传递数据可以有两种方式:传值和引用 引用Function Add(n1,n2 As Integer)As Integer Add=n1+n2 n2=0 n1=0 End FunctionDim A,B As Integer A=10 B=2 Sum=Add(A,B)Debug.Print A Debug.Print B Debug.Print Sum 若函数中不加方括号中内容,则打印结果为:10 2
16、12 若函数中加上方括号中内容,则打印结果为:0 0 12主程序向过程Add传递A、B时,把A、B的地址结合到n1、n2上。即引用主程序中的值。传值:A B的值拷贝到n1 n2中,过程中n1 n2改变 A B 不变例如Pascal:Function F(Var X Y:float)return float;-引用 Function F(X,Y:float)return float;-传值北航可靠性工程研究所 2005,软件技术基础2.3.6 变量的生命期和Static变量程序中的变量生命期随其声明所在程序块而异按其“寿命”的长短有:若需要一个局部变量在局部程序块消失后依然保留其值,又不希望它是
17、全局变量被该局部块以外的程序引用,则可使用静态(Static)局部变量注意:Static 变量在局部模块中声明北航可靠性工程研究所 2005,软件技术基础2.3.7 输入/输出程序的输入/输出分作两大类:程序之间以文件形式进行数据传递。人机交互,一般由高级程序设计语言以过程调用的形式实现。过程在高级语言内部通过操作系统调用完成北航可靠性工程研究所 2005,软件技术基础2.4 面向对象程序语言的基本特征面向对象语言是过程式语言的进一步发展。2.4.1 对象概述过程式程序的结构是层层调用,下层程序除自己声明的数据而外共享上层程序声明的数据一个子程序改动了共享数据则另一个必然受影响。我们叫它数据耦
18、合北航可靠性工程研究所 2005,软件技术基础“分而治之”的思想使我们想到进一步封装,即把相关的数据与过程装在一起,尽可能让它独立。设想有一程序有100个子程序,经过分析,这100个子程序并不是每个子程序都要用到所有的数据,把数据相关和程序相关(有嵌套调用)的分成组。数据叫做对象的属性属性属性属性(Attribate),操作则改称方法方法方法方法(Method),即改变属性的方法。对象间相互只有通信,“调用”方法叫发消息发消息发消息发消息(Message)这样封装的程序块是一个复杂的计算对象,私有的数据描述了本对象的状态,操作表示了本对象的行为 对象接受外界的消息而动作,改变对象内部的状态北航
19、可靠性工程研究所 2005,软件技术基础2.4.2 类与对象对象是封装了属性和方法的实体,客观世界的对象往往有许多相似之处,我们沿用程序中表达数据的抽象办法,定义一类对象然后声明它的不同实例。Dim v As Double v是双精型的数据变量Dim OK As Command Button OK是按钮类的对象变量这个类CommandButton是系统事先定义好的,OK是 它 的 实 例 对 象。有 着 和CommandButton一样的属 性和方法,只是要给出各属性的值。类是生成实例的样板,是实例加工厂北航可靠性工程研究所 2005,软件技术基础堆栈类Class char_stack int
20、 size /私有属性 char *tos,*end;char*spublic:/公共方法 char_stack(int sz);char_stack();int push(char c);char pop();char top();再单写各方法定义,如:int char_stack:push(char c)return *tos=end?*tos+=c:0;北航可靠性工程研究所 2005,软件技术基础有了这个类就可以对实例对象作计算了,下面给出该类的使用例子:main()char c char_stack stk1(100)/声明一实例对象stk1 stk1.push(%)/压入%到stk1
21、中 stk1.push(#)c=stk1.pop()/从stk1中弹出一字符 if(stk1.top()=#).else 北航可靠性工程研究所 2005,软件技术基础2.4.3 类定义类封装了属性和方法类中的成员原则上是类私有(private)的,外部是看不到也不得访问的。为了保证与类外界通信可以定义公有(public)属性。上例中属性全部是私有方法全部是公有的。当然,也可以定义公有数据和私有方法由于类的数据结构比较复杂,类一般有构造(实例的)函数(constructor)和析构函数(Destructor)。它们都可以重复定义多次(以不同的方法构造实例)北航可靠性工程研究所 2005,软件技术
22、基础面向对象的封装性可以支持各独立对象的协作计算,不需要主控对象。在其它类的方法定义中,可以嵌入向另外一些类发消息的语句,各类的方法互相发消息,只要其中某几个类的实例是事件触发的北航可靠性工程研究所 2005,软件技术基础2.4.4 类继承每个类都可以派生许多子类,子类继承父类的属性和方法。子类子可以派生它的子类派生类只需定义自己的属性和方法雇员信息继承关系北航可靠性工程研究所 2005,软件技术基础2.5 网络计算时代的编程语言分布式客户/服务器计算时代(1885-1995),大大改变了单主机计算时代的应用开发概念。Intrenet使计算机应用的概念又面临一次大跃进数据描述语言(HTML,XML)脚本语言(JavaScript,VBScript,PostScript)平台无关的编程语言(Java)北航可靠性工程研究所 2005,软件技术基础2.4.5 多态性由于继承,属性和方法可能重名,这就产生了多态(同一名字执行内容不同)。静态(在编译或连接(Linking)时就可以分辨的叫重载(overloading),例如,多个构造函数是最常见的。运行中根据执行情况才能决定束定到哪个方法体叫动态束定