第二章程序设计语言
计算机工作是执行相应程序,程序规定了执行的动作和动作的执行顺序。
程序的表达手段是程序设计语言。程序设计语言是人-机交换信息的媒体;是表达软件(程序)的工具;是人-人交换信息的工具。
软件的开发和使用,协作开发、使用修改都要读程序,程序设计语言必须规范化和标准化。
程序设计语言是与计算机通信创造的语言,严格、小巧,没有二义性(语句执行只有一个解释)。
2.1  高级程序设计语言概述
最初的语言是机器语言。机器语言在内存中开辟两个区:数据区存放数据;指令区存放指令。CPU 从指令区第一个地址开始逐条取出指令并释义执行,直到所有的指令都被执行完。一般的指令格式
2.2.2高级语言程序的解释执行
编译型语言由于可进行优化(有的编译器可作多次优化),目标码效率很高,是目前软件实现的主要方式。语言编写的源程序,都需要进行编译、连接,才能生成可执行程序。编译时花费时间但程序的执行效率提高。
对高级语言源程序采取解释执行的方式.解释执行需要有一个解释器(Interpreter ) ,它将源代码逐句读入。先作词法分析,建立内部符号表;再作语法和语义分析,即以中间码建立语法树,并作类型检查。完成检查后把每一语句压入执行堆栈,压入后立即解释执行。
操作系统的命令、BASIC 、VB 、Prolog 、LISP 、Java 、Java Script 、Post script
2 .
3 .1 变量、表达式、赋值
使用符号常量,只需一次性改动其赋值就行了。赋值和函数调用是程序语言改变变量的值的基本手段。不同的语言所使用的赋值号并不完全相同,比如Pascal 语言的赋值号是“:=”,而在C 语言、Java 语言、VB 等语言中,赋值号是“=”。
程序中的一条语句对应着计算机的一条命令(用一条或多条指令来实现)。一个赋值语句就是一条赋值命令。
2.3.2 程序的控制结构
程序约定自上向下自左向右地执行,即顺序地执行语句(或表达式)。但不仅限于此,计算机之所以
能自动计算,它能通过判断将程序转到应该执行的地方。人们就是通过巧妙地安排控制转移,使计算机实施算法。
最基本的程序控制语句
在汇编语言时代就有了Jump 指令使执行跳转,对应的高级语言语句是无条件转移语句:
goto loop;
其中loop 是跳转到的语句的标号(数字或标识符),加上条件判断子句if(E)就是条件转移语句:
If(E) goto loop;
其中E 是条件(布尔)表达式,求值结果是‘真’、‘假’值。如果为‘真’转移到标号为l 的语句,为‘假’则按顺序执行下一条语句。
有了这两个语句再加上简单语句(赋值、调用、输入/出),就可以实现程序的任何执行控制。
最基本的程序控制有以下三种:
顺序执行
简单语句序列S = S1;S2;…;Sn
选择执行
结构化程序的控制结构
早期的编程语言是语句级的.用简单准语句集合加goto 构成复杂的程序控制。然而显式地使用goto 语句是极其危险的。这是因为:
· goto 语句相互交织使设计出的程序控制结构成为不可分解的一个整体。尽管算法设计精巧,但牵一发而动全身。程序一大,修改很困难。
·显式使用goto 语句使得任何写错转移语句标号的小错误都会导致灭项之灾。·使程序控制逻辑是结构化的,显式使用goto 语句,程序依然难于阅读。
出了错易于出错误并修改
易阅读导致易扩充、修改,大程序易于分析。
程序控制结构清晰,是它用关键字控制程序块(语句组)。任何控制转移不能进入这些控制块,除非
入口。块中转出也不能直接转到程序其他处,只能转到出口。在出/入口增加检查语句就使得程序错误真正局部化。
程序块级(语句组)控制采用语句括号使程序逻辑与表示法结构完全一致。可直接编程。程序语言结构化以后,编程对流程图的依赖就很少了。
Nassi-Schneldermann提出了结构化流程图(主要取消流线及箭头),因没有直接用类似结构化编程语言的伪代码方便而没有流行起来。
结构化编程语言的其他控制结构
结构化程序只需三种基本结构重复和嵌套。但为了方便编程,第三代语言派生出许多结构。以下简略说明。
条件分支
无假块条件分支和嵌套if语句
if(E) then ST endif
if(E1) then S1 elseifE2 then S2…else Sm endif
无假块条件语句是正规条件语句的简化,很常用。嵌套语句在否定部分用关键字elseif,有的语言用elsif。只有当所有条件均有‘假’时才执行else块。逐个检查m个条件效率很低,有时似无必要。
case语句
也叫分情形语句。根据条件变量Z的值单独执行S1,S2…,Sn,执行完Si自动跳到endcase(C语言例外,它要加上break才跳。否则执行Si+1到Sn)。
循环结构
除了do S while E 之外,还有do-until和for结构。
do-until语句形式是do S until E,基流程图。先执行再判断,若E为‘真’不再循环。正好和先判断再执行的do-while语句是相反的。将它改成do-while结构十分容易。条件取反,先执行一次S块。
for-do 语句
以控制变量增减值或枚举集合值计数的循环。for-do是do-while的另一种变体结构,其书写格式有多种变体。
do-while-do语句
其形式是do S1 while E do S2 enddo流程图。
把与条件无关的部分或影响E值计算的部分作无限循环。
E为‘真’才作S2,否则执行enddo后面的语句。
2.3.3 数据类型
计算机中计算对象(不管是常量、变量)都是有类型的,不能把一个实数和逻辑‘真’值(true)相加。指出数据类型的一个目的就是要避免这类错误的发生。各语言转换函数(inttoreal或realtiont)不尽相同,有的是把类型名作为转换函数名,不兼容的类型,如整数和布尔一般不能转换,但C语言例外。
数组类型
变量代表单个数据值叫纯量变量。如果代表多个(数组)或多种(记录)值就叫它结构型数据的变量。先来说数组:
以下声明可将其连接
BigArray(0)=Names() //第1元素放整个数组
bigArray(1)=ages() //第2元素也放整个数组
使用时用二维索引
BigArray(0,7)=Names(7)  //=不是VB语言符号
BigArray(1,7)=Ages(7)
记录类型
引入记录数据类型:相同或不同类型数据组成的结构叫记录.记录型记录了对象的属性信息,记录的各个组成部分,称为记录域,各个域的数据类型可以不相同。
下面给出用VB 声明的一个例子:
Type Person Record
Name As String
Age As Integer
Sex As String
Telnumber As String
Lable As Integer
EndType
类型定义中列出了属性名和属性的数据类型。记录类型变量的一组值(或一行值)称作元组(tuples ) ,由属性变量的值组成。每个属性变量指明了一个(取值)域.也叫字段。
有了这个类型就可以声明记录型变量。该变量在运算中只能按域取值,域的表示法是变量后接符号“.”再接域(属性)名。
指针类型
指针类型是一种很重要的数据类型,但同时也是一种简单却不大好理解的数据类型。在讲述指针之前,首先来看一个例子(采用C语言来描述):
Int I; //定义一个整型变量I
I=1; //i赋值为1
I=i+1; //表达式计算
在上面的例子中,首先定义一个整数型变量,然后设该变量的值为1。在第三行使用了一个赋值语句:i=i+1。现在要问,i是一个数学意义上的变量吗?如果是的话,i=i+1这个等式显然不能成立!
所以,计算机语言中的变量并不是数学意义上的变量,它代表的只是计算机内存中的一个存储单元。这个单元中存放的内容是变化的,所以把它叫做变量。
每个变量都有一个名字(标识符),对应为存储单元的地址,存储单元的内容为变量的值。引用变量的值时直接把变量名放到用值的地方(赋值语句的两边)。程序运行时按地址存取内容。如果某个变量的值是内存中的地址.这个变量叫指针变量。
C 语言中指针类型如同数组类型,以类型指明符‘*’表示。它所指向的对象是有类型的。
Int i *p;// 声明i为整型,P为整型对象的指针
char c, *pCh;// 声明c 为字符型,pCh 为指向字符里对象指针
‘*’放在变量标识符之前,出现在类型标识符之后,指明它所修饰的标识符是指向该类型对象的指针.p 是指向整型的指针,* p 是p 所指向的无名变量的代名词.声明完成后变量p 有存储单元但无内容.
同样,类型说明符‘& ’说明它所修饰的标识符为引用类型的变量。
int 1 . & r = i ;
2.3.4 过程
例如要三次求正弦值,不是连续写三个求正弦值的程序,而是把这段程序从主程序
分离开来,简称过程,可以多次调用。分离出来的部分叫子例程(routine ) ,执行完后依然返回原处。带返回位的叫函数过程,不带返回值的叫子例程过程.简称子程序。函数的自变量(参数)为x ,并指出其函数(返回)值是Double 类型.每当程序中出现求正弦时,直接调用该过程,称函数引用,即引用该函数的(返回)值。一个主程序中写三段相似代码的执行情况是一样的,只是省写了两次,多了三次实参和形参匹配(置换)的执行过程。函数过程是参数化(更抽象)的程序。
使用过程还可以降低程序复杂性、使程序结构变得消晰明了。假设有一个主程序引用了30 个函数,每个函数引用了100 次,如果在每个引用函数的地方都要写出函数的代码的话,程序将变得十分繁杂。如果使用函数,就显得简明清晰。还可以提高编程效率。许多可以标准化的函数,可以事先编写调试好,放到函数库中,使用时直接调用即可。
过程的定义
从过程关键字开始到过程结束之间的一段封闭的程序就是过程定义,它由型构(signature )和过程体(body )组成,以下是两种过程定义的结构:
Function Fname(形式参数表)AS返回类型‘本行为函数型构’
[类型和数据声明]  ‘以下是函数体’语句集
End Func
sub 名字《形式参数表》‘本行是子程序型构’
[ 类型和数据声明]  ‘以下是子程序体语句集
EndSub
以上可以看到除了关键字和形参表外过程和一般的程序没什么两样。函数过程型构只比子程序型构多一个返回类型。有的语言规定函数名必须在函数体中至少在赋值号左边出现一次,以便带回返回值,如VB 。有的语言可指定任何返回表达式,如C 。主程序中的数据通过型构的形参表进入过程。在过程中也可以声明数据,不过这类数据与主程序没什么关系,主程序中无法访问它们,它们是局部变量。
局部变量的有效范围,即作用域(s cope )仅限于本过程。从主程序一侧看,这些局部变量都被过程隐藏起来了,只有型构中的参数表是通向外部的窗口(在此交换数据),所以型构也叫接口(Interface) .为与一般变量区别把形参表中的变量称为变元(Argument )。请看下面的两个例子
过程调用
函数过程因返回位可以出现在主程序的表达式中,以函数名引用函数值。并列出与形参表变元的个数、类型、次序一样的实在参数表.如
Fahrenheit = Degress(42.0) //函数引用作为表达式
子程序过程的使用是过程调用,它相当于浓缩的一段程序。
PrintNStar5 //调用过程,打印五个星号
过程调用是把过程体的代码调回到主程序的环境下执行。形参和实参变元匹配之后过程运行,和主程序中其他代码运行没什么两样.主程序中声明的变量在过程中自动可用。
全程变量和局部变量,局部变量在过程执行完之后所有的数据和过程体都消失了,因此出了过程体再引用过程中的变量当然出错。过程调用这种执行机制,为程序运行、节省内存空间带来了极大
程序设计语言一般可分为三大类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。