一、基本概念
在计算机中,程序设计语言可划分为低级语言和高级语言两大类,与高级语言相比,用低级语言开发的程序,其运行效率高,但开发效率低。与程序设计相关的基本概念如下。
(1)低级语言:又称面向机器语言,它是特定的计算机系统所固有的语言。
(2)汇编语言:是机器语言的一种提升,它使用了一些助记符来表示机器指令中的操作码和操作数。但它仍然是一种和计算机机器语言十分接近的语言,使用起来仍然不太方便。
(3)高级语言:与人们的自然语言比较接近,使用起来很方便,也极大的提高了程序设计效率。
(4)编译程序:也称编译器,将源程序翻译成目标语言程序,然后在计算机上运行目标程序。虽然执行效率高,但编写出来的程序可读性很差,且难以修改和维护。
(5)解释程序:也称解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行。
(6)程序设计语言:程序设计语言的定义都涉及语法、语义和语用等方面。
(7)语法是指由程序语言的基本符号组成程序中的各个语法成分(包括程序)的一组规则,其中由基本字符构成的符号(单词)书写规则称为词法规则,由符号构成语法成分的规则称为语法规则。
(8)语义是程序语言中按语法规则构成的各个语法成分的含义,分为静态语义和动态语义。
(9)语用表示了构成语言的各个记号和使用者的关系,涉及符号的来源、使用和影响。
(10)语境是指理解和实现程序设计语言的环境,包括编译环境和运行环境。
二、程序设计语言的分类
1.命令式程序设计语言
命令式程序设计语言是基于动作的语言,在这种语言中,计算被看成是动作的序列。
结构化程序设计语言属于命令式语言类,其结构特性主要有:一是用自顶向下逐步精化的方法编程,二是按照模块组装的方法编程,三是程序只包含顺序、判定(分支)及循环结构,而且每种构造只允许单入口和单出口。C语言、PASCAl等都是典型的结构化程序设计语言。
2.面向对象程序设计语言
面向对象的程序设计在很大程度上应归功于从模拟领域发展起来的Simula,Simula提出了类和对象的概念。C++、Java和smalltalk是面向对象程序设计语言的代表。
3.函数式程序设计语言
函数式程序设计语言是一类以λ-演算为基础的语言,其概念来自于Lisp,一个在 1958年为了人工智能应用而设计的语言。函数是一种对应规则(映射),它使定义域中每个元素和值域中唯一的元素对应。
函数定义1:Square[x]:=x×x
函数定义2:Plustwo[x]:= Plusone[Plusone[x]]
函数定义3:fact[n]:=if n =0 then 1 else n×fact[n-1]
4.逻辑型程序设计语言
逻辑型程序设计语言是一类以形式逻辑为基础的语言,其代表是建立在关系理论和一阶谓词理论基础上的Prolog(Programming in Logic)。Prolog程序是一系列事实、数据对象或事实间的具体关系和规则的集合。通过查询操作把事实和规则输入数据库。用户通过输入查询来执行程序。在 Prolog中,关键操作是模式匹配,通过匹配一组变量与一个预先定义的模式并将该组变量赋给该模式来完成操作。
三、程序设计语言的基本成分
1.数据成分
数据成分指的是一种程序语言的数据类型。
(1)常量和变量
按照程序运行时数据的值能否改变,将数据分为常量和变量。变量具有左值和右值,在程序运行过程中其右值可以改变;常量只有右值,在程序运行过程中不能改变。
(2)全局变量和局部变量
按照数据的作用域范围,可分为全局变量和局部变量。系统为全局变量分配的存储空间在程序运行的过程中一般是不改变的,而为局部变量分配的存储单元是动态改变的。
(3)数据类型
按照数据组织形式不同可将数据分为基本类型、用户定义类型、构造类型和其他类型。
基本类型:整型(int)、字符型(char)、实型(float、double)和布尔类型(bool)。
特殊类型:空类型(void)。
用户定义类型:枚举类型(enum)。
构造类型:数组、结构、联合。
指针类型:type *。
抽象数据类型:类类型。
2.运算成分
程序语言的运算成分指明允许使用的运算符号及运算规则。大多数高级程序语言的基本运算可分成算术运算、关系运算和逻辑运算,有些语言如C(C++)还提供位运算。
3.控制成分
控制成分指明语言允许表述的控制结构。
(1)顺序结构
顺序结构用来表示一个计算操作序列,从第一个操作开始,按顺序依次执行后续的操作,直到最后一个操作,如图2-1所示。(2)选择结构选择结构提供了在两种或多种分支中选择其中一个的逻辑,如图2-2所示。
图 2-1 顺序结构示意图 |
图 2-2 选择结构示意图 |
(3)循环结构
循环结构描述了重复计算的过程,通常由三部分组成:初始化、循环体和循环条件。主要有两种形式:while型循环结构和do-while型循环结构,如图2-3所示。
(4)C(C++)语言提供的控制语句
①复合语句
复合语句用于描述顺序控制结构。复合语句是一个整体,要么全部执行,要么一条语句也不执行。
② if语句和switch语句
if语句实现的是双分支的选择结构,其一般形式为:
- if(表达式)
- 语句1;
- else
- 语句2;
需要注意的是if和else的匹配关系。
switch语句描述了多分支的选择结构,其一般形式为:
③ 循环语句主要指while语句、do-while语句和for语句。 while语句描述了先判断条件再执行循环体的控制结构,其一般形式为:
- switch(表达式){
- case 常量表达式1:语句1;
- case 常量表达式2:语句2;
- …
- case 常量表达式n:语句n;
- default:语句n+1;
- }
do-while语句描述了先执行循环再判断条件的控制结构,其一般格式是:
- while(条件表达式)
- {
- 循环体语句;
- }
- do
- 循环体语句;
- while(条件表达式);
for语句的基本格式是:
可用while语句等价地表示为:
- for(表达式1;表达式2;表达式3;)循环体语句;
- 表达式1;
- while(表达式2){
- 循环体语句;
- 表达式3;
- }
4.函数
函数是程序模块的主要成分,它是一段具有独立功能的程序。函数的使用涉及三个概念:函数定义、函数声明和函数调用。
①函数定义
函数定义包括两部分:函数首部和函数体。函数定义描述了函数做什么和怎么做。其一般格式是:
- 返回值类型函数名(形参表)
- {
- 函数体;
- }
②函数声明
函数应该先声明后引用。如果程序中对一个函数的调用在该函数的定义之前进行,则应该在调用前对被调用函数进行声明。函数原型用于声明函数。函数声明的一般形式为:
- 返回值类型函数名(形参表);
③函数调用
当在一个函数(称为主调函数)中需要使用另一个函数(称为被调函数)实现的功能时,便以名字进行调用,称为函数调用。函数调用的一般形式为:
- 函数名(实参表);
四、值调用和引用调用
在C程序的执行过程中,通过函数调用实现了函数定义时描述的功能。函数体中若调用自己,则称为递归调用。C和C++通过传值方式将实参传递给形参。
调用函数和被调用函数之间交换信息的方法主要有两种:一种是由被调函数把返回值返回给主调函数,另一种是通过参数带回信息。函数调用时实参与形参间交换信息的方法有值调用和引用调用两种。
(1)传值调用(Call by Value)
若实现函数调用时实参向形式参数传递相应类型的值(副本),则称为是传值调用。
C语言采用的是传值调用的方式。传值调用最显著的特征是被调用的函数内部对形参的修改不影响实参的值。传值调用的参数传递和被调用函数内对参数的使用主要按下述原则:函数定义时形参被当作局部变量看待,在函数被调用时为形参分配存储单元;调用函数前,首先计算实参的值,调用时将实参的值放入形参的存储单元;被调用函数内部对形参单元中的数据进行直接访问。
(2)引用调用(Call by Reference)引用是C++中增加的数据类型,当形式参数为引用类型时,形参名实际上是实参的别名,函数中对形参的访问和修改实际上就是针对相应实际参数所作的访问和改变。
实际上,引用调用是将实参的地址传递给形参,使得形参的地址就是对应实参的地址。引用调用的参数传递和被调用函数内对参数的使用主要按下述原则处理:函数定义时形参被当作局部变量看待,在函数被调用时为形参分配存储单元;调用时将实参的地址放入形参的存储单元;被调用函数内部对形参单元中的数据(地址)进行间接访问。
怎么考
【试题 2-1】2011年 11月真题 20
若C程序的表达式中引用了未赋初值的变量,则( 20)。
(20)A. 编译时一定会报告错误信息,该程序不能允许
B. 可以通过编译并运行,但运行时一定会报告异常
C. 可以通过编译,但链接时一定会报告错误而不能运行
D. 可以通过编译并运行,但运行结果不一定是期望的结果
分析:全局变量和静态局部变量在定义时如果没有初始化,编译时会自动初始化为0;而普通的局部变量,如果没有初始化,则其值是一个随机数。在 C程序表达式中,只要引用的变量定义了,就可以通过编译并运行,但运行结果不一定是期望的结果。【答案:d】
【试题 2-2】2011年 11月真题 49、50
函数t、f的定义如下所示,其中, a是整型全局变量。设调用函数t前a的值为5,则在函数中以传值调用( call by value)方式调用函数f时,输出为(49);在函数t中以引用调用(call by reference)方式调用函数时,输出为(50)。
(49)A. 12 B. 16 C. 20 D. 24
(50)A. 12 B. 16 C. 20 D. 24
分析:本题主要考查函数调用时参数的传递方式。如果采用传值方式调用,则形参值的变化不会影响实参;而采用引用方式调用,则形参值的变化直接反映到实参。
本题中如果在函数t中采用传值方式调用函数f,a的值传给形参r,在函数f中,a的值变为6,r的值为10并返回赋给变量x,由于a是全局变量,退出函数f后a的值依然为6,所以函数t的输出结果为16。如果函数t采用传引用方式调用函数f,则形参r就是对实参a的引用,对r的修改就是对a的修改,在执行a=r+1时,a和r的值都变为6,执行r=r*2,a和r的值都变为12,并将r的值返回给x,因此函数t的输出结果为24。
【答案:(49)B (50)D】
【试题 2-3】2011年 11月真题 57
在KMP模式匹配算法中,需要求解模式串 p的next函数值,其定义如下(其中, j为模式串字符的序号)。对于模式串“abaabaca”,其next函数值序列为( 57)。
(57)A. 01111111 B. 01122341 C. 01234567 D. 01122334
分析:模式串“abaabaca”的next函数值序列如下。
当j=1时,next[1]=0;当j=2时,k不存在,next[2]=1;当j=3时,不存在满足条件的k,next[3]=1;当j=4时,p1=p3=a,存在k=2,使得 ' p1 p2 Lpk .1'=' pj.k +1 pj.k +2 L pj.1' ,故next[4]=2;当j=5时,存在k=2,使得 ' p1 p2 Lpk .1'=' pj.k +1 pj.k +2 L pj.1' ,即p1=p4=a,故next[5]=2;当j=6时,存在k=3,使得’p1p2’ =’p4p5’ ,故 next[6]=3;当j=7时,存在k=4,使得’p1p2 p3’ =’p4p5 p6’ ,故next[7]=4;当j=8时,不存在满足条件的k值,故 next[8]=1。【答案:B】
【试题 2-4】2011年 5月真题 22
若一种程序设计语言规定其程序中的数据必须具有类型,则有利于( 22)。
①在翻译程序的过程中为数据合理分配存储单元
②对参与表达式计算的数据对象进行检查
③定义和应用动态数据结构
④规定数据对象的取值范围及能够进行的运算
⑤对数据进行强制类型转换
(22)A.①②③ B.①②④ C.②④⑤ D.③④⑤
分析:数据是程序操作的对象,类型说明数据占用的内存和存放形式。数据类型不仅可用于在基础机器中完成对值得布局,还可以用于检查表达式中对运算的应用是否正确。【答案:B】
【试题 2-5】2011年 5月真题 48
以下关于高级程序设计语言翻译的叙述中,正确的是( 48)。
(48)A.可以先进行语法分析,再进行词法分析
B.在语法分析阶段可以发现程序中的所有错误
C.语义分析阶段的工作与目标机器的体系结构密切相关
D.目标代码生成阶段的工作与目标机器的体系结构密切相关
分析:对于高级程序设计语言,编译程序会把编写的源程序翻译成与之等价的目标程序。编译程序的工作过程分为:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。语法分析要在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位。可见,要先进行词法分析,然后进行语法分析,故选项A错误。在语法分析阶段能发现语法错误,但不能发现语义错误,因此选项B错误。语义分析阶段主要检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用,可见,语义分析阶段工作与与目标机器的体系结构关联不大,选项C错误。目标代码生成阶段的任务是把中间代码变化成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。【答案: D】
【试题 2-6】2011年 5月真题 50
传值与传地址是函数调用时常采用的信息传递方式,( 50)。
(50)A.在传值方式下,是将形参的值传给实参
B.在传值方式下,形参可以是任意形式的表达式
C.在传地址方式下,是将实参的地址传给形参
D.在传地址方式下,实参可以是任意形式的表达式分析:在传值方式下,是将实参的值传给形参,形参不能向实际参数传递信息;实参可以是表达式或常量,也可以是变量或数组元素。
在传地址方式下,是将实参的地址传给形参,实参和形参都指向同一个对象,被调用函数中对形式参数的修改实际上就是对实际参数的修改,可以实现数据的双向传递。实参必须是变量地址、数组名,不能是表达式或常量。
形参就是形式参数,用一个变量来代表,不能是表达式。【答案:C】
【试题 2-7】2010年 11月真题 50
以下关于汇编语言的叙述中,错误的是(50)。
(50)A.汇编语言源程序中的指令语句将被翻译成机器代码
B.汇编程序先将源程序中的伪指令翻译成机器代码,然后再翻译指令语句
C.汇编程序以汇编语言源程序为输入,以机器语言表示的目标程序为输出
D.汇编语言的指令语句必须具有操作码字段,可以没有操作数字段
分析:汇编程序的功能是将会变语言所编写的源程序翻译成机器指令程序。汇编语言源程序语句可分为指令语句、伪指令语句和宏指令语句。指令语句汇编后产生相应的机器代码;伪指令语句指示汇编程序在汇编源程序时完成某些操作,汇编后不产生机器代码。【答案:B】
【试题 2-8】2010年 11月真题 64
下面C程序段中count++语句执行的次数为(64)。
for(int i=1;i<=11;i*=2)
for(int j=1;j<=i;j++)
count++;
(64)A.15 B.16 C.31 D.32
分析:第1轮循环,i=1,count++执行1次,然后i=2;第2轮循环,i=2,count++执行2次,然后i=4;第 3轮循环,i=4,count++执行4次,然后i=8;第4轮循环,i=8,count++执行8次,然后i=16,i>11,不满足循环条件,循环结束。可以计算count++语句执行的次数为:1+2+4+8=15【答案:A】
【试题 2-9】2010年 5月真题 33
程序的三种基本控制结构是(33)。
(33)A.过程、子程序分程序 B.顺序、选择和重复
C.递归、堆栈和队列 D.调用、返回和跳转
分析:程序的三种基本控制结构是顺序结构、选择结构和重复结构。【答案:B】
【试题 2-10】2009年 5月真题 20
函数调用时,基本的参数传递方式有传值与传地址两种,( 20)。
(20)A.在传值方式下,形参将值传给实参
B.在传值方式下,实参不能是数组元素
C.在传地址方式下,形参和实参间可以实现数据的双向传递
D.在传地址方式下,实参可以是任意的变量和表达式
分 析:首先看A选项,传值方式下,对应的实参和形参是两个独立的实体,占用不同的内存单元,调用函数时,系统把实参值复制一份给形参,便断开二者的联系,形参值的改变对实参无影响。因此,“传值”是单向的,只能由实参传递给形参。
B选项,形参为传值方式下的简单变量,实参可以是与其同类型的常量、变量、数组元素或表达式。
C选项,在传址方式下,函数调用时,系统将实参的地址传递给形参,即这时参数传递的不是数据本身,而是数据在内存中的地址。所以在函数被调用中,任何对形参的访问,都被认为是对形参的间接访问。实参与形参占用相同的存储单元,传递方式是双向的,形参值的改变将影响实参值。故C选项正确。
D选项,形参为传址方式时,实参如果为常量或表达式,则传址无效,相当于传值方式。【答案: C】
【试题 2-11】2009年 5月真题 22
下面关于程序语言的叙述,错误的是( 22)。
(22)A.脚本语言属于动态语言,其程序结构可以在运行中改变
B.脚本语言一般通过脚本引擎解释执行,不产生独立保存的目标程序
C.php、JavaScript属于静态语言,其所有成分可在编译时确定
D.C语言属于静态语言,其所有成分可在编译时确定
分 析:脚本语言,又叫动态语言,是一种编程语言控制软件的应用程序。脚本语言与编程语言有很多相似地方,其函数与编程语言比较类似,也涉及到变量,它与编程语言最大的区别是编程语言的语法和规则更为严格和复杂一些。脚本语言一般都有相应的脚本引擎来解释执行,一般需要解释器才能运行。 Python、JavaScript、ASP、PHP、PERL、Nuva都是脚本语言。另外,脚本语言是一种解释性的语言,它不像 C\C++等可以编译成二进制代码,以可执行文件的形式存在。【答案:C】
【试题 2-12】2008年 12月真题 21
程序设计语言一般都提供多种循环语句,例如实现先判断循环条件再执行循环体的while语句和先执行循环体再判断循环条件的do-while语句。关于这两种循环语句,在不改变循环体的条件下,( 21)是正确的。
(21)A.while语句的功能可由do-while语句实现
B.do-while语句的功能可由while语句实现
C.若已知循环体的次数,则只能使用while语句
D.循环条件相同时,do-while语句的执行效率更高分 析:do-while语句的循环体至少执行一次,即执行1~n次,而while语句的循环体可以不执行,也可
以执行n次,因此do-while语句的功能可由while语句实现。【答案:B】
【试题 2-13】2008年 5月真题 22
下列叙述中错误的是( 22)。
(22)A.面向对象程序设计语言可支持过程化的程序设计
B.给定算法的时间复杂性与实现该算法所采用的程序设计语言无关
C.与汇编语言相比,采用脚本语言编程可获得更高的运行效率
D.面向对象程序设计语言不支持对一个对象的成员变量进行直接访问
分 析:本题考查基本概念问题。C选项明显是错误的,脚本语言与汇编语言不是一个意义层面上的语言,而且汇编语言是接近计算机硬件的语言,运行效率是非常高的。【答案:C】