魔王语言解释.docx
- 文档编号:3680548
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:18.79KB
魔王语言解释.docx
《魔王语言解释.docx》由会员分享,可在线阅读,更多相关《魔王语言解释.docx(14页珍藏版)》请在冰豆网上搜索。
魔王语言解释
数据结构课程设计文档
2.2魔王语言解释(线性)
[问题描述]
有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α->β1β2…βm
(2)(θδ1δ2…δn)->θδnθδn-1…θδ1θ
在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
[基本要求]
用下述两条具体规则和上述规则形式
(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B->tAdA
(2)A->sae
[测试数据]
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:
“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
tdsaezgxnh
天地上一只鹅追赶下蛋恨
一:
需求分析
(1)以一维数组demon[i]表示魔王语言.
(2)魔王语言由用户输入,初始保存在demon[i]中.
(3)魔王语言与人类语言对应关系固化在程序中.
(4)实现过程:
A:
初始,魔王语言接收后存放在demon[i]中.
B:
初次遍历数组,将数组中括号内的元素入栈,同时插入相应首字母;
C:
再次遍历数组,将数组元素依次入队。
(小写字母直接入队;大写字母经翻译成相应字符后入队;遇到括号,将栈中保存的元素依次出栈入队)在翻译过程中,如果依旧包含大写字母,则置flag为1,否则为0。
D:
将队列中元素赋值给demon[i]。
如果此时flag=1,则再次重复C过程。
直至所有元素为人类语言。
E:
输出demon[i]。
此时数组中元素为对应的人类语言。
注:
如果程序中没有相应的对应关系,则翻译成“”。
二:
概要设计:
1:
设定栈的抽象数据类型定义:
ADTstack{
数据对象:
D={ai|ai∈CharSet,i=1,2,…,n,n>=0}
数据关系:
R1={
基本操作:
initstack(&s)
操作结果:
构造一个空栈s.
push(&s,e)
初始条件:
栈s已存在.
操作结果:
在栈s的栈顶插入新的栈顶元素e.
pop(&s,&e)
初始条件:
栈s已存在.
操作结果:
删除s的栈顶元素,并以e返回其值.
}ADTstack
2:
设定队列的抽象数据类型:
ADTqueue{
数据对象:
D={ai|ai∈Elemset,i=1,2,…,n,n>=0}
数据关系:
R1={
基本操作:
initqueue(&q)
操作结果:
构造一个空队列q.
enqueue(&q,e)
初始条件:
队列q已存在.
操作结果:
插入元素e为q的新队尾元素.
dequeue(&q,&e)
初始条件:
q为非空队列.
操作结果:
删除q的队头元素,并用e返回其值.
}ADTqueue
3:
本程序包含四个模块:
1)主函数模块.其中主函数为:
statusmain()
{
初始化栈;
初始化队列;
接收魔王语言输入到数组demon[i];
遍历数组将括号中元素进栈;
while(数组demon[i]中元素有大写字母)
{翻译排序处理后入队列;
将对列元素保存在数组demon[i];
}
输出人类语言(数组demon[i]);
}
2)括号内元素入栈处理模块.
tempstack(&temps)
将括号内元素入栈,依次插入首字符.
举例:
(abcd)->adacaba.
3)排序入队列模块.
sort(&s,&q)
{
遍历数组;
{
遇到小写字母,直接入队列;
遇到大写字母,翻译大写后入队列;
遇到括号,将栈中保存的元素依次出栈入队列;
}
}
4)翻译大写处理模块.
spenqueue(&*q,key)
{
switch(key)
{
找到各个大写字母对应的字符串.
没有相应的则解释为’’
}
}
各模块之间调用关系:
主函数模块
{
括号内元素入栈处理模块;
排序入队模块
{
翻译大写处理模块;
}
}
三:
详细设计
1.定义全局变量
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineNULL0
#defineOVERFLOW-2
#defineMAXSIZE100
#definestack_init_size100
#definestackincrement10
typedefcharselemtype;
typedefcharqelemtype;
typedefcharelemtype;
typedefintstatus;
chare;
chardemon[MAXSIZE];
2.栈类型及其基本操作
typedefstruct
{
selemtype*base;
selemtype*top;
intstacksize;
}sqstack;
statusinitstack(sqstack*s)
{
s->base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
if(!
s->base)exit(OVERFLOW);
s->top=s->base;
s->stacksize=stack_init_size;
returnOK;
}/*创建栈*/
statuspush(sqstack*s,selemtypee)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(elemtype*)realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemtype));
if(!
s->base)exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
}
*(s->top++)=e;
returnOK;
}/*入栈*/
statuspop(sqstack*s,selemtype*e)
{
if(s->top==s->base)returnERROR;
*e=*(--(s->top));
returnOK;
}/*出栈*/
3.队列类型及其基本操作
typedefstructqnode
{
qelemtypedata;
structqnode*next;
}qnode,*queueptr;
typedefstruct
{
queueptrfront;
queueptrrear;
}linkqueue;
statusinitqueue(linkqueue*q)
{
q->front=q->rear=(queueptr)malloc(sizeof(qnode));
if(!
q->front)exit(OVERFLOW);
q->front->next=NULL;
returnOK;
}/*创建队列*/
statusenqueue(linkqueue*q,qelemtypee)
{
queueptrp;
p=(queueptr)malloc(sizeof(qnode));
if(!
p)exit(OVERFLOW);
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
returnOK;
}/*入队*/
statusdequeue(linkqueue*q,qelemtype*e)
{
queueptrp;
if(q->front==q->rear)returnERROR;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
returnOK;
}/*出队*/
4.括号内元素入栈处理函数
voidtempstack(sqstack*temps)
{
inti=0;
chart;
charc;
c=demon[i];
for(i=0;c!
='#';i++)/*遍历数组*/
{
c=demon[i];
if(c=='(')/*遇到开括号*/
{
t=demon[i+1];/*取括号中的首字母*/
push(temps,t);/*入栈*/
i++;/*指向首字母*/
do
{
i++;
c=demon[i];
push(temps,c)/*第一次循环将次字母入栈*/;
push(temps,t);/*再将首字母进栈*/
}
while(c!
=')');/*直到括号中元素全部进栈*/
pop(temps,&t);/*将多余进栈的首字母t出栈*/
pop(temps,&t);/*将多余进栈的’)’出栈*/
}
}
}/*临时栈*/
5.特殊入队函数
voidspenqueue(linkqueue*q,charkey)
{
intj=0;
chara[5];
switch(key)/*判断大写字母对应的字符串*/
{
case'A':
strcpy(a,"sae");break;
case'B':
strcpy(a,"tAdA");break;
case'C':
strcpy(a,"abc");break;
case'D':
strcpy(a,"def");break;
case'E':
strcpy(a,"ghi");break;
case'F':
strcpy(a,"klm");break;
case'H':
strcpy(a,"mop");break;
default:
strcpy(a,"");/*不能翻译的魔王语言以””输出*/
}
while(a[j]!
='\0')/*如果数组还有字母*/
{
enqueue(q,a[j]);/*进队*/
j++;
}
}/*特殊入队*/
6.排序入队处理函数
statussort(sqstack*s,linkqueue*q)
{
qnodeb;
intflag=0;/*大写字母监视哨置零*/
inti;
for(i=0;demon[i]!
='#';i++)/*遍历数组*/
{
b.data=demon[i];
if(('a'<=b.data&&b.data<='z')||b.data=='?
')/*如果是小写字母或者’?
’则直接入队*/
{
enqueue(q,b.data);
}
else
{
if('A'<=b.data&&b.data<='Z')/*如果是大写字母,则调用特殊入队函数,*/
{
spenqueue(q,b.data);
flag=1;/*发现大写字母监视哨置1*/
}
else
{
if(b.data=='(')/*如果是括号*/
{
do
{
pop(s,&e);
enqueue(q,e);
}
while(!
(s->top==s->base));/*只要栈不为空,则出栈进队*/
while(b.data!
=')')/*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/
{
i++;
b.data=demon[i];
}
}
}
}
}
returnflag;
}/*排序*/
statusmain()
{
sqstacks1;
linkqueueq1;
intk=0;
intflag=1;
clrscr();
printf("\n\n\n\t\t\tWELCOME!
\n");
printf("\t***************************************\n");
printf("\tPleaseInputTheDemon'sWords:
\n\t");
printf("!
:
LessThan30Letters:
)\n\t");
printf("!
:
PleaseStopBy'#':
)\n\t");
printf("***************************************\n\t");
printf("TheDemon'sWords:
\n\t");
scanf("%s",demon);
printf("\n\t***************************************");
initstack(&s1);/*创建栈*/
initqueue(&q1);/*创建队*/
tempstack(&s1);/*调用函数*/
while(flag==1)/*如果有大写字母*/
{
k=0;
flag=sort(&s1,&q1);
while(q1.front!
=q1.rear)/*重写demon[i]*/
{
dequeue(&q1,&e);
demon[k]=e;
k++;
}
demon[k]='#';
}
demon[k]='\0';
printf("\n\tTheHuman'sWords:
\n\t%s",demon);
printf("\n\n\t***************************************");
printf("\n\t\t\tTHANKYOU!
\n\t");
printf("Pleasepressanykeytoexit...");
if(getch())exit
(1);
}
}/*主函数*/
四:
调试分析
1.函数调用比较多,因而得仔细对待数值和地址的传递.
2.由于魔王语言中’B’中仍然包含着大写字母(tAdA).所以考虑设置flag.
3.函数数组遍历.进栈出栈.入队出队中都要牵扯指针的移动,所以要仔细考虑一循环的条件以及进栈元素的个数.
五:
用户手册
1.本程序运行环境为DOS/WINDOWS操作系统,执行文件为:
魔王语言解释.exe。
2.进入程序即显示提示信息:
WELCOME!
***************************************
PleaseInputTheDemon'sWords:
!
:
LessThan30Letters:
)
!
:
PleaseStoppedBy'#':
)
***************************************
TheDemon'sWords:
等待用户输入.用户输入字符以’#’回车结束.
***************************************
TheHumanWords:
(翻译后的语言)
***************************************
THANKYOU!
六:
测试结果
WELCOME!
***************************************
PleaseInputTheDemon'sWords:
!
:
LessThan30Letters:
)
!
:
PleaseStoppedBy'#':
)
***************************************
TheDemon'sWords:
B(ehnxgz)B#
***************************************
TheHumanWords:
tsaedsaeezegexenehetsaedsae
***************************************
THANKYOU!
测试的数据和结果分别为:
1(要求):
B(ehnxgz)B#->tsaedsaeezegexenehetsaedsae
另外测试的数据有:
2:
abcd#->abcd;
3:
mBiM#->mtsaedsaei;
4:
gcBA(oBifz)#->gctsaedsaesaeozofoiotsaedsaeo;
结果皆正确。
七.附录
源程序文件清单:
魔王语言解释.c//源程序文件
魔王语言解释.exe//可执行文件
魔王语言解释测试用例.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 魔王 语言 解释