魔王语言解释文档格式.docx
《魔王语言解释文档格式.docx》由会员分享,可在线阅读,更多相关《魔王语言解释文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
D:
将队列中元素赋值给demon[i]。
如果此时flag=1,则再次重复C过程。
直至所有元素为人类语言。
E:
输出demon[i]。
此时数组中元素为对应的人类语言。
注:
如果程序中没有相应的对应关系,则翻译成“”。
二:
概要设计:
1:
设定栈的抽象数据类型定义:
ADTstack{
数据对象:
D={ai|ai∈CharSet,i=1,2,…,n,n>
=0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
基本操作:
initstack(&s)
操作结果:
构造一个空栈s.
push(&s,e)
初始条件:
栈s已存在.
在栈s的栈顶插入新的栈顶元素e.
pop(&s,&e)
删除s的栈顶元素,并以e返回其值.
}ADTstack
2:
设定队列的抽象数据类型:
ADTqueue{
数据对象:
D={ai|ai∈Elemset,i=1,2,…,n,n>
数据关系:
基本操作:
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,&
{
遍历数组;
遇到小写字母,直接入队列;
遇到大写字母,翻译大写后入队列;
遇到括号,将栈中保存的元素依次出栈入队列;
}
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);
top=s->
base;
stacksize=stack_init_size;
returnOK;
}/*创建栈*/
statuspush(sqstack*s,selemtypee)
if(s->
top-s->
base>
=s->
stacksize)
base=(elemtype*)realloc(s->
base,(s->
stacksize+stackincrement)*sizeof(elemtype));
base)exit(OVERFLOW);
base+s->
stacksize;
stacksize+=stackincrement;
*(s->
top++)=e;
}/*入栈*/
statuspop(sqstack*s,selemtype*e)
top==s->
base)returnERROR;
*e=*(--(s->
top));
}/*出栈*/
3.队列类型及其基本操作
typedefstructqnode
qelemtypedata;
structqnode*next;
}qnode,*queueptr;
queueptrfront;
queueptrrear;
}linkqueue;
statusinitqueue(linkqueue*q)
q->
front=q->
rear=(queueptr)malloc(sizeof(qnode));
q->
front)exit(OVERFLOW);
front->
next=NULL;
}/*创建队列*/
statusenqueue(linkqueue*q,qelemtypee)
queueptrp;
p=(queueptr)malloc(sizeof(qnode));
p)exit(OVERFLOW);
p->
data=e;
rear->
next=p;
rear=p;
}/*入队*/
statusdequeue(linkqueue*q,qelemtype*e)
if(q->
front==q->
rear)returnERROR;
p=q->
next;
*e=p->
data;
next=p->
rear==p)
rear=q->
front;
free(p);
}/*出队*/
4.括号内元素入栈处理函数
voidtempstack(sqstack*temps)
inti=0;
chart;
charc;
c=demon[i];
for(i=0;
c!
='
#'
;
i++)/*遍历数组*/
if(c=='
('
)/*遇到开括号*/
t=demon[i+1];
/*取括号中的首字母*/
push(temps,t);
/*入栈*/
i++;
/*指向首字母*/
do
push(temps,c)/*第一次循环将次字母入栈*/;
/*再将首字母进栈*/
while(c!
)'
);
/*直到括号中元素全部进栈*/
pop(temps,&
t);
/*将多余进栈的首字母t出栈*/
/*将多余进栈的’)’出栈*/
}/*临时栈*/
5.特殊入队函数
voidspenqueue(linkqueue*q,charkey)
intj=0;
chara[5];
switch(key)/*判断大写字母对应的字符串*/
case'
A'
:
strcpy(a,"
sae"
break;
B'
tAdA"
C'
abc"
D'
def"
E'
ghi"
F'
klm"
H'
mop"
default:
"
/*不能翻译的魔王语言以””输出*/
while(a[j]!
\0'
)/*如果数组还有字母*/
enqueue(q,a[j]);
/*进队*/
j++;
}/*特殊入队*/
6.排序入队处理函数
statussort(sqstack*s,linkqueue*q)
qnodeb;
intflag=0;
/*大写字母监视哨置零*/
inti;
demon[i]!
b.data=demon[i];
if(('
a'
<
=b.data&
&
b.data<
z'
)||b.data=='
?
'
)/*如果是小写字母或者’?
’则直接入队*/
enqueue(q,b.data);
else
if('
Z'
)/*如果是大写字母,则调用特殊入队函数,*/
spenqueue(q,b.data);
flag=1;
/*发现大写字母监视哨置1*/
if(b.data=='
)/*如果是括号*/
pop(s,&
e);
enqueue(q,e);
while(!
(s->
base));
/*只要栈不为空,则出栈进队*/
while(b.data!
)/*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/
returnflag;
}/*排序*/
sqstacks1;
linkqueueq1;
intk=0;
intflag=1;
clrscr();
printf("
\n\n\n\t\t\tWELCOME!
\n"
\t***************************************\n"
\tPleaseInputTheDemon'
sWords:
\n\t"
!
LessThan30Letters:
)\n\t"
PleaseStopBy'
***************************************\n\t"
TheDemon'
scanf("
%s"
demon);
\n\t***************************************"
initstack(&
s1);
/*创建栈*/
q1);
/*创建队*/
tempstack(&
/*调用函数*/
while(flag==1)/*如果有大写字母*/
k=0;
flag=sort(&
s1,&
while(q1.front!
=q1.rear)/*重写demon[i]*/
q1,&
demon[k]=e;
k++;
demon[k]='
\n\tTheHuman'
\n\t%s"
\n\n\t***************************************"
\n\t\t\tTHANKYOU!
Pleasepressanykeytoexit..."
if(getch())exit
(1);
}/*主函数*/
四:
调试分析
1.函数调用比较多,因而得仔细对待数值和地址的传递.
2.由于魔王语言中’B’中仍然包含着大写字母(tAdA).所以考虑设置flag.
3.函数数组遍历.进栈出栈.入队出队中都要牵扯指针的移动,所以要仔细考虑一循环的条件以及进栈元素的个数.
五:
用户手册
1.本程序运行环境为DOS/WINDOWS操作系统,执行文件为:
魔王语言解释.exe。
2.进入程序即显示提示信息:
WELCOME!
***************************************
PleaseInputTheDemon'
!
)
PleaseStoppedBy'
***************************************
TheDemon'
等待用户输入.用户输入字符以’#’回车结束.
TheHumanWords:
(翻译后的语言)
THANKYOU!
六:
测试结果
WELCOME!
***************************************
B(ehnxgz)B#
TheHumanWords:
tsaedsaeezegexenehetsaedsae
测试的数据和结果分别为:
1(要求):
B(ehnxgz)B#->
tsaedsaeezegexenehetsaedsae
另外测试的数据有:
abcd#->
abcd;
mBiM#->
mtsaedsaei;
4:
gcBA(oBifz)#->
gctsaedsaesaeozofoiotsaedsaeo;
结果皆正确。
七.附录
源程序文件清单:
魔王语言解释.c//源程序文件
魔王语言解释.exe//可执行文件
魔王语言解释测试用例.doc