程序语言
程序设计语言基本概念
- 函数调用时,传值方式:
(1)传值(函数调用方式为值调用或传值调用):a.将实参的值传递给形参;b.实参可以是表达式、常量、变量或数组元素;c.传递是单方向。
(2)传地址(函数调用方式为引用调用):a.将实参的地址传递给形参;b.实参必须是变量数组名或数组元素,不能是表达式或常量;c.对形式参数的修改实际上就是对实际参数的修改,可以实现数据的双向传递。
例题1:函数main()、f()的定义如下所示,调用函数f()时,第一个参数采用传值方式,第二个参数采用传引用方式,main()函数中print(x)执行后输出的值为(B)。
A.11 B.40 C.45 D.70解析:x=5,f(6,5),调用f(int x,int &a),即f()函数中的x=6,main()函数中x的地址赋给a,a和main()函数中的x双向传递,f()函数中 x = xx-1 = 66-1 = 35;a=x+a = 35+5 = 40,即main()函数中的x值为40。
例题2:函数t、f的定义如下所示,其中,a是整型全局变量。设调用函数t前a的值为5,则在函数t中以传值方式调用函数f时,输出为(B);在函数t中以引用方式调用函数f时,输出为(D)。
A.12 B.16 C.20 D.24解析:
值传递:a=5,int x = f(5),r = 5,a = r+1 = 5+1 = 6,r = r2 = 52 = 10,x = f(a)= 10,a+x = 6+10 = 16;
引用传递:形参r指向实参a的存储空间,即r与a指向同一个存储单元,a = r = 5,a = r+1 = 6,a和r的值变为6,r = r*2 = 12,a和r的值变为12,x为f(a)的返回值为12,a+x = 12+12 = 24。
- C/C++:
(1)是否对变量赋初值:在编写C/C++程序时,为所定义的变量赋初值时良好的编程习惯,而赋初值不是强制要求,因此编译程序时不会检查变量是否赋初值。如果未赋值,则该变量表现为一个随机数,最终表达式的结果是不确定的。即未赋初值,可以通过编译并运行,但运行结果不一定是期望的结果。
(2)更适合用来开发操作系统。C/C++是编译型程序设计语言,常用于进行系统级软件开发,java、Python、JavaScript都是解释型程序设计语言,其中Python、JavaScript是脚本语言。
(3)指针变量:变量是内存单元的抽象,用于在程序中表示数据。当变量存储的是内存单元地址时,称为指针变量,或者说指针变量指向了另一个变量。
a. 指针变量可以是全局变量,也可以是局部变量;
b. 无论指针变量指向何种变量,其存储空间大小都是一样的(与指针所指向的变量大小无关);
c. 当指针变量指向数组中的一个元素时,对指针变量进行算术运算可以使其指向同一个数组中的其他元素,即对指针变量进行算数运算是有意义的。
- 程序设计语言:
(1)基本成分包括:数据、运算、控制、传输。
(2)控制成分包括:顺序、选择、循环。
(3)高级程序设计语言不依赖于具体的机器硬件。
(4)局部变量:在函数内部定义的变量都是局部变量,也称作内部变量,作用域是从定义位置起至函数体或复合语句体结束为止。局部变量的值通常在其生存期内是变化的。
(5)常量:程序中常量的值在运行时不能改变。
(6)动态语言:在程序运行时可以改变其结构。动态语言都是解释型语言。优点是方便阅读;缺点是不方便调试、不利于理解等。
(7)脚本语言:脚本语言都是动态语言。常用于描述格式化和链接,采用解释方式实现,编程效率低于编译型语言。例如:javascript(浏览器脚本);php(服务器脚本);Python。
(8)一个程序语言提供链表的定义和运算,由于链表的节点空间需要程序员根据需要申请和释放,因此,程序运行时,数据空间应采用堆存储分配策略。
- 程序设计语言的语义分类:
(1)静态语义:静态语义分析方法是语法制导翻译;
(2)动态语义:
- 可视化程序设计:
(1)设计原则是“所见即所得”,即随时可以看到结果,程序与结果的调整同步;
(2)特点:
a. 基于面向对象的思想,引入了控件的概念和事件驱动;
b. 程序开发步骤:先进行界面的绘制工作,再基于事件编写程序代码,以响应鼠标、键盘的各种动作。
例题1:以下关于可视化程序设计的叙述中,错误的是(A)。
A. 可视化程序设计使开发应用程序无需编写程序代码
B. 可视化程序设计基于面向对象的思想,引入了控件和事件驱动
C. 在可视化程序设计中,构造应用程序界面就像搭积木
D. 在可视化程序设计中,采用解释方式可随时查看程序的运行效果
-
在源程序中,可由用户(程序员)为变量、函数、数据类型等命名。
-
Lisp:
LISP是一种通用高级计算机程序语言,是因人工智能而设计的语言,长期以来垄断人工智能,是一种声明式系内函数式程序设计语言,有别于命令式系内过程式的C、Fortran和面向对象的Java、C#等结构化程序设计语言。
-
一种程序设计语言规定其程序中的数据必须具有类型,其好处是:
(1)有利于在翻译过程中合理分配存储单元;
(2)有利于对参与计算的数据对象进行检查;
(3)有利于规定数据对象的取值范围并进行计算。
- 程序运行的内存空间:
(1)代码区:
(2)静态数据区:存储全局变量;
(3)栈区和堆区:也称为动态数据区。
-
运行时结合是动态绑定,编译时结合是静态绑定。
-
标记语言:
(1)HTML:超文本标记语言;
(2)XML:可扩展的标记语言;
(3)WML:是XML的子集,语法和XML一样;
- KMP模式匹配算法:
KMP模式匹配算法通俗点说就是一种在一个字符串定位另一个串的高效算法。
例题1:在KMP模式匹配算法中,需要求解模式串p的next函数值,其定义如下(其中,j是字符在模式串中的序号)。对于模式串”abaabaca“,其next函数值序列为(B)。
A.0111111 B.01122341 C.01234567 D.01122334解析:max{ k | 1<k<j , ‘P1P2…Pk-1’ = ‘Pj-k+1Pj-k+2…Pj-1’} 表示:k在1<k<j的取值范围内,获取使‘P1P2…Pk-1’ = ‘Pj-k+1Pj-k+2…Pj-1’表达式成立的最大k值。Pn表示字符串的第n位。
(1)当j=1时,很显然next[1]=0。
(2)当j=2时,由于1<k<j,因此k无法取到合适值,因此next[2]=1。
(3)当j=3时,k的取值为2:
左边:k-1=1,‘P1P2…Pk-1’(1、2、…、k-1递增)字符串就是P1,为字符串中的第一个字符 a,
右边:j-k+1=2,j-1=2,‘Pj-k+1Pj-k+2…Pj-1’(j-k+1、j-k+2、…、j-1递增)就是P2,即字符串中的第二个字符b,显然,它们不相等,
因此next[3] = 1。
(4)当j=4时,1<k<j,k可以取值2或3:
k=2,左边:k-1=1;右边:j-k+1=3,j-1=3;即:P1=P3(a=a,成立);
k=3,左边:k-1=2;右边:j-k+1=2,j-1=3;即:P1P2=P2P3(ab=ba,不成立);
故:next[4] = 2;
(5)当j=5时,1<k<j,k可以取值2或3或4:
k=2,左边:k-1=1;右边:j-k+1=4,j-1=4;即:P1=P4(a=a,成立);
k=3,左边:k-1=2;右边:j-k+1=3,j-1=4;即:P1P2=P3P4(ab=aa,不成立);
k=4,左边:k-1=3;右边:j-k+1=2,j-1=4;即:P1P2P3=P2P3P4(aba=baa,不成立);
故:next[5] = 2;
(6)当j=6时,1<k<j,k可以取值2或3或4或5:
k=2,左边:k-1=1;右边:j-k+1=5,j-1=5;即:P1=P5(a=a,成立);
k=3,左边:k-1=2;右边:j-k+1=4,j-1=5;即:P1P2=P4P5(ab=ab,成立);
k=4,左边:k-1=3;右边:j-k+1=3,j-1=5;即:P1P2P3=P3P4P5(aba=aab,不成立);
k=5,左边:k-1=4;右边:j-k+1=2,j-1=5;即:P1P2P3P4=P2P3P4P5(abaa=baab,不成立);
故:使等式成立的k的最大值为3,next[6] = 3;
(7)同理可得,next[7] = 4;故本题答案为B。
- HTML一些常用标签:
(1)alink:设置正在点击的链接颜色。
(2)vlink:设置已点击过的链接颜色。
(3)background:设置背景图片的URL。
(4)bgcolor:设置文档整体背景颜色。
(5)<title></title>:设置文档标题。
(6)<hr>:设置分割线。
(7)<tr>:定义表格中的一行。
(8)<col>:定义表格中一个或多个列的属性值。
(9)<td>:定义表格中的一个单元格。
(10)<mailtor>:定义一个指向电子邮件地址的超级链接。
- XML文档规范:
(1)XML文件第一行必须声明该文件是XML文件以及它所使用的XML规范版本。
(2)所有的XML文档有且只有一个根元素,XML文档中第一个元素就是根元素。
(3)开始标记和结束标记必须成对使用。
汇编、编译、解释系统
- 解释器:
(1)可以直接解释执行源程序,或者将其翻译成某种中间表示形式后再加以执行。
(2)源程序和解释程序要参与到程序的运行过程中,运行程序的控制权在解释程序。
(3)翻译源程序时不产生独立的目标程序。
- 编译器:
编译是将高级语言源程序翻译成机器语言程序(汇编形式或机器代码形式)。
反编译是编译的逆过程,通常不能把可执行文件还原成高级语言源代码,只能转换成功能上等价的汇编程序。
(1)首先将源程序翻译成目标语言程序,然后在计算机上运行目标程序。
(2)运行的是与源程序等价的目标程序,源程序和编译程序都不再参加目标程序的执行过程。
(3)翻译源程序时产生独立的目标程序。
- 编译器工作过程:
编译器对高级语言源程序的处理过程可以依次划分为:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等阶段。
a. 其中中间代码生成和代码优化不是必须的;
b. 程序中的错误分为语法错误和语义错误;
c. 语义分析阶段主要处理正确的语言结构的含义信息,可以与目标机器的体系结构无关;
d. 目标代码生成阶段的工作与目标机器的体系结构是密切相关的。
例题1:与编译器相比,解释器(B)。
A. 不参与运行控制,程序执行的速度慢
B. 参与运行控制,程序执行的速度慢
C. 参与运行控制,程序执行的速度快
D. 不参与运行控制,程序执行的速度快
例题2:将编译器的工作过程划分为词法分析、语义分析、中间代码生成、代码优化和目标代码生成时,语法分析阶段的输入是(A)。
A. 记号流 B.字符流 C.源程序 D.分析树
解析:
源程序:词法分析的任务是把源程序的字符串转换成单词符号序列。
记号流:词法分析的输出,也是语法分析的输入。
分析树:如果没有语法错误,语法分析后就能正确的构造出其语法树。
括号不匹配是带典型的语法错误,会在语法分析阶段检测出来。
例题3:编译程序对C语言源程序进行语法分析时,可以确定(A)。
A. 变量是否定义(或声明) B.变量的值是否正确 C.循环语句执行次数 D.循环条件是否正确
解析:对高级语言源程序进行编译时,需建立符号表,其作用是记录源程序中各个符号(变量等) 的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。
- 编译过程中为变量分配存储单元所用的地址是(逻辑地址),程序运行时再映射为(物理地址)。
5.中间代码:
中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,使用中间代码可提高编译程序的可移植性,常见的有四元式、后缀式(逆波兰式)、三元式(也叫三地址码?不确定是否为同一个)和树。
(1)后缀式(逆波兰式)表达式:把运算符写在后面,例如,把a+b写成ab+,所以也称为后缀式。借助栈可以方便的对后缀式进行求值。求值方法:先创建一个空的栈,用来存放运算数;对表达式求值时,从左到右扫描表达式,遇到运算数,将其入栈,遇到运算符,从栈顶弹出需要的运算数并进行运算,将结果压入栈顶,如此重复,直到表达式结束;若表达式无误,则最后的运算结果就存放在栈顶,并且是栈中唯一的元素。
例题1:对于后缀表达式 a b c - + d *(其中-,+,*表示二元算数运算减、加、乘),与该后缀式等价的语法树为(B)。
解析:方法一:a b c - + d * ,按照运算规则,从左向右扫描,将运算数a b c依次放入栈中,遇到运算符-,则从栈顶取出值进行运算b - c,得到的值压入栈中,又遇到运算符+,同理将a和 ( b - c ) 取出来运算a + ( b - c ),所得结果压入栈中,遇到运算数d存入栈中,遇到运算符*,取出 ( a + (b - c) ) 和d运算 ( a + ( b - c ) ) * d,可以写为 (a ( b c - ) +) d *。
方法二:对二叉树进行后序遍历,得到的结果与该后缀表达式一致的则为与其等价的语法树。
- 语法分析方法:
(1)自上而下(自顶向下)分析法,例如:递归下降分析法、预测分析法
(2)自下而上(自底向上)分析法,例如:移进-归约分析法
文法分析
-
包含n个成员的开发小组的沟通路径最多有:n*(n-1)/2条。
-
遍历二叉树:
所谓的前序、中序、后序遍历,可以理解为访问根节点的顺序,前序即先访问根节点:根-左-右;中序即中间访问根节点:左-根-右;后序即最后访问根节点:左-右-根。
- 有限自动机:
对高级程序进行编译的过程中,有限自动机是进行词法分析的适当工具。
(1)不确定的有限自动机(NFA):对每一个可能的输入可以有多个状态转移,从接受到输入,从多个状态转移中不确定的地选择一个。
(2)确定的有限自动机(DFA):对每一个可能地输入只有一个状态的转移。
二者最大的区别是它们的转移函数不同。
例题1:下图所示为两个有限自动机M1和M2(A是初态、C是终态),(D)。
A. M1和M2都是确定的有限自动机B. M1和M2都是不确定的有限自动机
C. M1是确定的有限自动机,M2是不确定的有限自动机
D. M1是不确定的有限自动机,M2是确定的有限自动机
解析: 在本题中给出的图M1中,我们可以看到当在状态A输入0时,它可以转移到它自己,也可以转移到状态B,所以M1是非确定的。而M2中不存在这样的情况,因此是确定的有限自动机。 (???不理解)
- 正规式与正规集:
(1)正规式 ( b | ab ) 表示的正规集为{ b , ab },即 { ε,b,ab,bb,bab,abb,abab,bbb,bbab,babb,babab,abbb,abbab,ababb,ababab,… };用自然语言描述就是每个a后面都至少有一个b。
(2)正规式 ( ab* ) 表示的正规集是 { ε,a,ab,abb,abbb,abbbb,… };正规式 ( ab* )* 表示的正规集是 {aa,aab,aabb,aabbb,aabbbb,aba,abba,abbba,abab,abbab,… };用自然语言描述就是除了空串,每个串都至少有一个a。
(3)正规式 ( ab ) 和 ( a|b ) 是等价的,它们都表示 { ε,a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb,… };用自然语言描述就是用a、b构成的任何字符串。
例题1:下图所示为一个有限自动机(其中,A是初态,C是终态),该自动机识别的语言可用正规式(A)表示。该自动机所识别的字符串的特点是(必须以01结尾的0、1串)。
A. (0|1)01 B.10101 C.1*(0)01 D.1(0|10)1解析:
(1)被有限自动机所识别是指从初态开始到终态结束,所输入的字符串能够按顺序地执行下去,若到某个状态不能往下走得到下一个字符,则认为不能识别。
(2)在本题中,选项A能被识别。从初态A出发,不管经过多少个1和0之后,只能是处在A、B、C三种状态中的一种,所以在(0|1)*后,只能是处在A、B、C三种状态中的一种,不管是在那个状态,输入0后,都会处在状态B,然后输入1,都会转换到状态C,因此选项A能被该有限自动机所识别。同样的道理,我们可以知道其它选项的正规式不能被识别。(*代表无限多次的意思)。
(3)题中的自动机,从A出发到达C结束的所有路径必然包含BC这条弧(标记为1),同时到达B的弧上都标记了0,所以其识别的字符串必须以01结尾。
例题2:以下关于语言L={ anbn | n>=1 } 的叙述中,正确的是()。
A. 可用正规式 “aabb” 描述,但不能通过有限自动机识别
B. 可用正规式 “ambm” 表示,但可用有限自动机识别
C. 不能用正规式表示,但可用有限自动机识别
D. 不能用正规式表示,也不能通过有限自动机识别
解析:L = {anbn|n>=l}中的字符串特点是a的个数与b的个数相同,且所有的a都在b之前,该集合不是正规集,不能用正规式表示。 正规集可用正规式描述,用有限自动机识别。
-
若一个程序语言可以提供链表的定义和运算,因为链表的结点空间需要程序员根据需要申请和释放,因此,**数据空间应采用(堆存储)**分配策略。
-
大多数程序设计语言的语法规则用(上下文无关文法)描述即可。
例题1:简单算术表达式的结构可以用下面的上下文无关文法进行描述(E为开始符号),(B )是符合该文法的句子。
E→T|E+T
T→F|T*F
F→-F|N
N→0|1|2|3l4|5|6|7|8|9
A. 2–34 B. 2±34 C.(2+3)4 D. 24-3
- 一个文法的语言是该文法能产生的句子的集合。一个文法产生的句子是从文法开始符号出发推导出的所有终结符号串。
例题1:设某语言的语法规则用上下文无关文法G=(N,T,P,S)表示,其中N是非终结符号的集合,T是终结符号的集合,P是产生式集合,S是开始符号,令V=NUT,那么符合该语言的句子是( A)。
A. 从S出发推导的、仅包含T中符号的符号串
B. 从N中符号出发推导的、仅包含T中符号的符号串
C. 从S出发推导的、包含V中符号的符号串
D. 从N中符号出发推导的、包含V中符号的符号串
例题2:由某上下文无关文法M[S]推导出某句子的分析树如下图所示,则错误的叙述是 (A )。
A. 该文法推导出的句子必须以“a”开头B. acabcbdcc是该文法推导出的一个句子
C. “S->aAcB”是该文法的一个产生式
D. a、b、c、d属于该文法的终结符号集
解析:推导就是从文法的开始符号S出发,反复使用产生式,将产生式左部的非终结符替换为右部的文法符号序列(展开产生式用=>表示),直到产生一个终结符的序列时为止。从题中给出的分析树可得到如下的一个最左推导过程:
S=>aAcB=>aAaBcB=>acaBcB =>acabcB=>acabcbScA=>acabcbBdcA=>acabcbdcA=>acabcbdcc,
因此,acabcbdcc是该方法推导出的一个句子。其中用到的产生式如下:
S->aAcB S->Bd
A->AaB A->c
B->bScA B->b B->ε
从起始符号S出发也可以如下推导:S=>Bd=>εd=>d,即该文法推导出的句子也可以为d,因此选项A错误。
- 逻辑表达式:
例题1:逻辑表达式“a∧b∨c∧(b∨x>0)”的后缀式为( D)。(其中∧、∨分别表示逻辑与、逻辑或,>表示关系运算大于,对逻辑表达式进行短路求值)
A.abcbx0>∨∧∧∨ B. ab∧c∨b∧x0>V C. ab∧cb∧x>0∨∨ D. ab∧cbx0> ∨∧∨
解析:“逻辑与运算”的优先级高于“逻辑或运算”。
(1)“逻辑与运算”表达式“x∧Y”的短路求值逻辑是:若x为假,则可知“x∧Y”的值为假,无需 再对y求值,因此只有在x为真时继续对y求值。
(2)“逻辑或运算”表达式“x∨y”的短路求值逻辑是:若x为真,则可知“x∨y”的值为真,无需再对y求值,因此只有在x为假时继续对y求值。
(3)对于逻辑表达式“a∧b∨c∧(b ∨ x>0)”,从运算符的优先级方面考虑需先对“a∧b”求值,然后对“c∧(b∨ x>0)”求值,最后进行“∨”运算,因此后缀式为“ab∧cbx0>∨∧∨”。