CTSC'92
表达式求值
我们自己设计了一种名为STR的程序设计语言,定义如下:
一个STR程序::=<TSR指令序列><,>
<TSR指令序列>::=<TSR指令> | <TSR指令序列>
<TSR指令>::=<字符串1,字符串2>
字符串1::=字符串
字符串2::=字符串 | 空串
字符串::=除“,”“<”“>”以外的任何可显示ASC字符所组成的字符序列
空串::=(不包含任何字符)
其中::=读作“定义为”,| 读作“或”,表示或的关系。
STR指令完成字符替换操作,字符串2替换字符串1。
执行一个STR程序的流程如下:
1.事先输入一个待处理的字符串,这里称之为原串;
2.从STR程序开始处取第一条指令;
3.若该指令为<,>,则退出STR程序,否则做4;
4.若该指令中的字符串1在原串中不出现,则按顺序取下一条指令,并转3。否则做5;
5.将原串中的从左至右查找到的第二个(如有多个的话)字符串1替换成字符串2,(注意①在这一步如有多个可替换处,仅替换第一个;②替换后不留空格),被替换后的原串仍称原串。做完这一步后转2。
例如 输入待处理字符串abcabcd,用前面给出的包含七条指令的STR程序来处理,分步结果
如下:
abcabcd
使用<bc,a> aaabcd
使用<aa,b> babcd
使用<ba,a> aad
使用<bc,a> bd
使用<d,> b
使用<b,finish> finish
现有三个任务需你来做:
任务1:用你熟悉的程序设计语言编一个能够逐条解释执行任意一个STR程序的程序。STR程序放在有“.STR”为后缀的文本文件中。作为待处理的字符串(原串),用你所用的程序设计语言由键盘输入,要求将执行STR程序对原串进行处理的每一步都显示出来。格式为:
原串
使用<TSR指令> 变化后的原串
使用<TSR指令> 变化后的原串
· ·
· ·
注意:任务1要求编写一个对于任何一个STR程序都适用的通用的解释执行程序。
任务2:用STR语言编一个程序,完成如下功能:
对于形如
数字字符串1+数字字符串2=
的字符串(视为原串,其中数字字符串1和数字字符串2分别对应两个10进制正整数,)用你所编制的STR程序对原串做替换,使用程序结束时的原串恰为两个10进制正整数相加的结果。
例如 1990+123=视为原串,而所编的STR程序名为add10.str,应能对这个原串进行替换处理,最后使原串变为2113,恰为两数相加结果。将add10.str文件保留起来,用任务1的程序来检验add10.str能否正确实现任意的10进制正整数加法运算。
任务3:用你所熟悉的程序 设计语言编写一程序,该程序的功能为:如由键盘输入一个2…16的正整数n,程序会输出一个名为addn.str文件,该文件是一个STR程序,这个程序能够如任务2那样,完成任何一个n进制正整数加法运算。
CTSC'92
子串匹配
一种表达式的字义如下:
元素:=一个或多个小写英文字母组成的序列
包项:=元素 | (表达式)
连项:=包项 | 包项* | 包项#
或项:=连项 | 连项 + 或项
表达式:=或项 | 或项,表达式
其中,“:=”表示“定义为”;“ |”表示“或”关系;表达式是字符串的集合,
表达式1= 表达式1表示的集合元素
(表达式2) 与表达式相同
表达式2* 由表达式2的元素出现零次或多次而得
表达式2# 由表达式2的元素出现一次或多次而得
表达式2 + 表达式3 由表达式2的任一个元素与表达式3的任一元素顺接而得
表达式2 ,表达式3 由表达式2或表达式3的任一个元素
例:若表达式为 ((c)*+(ae)#)*+f
则 cccccaeaeaef
aeaeaeaeaeaeaeaeaef
aef
aecccaeccaef
f
都是该表达式所表示的集合中的元素。
要求编程完成这种表达式的匹配功能。由键盘输入一个表达式,并在一个名为LH.TXT的
文本文件中查找第一次匹配到的字串,并输出该子串及其位置。
该文件可认为是一个长的字符串,所谓子串位置指该子串第一个字符位置。
例:若LH.TXT内容为
abcacbbccaeaefdlkfisdalljghiersdag
输入表达式为 ((c)*+(ae)#)*+f
则输出子串为 ccaeaef
子串位置为 8
CTSC'92
称重
有6个物体分别用1-6编号,其中5个重量相同。现在有一架台秤,1次能称出放在上
面的若干物体的总重。要求编一个程序,让计算机打出一种称法,只在称3次就可以知道
每个物体的重量。具体使用时由操作者默想6个物体各自的重量,而每次由计算机用编号提问若干物体的总重量,操作者由键盘回答。如此3次后程序应能输出每个物体的重量。
CTSC'92
根据前、中序遍历求后序遍历
给定一棵二叉树的前序遍历和中序遍历序列,用你所熟悉的程序设计语言生成该二叉树,并将其后序遍历打印出来。为便于编程,二叉树的结点用单个大写英文字母表示,且结点互不重复。比如,输入前序遍历序列为DBACPMZX,中序遍历序列为ABCDMPXA,应生成的二叉树结构如下图所示:
D
/ \
B P
/ \ / \
A C M Z
/
X
应输出的后序遍历序列为ACBMXZPD
注意:你的程序应能鉴别任何的错误输入。