CTSC1992题目

来源:互联网 发布:ubuntu vmdk文件下载 编辑:程序博客网 时间:2024/05/16 02:10

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

注意:你的程序应能鉴别任何的错误输入。


原创粉丝点击