魔王语言解释文档格式.docx

上传人:b****3 文档编号:16585391 上传时间:2022-11-24 格式:DOCX 页数:14 大小:18.79KB
下载 相关 举报
魔王语言解释文档格式.docx_第1页
第1页 / 共14页
魔王语言解释文档格式.docx_第2页
第2页 / 共14页
魔王语言解释文档格式.docx_第3页
第3页 / 共14页
魔王语言解释文档格式.docx_第4页
第4页 / 共14页
魔王语言解释文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

魔王语言解释文档格式.docx

《魔王语言解释文档格式.docx》由会员分享,可在线阅读,更多相关《魔王语言解释文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

魔王语言解释文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1