高分求一算法
clon 2004-11-06 04:57:21 现有如下定义:
符号说明:
{...} 表示一个定义
[...] 表示内容可有可无
..|.. 表示内容多选一
‘’ 表示单引号内的字符应原样出现在实际的定义中
<...> 表示一个变量
语法定义:
<合格条件>::={<条件逻辑><条件名称>‘:’<子条件>[,...子条件n]}
<条件逻辑>::={[‘#’]‘&’|‘|’[‘+’][‘(’<课程组合格门数>[‘,’<课程组合格学分>]‘)’]}
<子条件>::={‘(’<合格条件>‘)’|<课程代码>}
举例:
例1:“&某专业合格条件:1,2,(|(2,5)选修课:(|选修课组:3,4,9)),(&必修课组2:5,6),7,8”
例2:“&某专业合格条件:1,2,(|(2)选修课:(&选修课组1:3,4,9),(&选修课组2:5,6)),7,8”
实例1:&:1,2,3,(|:14,12),(|(2,33):37,38,40),(|(2):30,31,32),(|:7,8,11)
实例2:&:(&:6,2)
说明:1、<合格条件>由字符‘&’或者‘|’开始。其中‘&’表示所有子
条件都满足合格条件才满足,即必修;‘|’表示选修。
2、选修课组可以定义多选多,方法是在‘|’后跟如‘(2,5)’这
样的定义。括号内前一个数是课程组合格所必须修的课程(组)
门数(只针对下一级),后一个数是课程组合格所需的学分。
数字0表示合格门数或合格学分没有定义。如果‘|’后没有括
号,则表示多选一,不要求学分。如果括号内只有一个数,表
示只定义合格门数。
3、多选多中,如果课程组有学分要求定义,则支持嵌套。即,对
于一个定义了学分要求的课程组,它可以有子课程组。
4、<条件名称>是一个可以为空的字符串,其中不能包含字符‘:’
以及回车换行,对于选修课组,条件名称的第一个字符不能是
半角的左括号‘(’(参见第2条)。
字符‘:’表示条件名称结束,接下来是子条件。
5、<子条件>至少要有一个,可以有多个,子条件之间用字符‘,’
(半角)分隔。
6、<子条件>可以是一个用括号对‘()’嵌套的合格条件,也可以
是一个课程代码。课程代码必须是数字。
7、实践课之前的课程是实践环节的前提。
8、语法中不得包含半角的单引号<'>,半角的双引号<">,语法字符
串总长不得超过1024个字节。
9、<合格条件>可以由字符‘#’开始,表示子条件是一个基础科段。
在整个毕业条件中,‘#’只能出现一次,即只能定义一个子条
件为基础科段。
10、在字符‘|’或‘&’之后的加号‘+’表示一个专业方向。
求一算法,如何根据这样的定义推出其中哪几门课程是必修课,哪几门是选修课