• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

高分求一算法

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、在字符‘|’或‘&’之后的加号‘+’表示一个专业方向。



求一算法,如何根据这样的定义推出其中哪几门课程是必修课,哪几门是选修课
...全文
122 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
clon 2004-11-12
虽然问题在这个贴子中没有得到解决,但还是感谢热心的朋友们
回复
johnsunac 2004-11-11
类似道理:(以下是过滤不友好字符和非法字符时使用正则表达式的做法,你可以参考一下)
web.config中:
<add key="BadWords" value="我靠#[你|您|他|她]?妈的#狗[日|养]的|妈卖.{1}#[日|操]?[你|您|他|她|它]妈的?" />
//设置要过滤的不友好或非法字符

//---------PoweredBy:阿山NET-------------------//
//---------最后更新时间:2004年2月6日----------//
public string BadWords = ConfigurationSettings.AppSettings["BadWords"];

//移除非法或不友好字符
private string CheckBadWords(string chkStr)
{
if (BadWords=="" || chkStr == "")
{
return "";
}

string[] bwords = BadWords.Split('#');
int i,j;
string str;
StringBuilder sb = new StringBuilder();
for(i = 0; i< bwords.Length; i++)
{
str=bwords[i].ToString().Trim();
string regStr,toStr;
regStr=str;
Regex r=new Regex(regStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Multiline);
Match m=r.Match(chkStr);
if(m.Success)
{
j=m.Value.Length;
sb.Insert(0,"*",j);
toStr=sb.ToString();
chkStr=Regex.Replace(chkStr,regStr,toStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Multiline);
}
sb.Remove(0,sb.Length);
}
return chkStr;
}
回复
clon 2004-11-09
救命啊
回复
clon 2004-11-09
楼上的提出用正则的仁兄们能不能写个式子出来?
回复
webserv2 2004-11-08
自己有点把问题 弄复杂了, 可以直接用正则,呵呵!

有点想编译原理
回复
yydy 2004-11-08
新上任的版主们 快来啊
回复
bfwqc 2004-11-08
高深啊 为什么弄得这么复杂呢?
回复
clon 2004-11-08
还是没有解决啊
回复
morality 2004-11-06
呵呵,既然来了,还是帮你顶一下吧!:)
回复
johnsunac 2004-11-06
直接使用正则表达式进行搜索,不需要自己写算法。
回复
clon 2004-11-06
是个查询系统啊。
回复
pingnt 2004-11-06
干嘛呢?在写操作系统还是在写数据库管理系统啊!
回复
zhn0410 2004-11-06
占个位学习,并帮你顶一下。
回复
shoutor 2004-11-06
真的是强啊
回复
clon 2004-11-06
在VB.net版也有发贴,问题得到解决后两边都结贴
回复
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2004-11-06 04:57
社区公告
暂无公告