1、(2)(12 n) nn-1 1 在这两种形式中,从左到右均表示解释;从右到左均表示抽象。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。【基本要求】用下述两条具体规则(具体规则数量不定)和上述规则形式(2)实现。 设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。(1).(2).示例:魔王说:B(ehnxgz)B解释成人类语言:tsaedsaeezegexenehetsaedsae若每个小写字母含义如下表所示:tdsaezgxnh天地上一只鹅追赶下蛋恨则魔王说的话是:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅
2、恨鹅天上一只鹅地上一只鹅四、概要设计 1系统结构图(功能模块图)2功能模块说明1. 文件读取函数int file_rule() ,int file_mean()通过文件函数,提取存储在D:中的rule和mean文件,并将其输出到终端;2. 文件输出函数void output(Lang *L)将提取出的文件内容输出到终端;3. 去除魔王语言中括号模块void translate1(LinkStackNode *S1, LinkStackNode *S2, LinkQueue *Q, char aT)利用队栈的进栈出栈操作,入队出队操作,将魔王语言中的括号去除,使之成为一个字母的序列;4 字母语言
3、转人类语言void translate2(char aT, LinkQueue *Q) 将已经由魔王语言转换成的字母语言通过对照转换成人类语言;5 魔王语言转字母语言void translate3(char aT, LinkQueue *Q)将输入的魔王语言通过循环判断转换成字母语言;6 文件保存函数void file_result(char aT)将已经转换好的魔王语言保存到自定义路径。五、详细设计及运行结果流程图, 函数之间相互调用的图示 ,程序设计及编码, 运行结果。六、调试情况,设计技巧及体会1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。2、在设计过程中的感受。1、程序总
4、体设计结构合理,功能完全,代码注释明晰,可读性高。但是在某些方面存在着不足,比如在魔王语言的程序设计中,并未能够设计出利用数组指针定义栈,完成去多层括号的递归算法。此处是本次程序设计中比较遗憾的一点,我会在更多的时间里,去思考去除多层括号的递归算法。2、本次课程设计中,利用队栈实现魔王语言,使我很好地应用了数据结构中的知识,使我更加巩固了在这方面的内容。同时,在程序的编写过程中,我学会了逐步细化的编程方法,不断地追根溯源,把需要解决的问题逐步细化成许多小问题来解决。 在本次课程设计中,给我感受最深的就是在魔王语言的去括号递归算法部分,C语言无法像C+在需要的时候定义出一个空间,它的局限性,使得
5、在魔王语言的退括号的代码编写中制造了麻烦,自觉C语言能力不敢恭维,应该在以后的时间里,多编程,多练习,提高自己的思维,编程能力。七、参考文献C语言程序设计 谭浩强 清华大学出版社C语言程序设计 王曙燕等 科学出版社数据结构使用C语言 陈一华等 电子科技大学出版社数据结构题集 严蔚敏,吴伟民 清华大学出版社八、附录:源代码(略,详见电子版实验报告)#include stdlib.hstring.h#define T 100#define StackElementType char#define QueueElementType charstruct rule char a10; char b10
6、;f1T;struct meanf2T;typedef struct node StackElementType data; struct node *next;LinkStackNode;void InitStack(LinkStackNode *s) s-next=NULL;int Push(LinkStackNode *s, StackElementType x) LinkStackNode *p; p=(LinkStackNode *)malloc(sizeof(LinkStackNode); if(p = NULL) return (1); p-data=x;next=s-next;
7、next=p; return (0);int Pop(LinkStackNode *s, StackElementType *x) LinkStackNode *q; if(s-next = NULL) return (1); q=s- *x=q-data;next=q- free(q);typedef struct Node QueueElementType data; struct Node *next;LinkQueueNode;typedef struct LinkQueueNode *front; LinkQueueNode *rear;LinkQueue;int InitQueue
8、(LinkQueue *Q) Q-front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode); if(Q-front!=NULL) Q-rear=Q-front;front- return (0); else return (1);int EnterQueue(LinkQueue *Q, QueueElementType x) LinkQueueNode *NewNode; NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode); if(NewNode! NewNode-rear-next=NewN
9、ode;rear=NewNode; else return(1);int DeleteQueue(LinkQueue *Q, QueueElementType *x) LinkQueueNode *p;front=Q-rear) return (1); p=Q-next=p-rear=p) *x=p-int file_rule() FILE *fq; int i=0; fq=fopen(F:rule.txt,rt); if(fq=NULL) printf(打开文件失败! while(fscanf(fq,%s %s,f1i.a,f1i.b)!=EOF) i+; fclose(fq);int fi
10、le_mean()mean.txt,f2i.a,f2i.b)!void file_result(char aT)result.txtwt文件写入失败! exit(1); while(ai!=0) fprintf(fq,%s,ai); printf(文件写入成功!void translate1(LinkStackNode *S1, LinkStackNode *S2, LinkQueue *Q, char aT) int i,j,k,t=0; char str,str1; for(i=0; ai!); i+) Push(S1,ai); for(j=i; aj!( j-); str=aj+1; f
11、or(k=0; knext! DeleteQueue(Q,& Push(S1,str1); for(i=i+1;ai! Push(S1,ai); while(S1- Push(S2,str1); while(S2- Pop(S2,&at); t+; at= i=0; while(ai! if(ai= translate1(S1,S2,Q,a); i+;void translate2(char aT, LinkQueue *Q) int i,j,r,t,m,n,k=0,q=0; n=0; for(j=0; f1j.a0! j+) if(ai=f1j.a0) n+; for(m=0; f1j.bm
12、! m+) EnterQueue(Q,f1j.bm); if(!n) EnterQueue(Q,ai); while(Q- DeleteQueue(Q,&ak); k+; ak= t=0; while(at! for(r=0; f1r.a0! r+) if(at=f1r.a0) q+; t+; if(q) translate2(a,Q);void translate3(char aT, LinkQueue *Q) int i,j,m,n=0; f2j.a0! if(ai=f2j.a0) f2j.bm! EnterQueue(Q,f2j.bm);an); n+; an=void main() L
13、inkStackNode *S1,*S2; LinkQueue *Q; char aT; int i,j=0; S1=(LinkStackNode *)malloc(sizeof(LinkStackNode); S2=(LinkStackNode *)malloc(sizeof(LinkStackNode); Q=(LinkQueue *)malloc(sizeof(LinkQueue); InitStack(S1); InitStack(S2); InitQueue(Q);请输入魔王语言: scanf(,a); if(ai= j+; if(j) translate1(S1,S2,Q,a); file_rule();魔王语言转换1:%sn translate2(a,Q);魔王语言转换2: file_mean(); translate3(a,Q);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1