魔王语言Word文件下载.docx
《魔王语言Word文件下载.docx》由会员分享,可在线阅读,更多相关《魔王语言Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![魔王语言Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/31/b6075a1d-9596-4fe6-a130-b23fbfc0cbd4/b6075a1d-9596-4fe6-a130-b23fbfc0cbd41.gif)
(2)(θδ1δ2……δn)→θδnθδn-1……θδ1θ
在这两种形式中,从左到右均表示解释;
从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
【基本要求】
用下述两条具体规则(具体规则数量不定)和上述规则形式
(2)实现。
设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;
希腊字母表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇。
(1).Β→tΑdΑ
(2).Α→sae
示例:
魔王说:
B(ehnxgz)B
解释成人类语言:
tsaedsaeezegexenehetsaedsae
若每个小写字母含义如下表所示:
t
d
s
a
e
z
g
x
n
h
天
地
上
一只
鹅
追
赶
下
蛋
恨
则魔王说的话是:
天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅
四、概要设计
1.系统结构图(功能模块图)
2.功能模块说明
1.文件读取函数intfile_rule(),intfile_mean()通过文件函数,提取存储在D:
\中的rule和mean文件,并将其输出到终端;
2.文件输出函数voidoutput(Lang*L)
将提取出的文件内容输出到终端;
3.去除魔王语言中括号模块voidtranslate1(LinkStackNode*S1,LinkStackNode*S2,LinkQueue*Q,chara[T])
利用队栈的进栈出栈操作,入队出队操作,将魔王语言中的括号去除,使之成为一个字母的序列;
4.字母语言转人类语言voidtranslate2(chara[T],LinkQueue*Q)
将已经由魔王语言转换成的字母语言通过对照转换成人类语言;
5.魔王语言转字母语言voidtranslate3(chara[T],LinkQueue*Q)
将输入的魔王语言通过循环判断转换成字母语言;
6.文件保存函数voidfile_result(chara[T])
将已经转换好的魔王语言保存到自定义路径。
五、详细设计及运行结果
流程图,函数之间相互调用的图示,程序设计及编码,运行结果。
六、调试情况,设计技巧及体会
1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。
2、在设计过程中的感受。
1、程序总体设计结构合理,功能完全,代码注释明晰,可读性高。
但是在某些方面存在着不足,比如在魔王语言的程序设计中,并未能够设计出利用数组指针定义栈,完成去多层括号的递归算法。
此处是本次程序设计中比较遗憾的一点,我会在更多的时间里,去思考去除多层括号的递归算法。
2、本次课程设计中,利用队栈实现魔王语言,使我很好地应用了数据结构中的知识,使我更加巩固了在这方面的内容。
同时,在程序的编写过程中,我学会了逐步细化的编程方法,不断地追根溯源,把需要解决的问题逐步细化成许多小问题来解决。
在本次课程设计中,给我感受最深的就是在魔王语言的去括号递归算法部分,C语言无法像C++在需要的时候定义出一个空间,它的局限性,使得在魔王语言的退括号的代码编写中制造了麻烦,自觉C语言能力不敢恭维,应该在以后的时间里,多编程,多练习,提高自己的思维,编程能力。
七、参考文献
《C语言程序设计》谭浩强清华大学出版社
《C语言程序设计》王曙燕等科学出版社
《数据结构——使用C语言》陈一华等电子科技大学出版社
《数据结构题集》严蔚敏,吴伟民清华大学出版社
八、附录:
源代码
(略,详见电子版实验报告)
#include<
stdio.h>
stdlib.h>
string.h>
#defineT100
#defineStackElementTypechar
#defineQueueElementTypechar
structrule
{
chara[10];
charb[10];
}f1[T];
structmean
}f2[T];
typedefstructnode
StackElementTypedata;
structnode*next;
}LinkStackNode;
voidInitStack(LinkStackNode*s)
s->
next=NULL;
}
intPush(LinkStackNode*s,StackElementTypex)
LinkStackNode*p;
p=(LinkStackNode*)malloc(sizeof(LinkStackNode));
if(p==NULL)return
(1);
p->
data=x;
next=s->
next;
next=p;
return(0);
intPop(LinkStackNode*s,StackElementType*x)
{
LinkStackNode*q;
if(s->
next==NULL)return
(1);
q=s->
*x=q->
data;
next=q->
free(q);
typedefstructNode
QueueElementTypedata;
structNode*next;
}LinkQueueNode;
typedefstruct
LinkQueueNode*front;
LinkQueueNode*rear;
}LinkQueue;
intInitQueue(LinkQueue*Q)
Q->
front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(Q->
front!
=NULL)
{
Q->
rear=Q->
front;
front->
return(0);
}
elsereturn
(1);
intEnterQueue(LinkQueue*Q,QueueElementTypex)
LinkQueueNode*NewNode;
NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(NewNode!
NewNode->
rear->
next=NewNode;
rear=NewNode;
elsereturn
(1);
intDeleteQueue(LinkQueue*Q,QueueElementType*x)
LinkQueueNode*p;
front==Q->
rear)
return
(1);
p=Q->
next=p->
rear==p)
*x=p->
intfile_rule()
FILE*fq;
inti=0;
fq=fopen("
F:
\\rule.txt"
"
rt"
);
if(fq==NULL)
printf("
打开文件失败!
"
while(fscanf(fq,"
%s%s"
f1[i].a,f1[i].b)!
=EOF)
i++;
fclose(fq);
intfile_mean()
\\mean.txt"
f2[i].a,f2[i].b)!
voidfile_result(chara[T])
\\result.txt"
wt"
文件写入失败!
exit
(1);
while(a[i]!
='
\0'
)
fprintf(fq,"
%s"
a[i]);
printf("
文件写入成功!
voidtranslate1(LinkStackNode*S1,LinkStackNode*S2,LinkQueue*Q,chara[T])
inti,j,k,t=0;
charstr,str1;
for(i=0;
a[i]!
)'
;
i++)
Push(S1,a[i]);
for(j=i;
a[j]!
('
j--);
str=a[j+1];
for(k=0;
k<
i-j-2;
k++)
{
EnterQueue(Q,str);
Pop(S1,&
str1);
EnterQueue(Q,str1);
}
EnterQueue(Q,str);
Pop(S1,&
while(Q->
next!
DeleteQueue(Q,&
Push(S1,str1);
for(i=i+1;
a[i]!
Push(S1,a[i]);
while(S1->
Push(S2,str1);
while(S2->
Pop(S2,&
a[t]);
t++;
a[t]='
i=0;
while(a[i]!
if(a[i]=='
translate1(S1,S2,Q,a);
i++;
voidtranslate2(chara[T],LinkQueue*Q)
inti,j,r,t,m,n,k=0,q=0;
n=0;
for(j=0;
f1[j].a[0]!
j++)
if(a[i]==f1[j].a[0])
{
n++;
for(m=0;
f1[j].b[m]!
m++)
EnterQueue(Q,f1[j].b[m]);
}
if(!
n)
EnterQueue(Q,a[i]);
while(Q->
DeleteQueue(Q,&
a[k]);
k++;
a[k]='
t=0;
while(a[t]!
for(r=0;
f1[r].a[0]!
r++)
if(a[t]==f1[r].a[0])
q++;
t++;
if(q)
translate2(a,Q);
voidtranslate3(chara[T],LinkQueue*Q)
inti,j,m,n=0;
f2[j].a[0]!
if(a[i]==f2[j].a[0])
f2[j].b[m]!
EnterQueue(Q,f2[j].b[m]);
a[n]);
n++;
a[n]='
voidmain()
LinkStackNode*S1,*S2;
LinkQueue*Q;
chara[T];
inti,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(a[i]=='
j++;
if(j)
translate1(S1,S2,Q,a);
file_rule();
魔王语言转换1:
%s\n"
translate2(a,Q);
魔王语言转换2:
file_mean();
translate3(a,Q);