魔王语言解释数据结构课程设计Word文档格式.docx

上传人:b****7 文档编号:22068523 上传时间:2023-02-02 格式:DOCX 页数:27 大小:244.69KB
下载 相关 举报
魔王语言解释数据结构课程设计Word文档格式.docx_第1页
第1页 / 共27页
魔王语言解释数据结构课程设计Word文档格式.docx_第2页
第2页 / 共27页
魔王语言解释数据结构课程设计Word文档格式.docx_第3页
第3页 / 共27页
魔王语言解释数据结构课程设计Word文档格式.docx_第4页
第4页 / 共27页
魔王语言解释数据结构课程设计Word文档格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

魔王语言解释数据结构课程设计Word文档格式.docx

《魔王语言解释数据结构课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《魔王语言解释数据结构课程设计Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。

魔王语言解释数据结构课程设计Word文档格式.docx

如果此时flag=1,则再次重复C过程。

直至所有元素为人类语言。

输出demon[i]。

此时数组中元素为对应的人类语言。

注:

如果程序中没有相应的对应关系,则翻译成“?

?

”。

3、概要设计

3.1数据流程图

魔王语言解释学年设计包括了主函数和栈和队列的操作两大部分,其中栈和队列的操作部分有构建、添加、删除、查找等函数。

具体流程如图1:

图1数据流程图

3.2设定栈的抽象数据类型定义:

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

3.3设定队列的抽象数据类型:

ADTqueue{

数据对象:

D={ai|ai∈Elemset,i=1,2,…,n,n>

数据关系:

|ai-1,ai∈D,i=2,…,n}

Initqueue(&

q)

构造一个空队列q.

Enqueue(&

q,e)

队列q已存在.

插入元素e为q的新队尾元素.

Dequeue(&

q,&

q为非空队列.

删除q的队头元素,并用e返回其值.

}ADTqueue

3.4本程序包含四个模块:

主函数模块,其中主函数为:

Statusmain()

{

初始化栈;

初始化队列;

接收魔王语言输入到数组demon[i];

遍历数组将括号中元素进栈;

While(数组demon[i]中元素有大写字母)

{翻译排序处理后入队列;

将队列元素保存在数组demon[i];

}

输出人类语言(数组demon[i]);

}

括号内元素入栈处理模块.

Tempstack(&

temps)

将括号内元素入栈,依次插入首字符.

举例:

(abcd)->

adacaba.

排序入队列模块.

Sort(&

{

遍历数组;

遇到小写字母,直接入队列;

遇到大写字母,翻译大写后入队列;

遇到括号,将栈中保存的元素依次出栈入队;

翻译大写处理模块.

Spenqueue(&

*q,key)

Switch(key)

找到各个大写字母对应的字符串.

没有相应的则解释为‘?

各模块之间调用关系:

主函数模块

括号内元素入栈处理模块:

排序入队模块

翻译大写处理模块;

}

4、详细设计

4.1标准库函数及宏的定义

#include<

stdio.h>

stdlib.h>

#defineSTACK_INIT_SIZE100

#defineSTACK_INCREMENT10

4.2定义主函数

主函数流程图如图2所示

图2主函数流程图

主函数的编写,在主函数中编译魔王语言所遵循的规则,及栈、队列、相关数组结构的定义与调用,及输出结果的显示

intmain()//主函数从此开始进行

{

printf("

**************************************************************\n"

);

**欢迎来到滁州学院**\n"

******************************\n"

**魔王语言解释系统**\n"

**班级:

网络工程

(2)班**\n"

**组别:

组1**\n"

intxunhuan=1;

//是下面的while循环一定执行

请输入你想要解释的魔王语言:

\n"

while(xunhuan==1)//一个总循环控制整个程序的重复进行

charA[7]="

hdwhz,"

;

//大写字母作为字符数组名存放小写字母

charB[7]="

hqsff,"

charC[7]="

hwhll,"

charD[7]="

hkhbf,"

charE[7]="

hkwsx,"

charF[7]="

hxwsb!

"

charflag='

0'

//flag用来标记处理括号

chare1,key,e2,e;

//定义char型变量

intmark=1;

//标记输入的魔王语言是否在允许的范围之内

intf=1;

//判断括号是否匹配

charMoWang[100]="

\0"

//定义一个魔王变量,存放待解释的语言字符

structStackS;

//作为栈存储元素,为后续操作和输出做准备

structStacktemp;

//用来处理括号外的元素

InitStack(S);

InitStack(temp);

structLinkQueueQ;

InitQueue(Q);

gets(MoWang);

//变量MoWang存储输入的语言,讲魔王的话放入数组中

InStack(MoWang,S);

//把要解释的魔王语言压入栈中

while(!

StackEmpty(S))//把魔王语言进行出栈,不符合语言的进行提示

{

Pop(S,e1);

if(e1=='

('

{

if(StackEmpty(S))

{

魔王语言错误!

mark=0;

f=0;

break;

}

StackEmpty(S))

{

)'

{

f=1;

}

elseif(!

(e1>

='

a'

&

e1<

z'

)&

!

A'

Z'

))

魔王语言错误!

}

if(mark==0)

if(f!

=1)

}

elseif(e1=='

))

if(mark==1&

f==1)//对符合语言规则的魔王语言进行规则处理

ClearStack(S);

//把魔王语言从右至左压栈存放

StackEmpty(S))//栈不空时,用栈temp进行存储不带括号内元素的元素

B'

||e1=='

C'

D'

E'

F'

)Push(temp,e1);

)//用队存储括号中的元素

{

Push(temp,flag);

//有括号的话就用flag标记

while(e1!

)//把括号中的元素存入队列中

{

EnQueue(Q,e1);

if(!

QueueEmpty(Q))DeQueue(Q,key);

//将队头的元素赋值给key

}

elsePush(temp,e1);

StackEmpty(temp))//将魔王说的语言规则地压入栈s中

Pop(temp,e1);

if(e1!

=flag)Push(S,e1);

//把括号外的元素压入中

else{

QueueEmpty(Q))//处理括号中的元素进栈

DeQueue(Q,e2);

Push(S,key);

Push(S,e2);

//最后还要压一个key

解释后的语言为:

StackEmpty(S))//依次出栈输出处理后的元素

Pop(S,e);

EnQueue(Q,e);

//元素进队是为了输出对应汉字

if(e=='

)printf("

%s"

B);

elseif(e=='

A);

C);

D);

E);

F);

elseprintf("

%c"

e);

QueueEmpty(Q))//翻译成对应的汉字

DeQueue(Q,e);

switch(e)

case'

h'

:

花"

break;

d'

:

蝴蝶"

w'

为"

醉"

s'

随"

fe'

风"

f'

飞"

k'

开"

ku'

哭"

b'

悲"

x'

谢"

l'

落泪"

ba'

瓣"

花却随风飞,"

蝴蝶为花醉,"

花舞花落泪,"

花哭花瓣飞,"

花开为谁谢,"

花谢为谁悲!

default:

*"

printf("

再次输入魔王语言,按数字键:

1---继续;

0----退出:

scanf("

%d"

&

xunhuan);

return0;

4.3栈的初始化、进栈、出栈、栈的判空、栈的清空

定义栈:

栈又称堆栈,它是一种运算受限的线性表。

其限制是仅允许在表的一端插入和删除,这一端叫做栈顶。

另一端叫做栈底。

而由于栈是一种运算受限的线性表,所以他的空间也是有限的,即栈的空间大小。

structStack//定义栈

char*base;

char*top;

intstacksize;

};

构造栈:

构造一个空栈,定义空栈的空间大小。

初始时栈顶指针top,指向实际栈顶空位置,初值为0.

voidInitStack(structStack&

s)//构造栈

s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));

//栈动态分配空间

s.top=s.base;

//栈中无元素

s.stacksize=STACK_INIT_SIZE;

//栈的最大空间为分配空间

往栈中压入元素:

用s.base来表示栈底;

用s.top来表示栈顶。

在往栈中压入元素的时候,首先判断栈的空间大小是否满足承载所有元素。

如果元素溢出,则重新定义一个栈的空间大小,使元素能完全进入。

voidPush(structStack&

s,chare)//往栈中压入元素

if(s.top-s.base>

=STACK_INIT_SIZE)//超出分配空间

s.base=(char*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(char));

//再分配

s.top=s.base+s.stacksize;

//栈顶指针上移

s.stacksize+=STACK_INCREMENT;

//栈的空间增加

//不超过分配空间

*(s.top)=e;

s.top++;

取出栈中的元素:

出栈时,遵循先进后出的原则。

提取s.top指向的前一个元素。

voidPop(structStack&

s,char&

e)//取出栈中的元素

e=*--s.top;

 

判断栈是否为空:

当提取一个元素之后,进行判断。

判断s.top和s.base是否满足s.top==s.base。

如果满足则栈为空,如果不满足则栈不为空程序继续进行。

intStackEmpty(structStacks)//判断栈是否为空

if(s.top==s.base)return1;

elsereturn0;

voidClearStack(structStack&

s)//清空栈

把字符数组从右至左压入栈中:

首先统计所有字符数据,然后将统计的字符按顺序从右往左压入栈中。

voidInStack(char*ch,structStack&

s)//把字符数组从右至左压入栈中

inti,L=0;

while(ch[L]!

\0'

)L++;

for(i=L-1;

i>

=0;

i--)Push(s,ch[i]);

4.4队列的初始化、进队列、出队列、判空

定义队列:

队列时只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

允许插入的一端为队尾,允许删除的一端为队头。

structQueue//定义队列

chardata;

structQueue*next;

structLinkQueue

structQueue*front;

structQueue*rear;

构造队列:

构造一个队列,定义队列的空间大小,并确定队头。

voidInitQueue(structLinkQueue&

q)//构造队列

q.front=q.rear=(structQueue*)malloc(sizeof(structQueue));

q.front->

next=NULL;

元素入队:

元素入队遵循先进先出原则。

定义一个指针P,并确定指针的空间大小。

同时使指针P所在的地址为队头,即确定队头。

voidEnQueue(structLinkQueue&

q,chare)//元素入队

structQueue*p;

p=(structQueue*)malloc(sizeof(structQueue));

p->

data=e;

q.rear->

next=p;

q.rear=p;

元素出队:

定义一个指针型队列P,然后让队列里的元素出队。

之后判断队列是否为空,如果不为空,则释放队列。

如果为空,则队头就是队尾,即只有一个元素,然后再释放队列。

判断队列是否为空,如果对为空,返回,否则返回

voidDeQueue(structLinkQueue&

q,char&

e)//元素出队

p=q.front->

next;

e=p->

data;

next=p->

if(q.rear==p)q.rear=q.front;

free(p);

判空

intQueueEmpty(structLinkQueueq)//判断队列是否为空,如果对为空,返回,否则返回

if(q.front==q.rear)return1;

5、调试结果

输入正确的魔王语言ABCDEF经翻译为“蝴蝶为花醉,花却随风飞,花舞花落泪,花哭花瓣飞,花开为谁谢,花谢为谁悲”。

若继续翻译魔王的语言按数字1,退出程序按数字0

调试结果如图3所示:

输入语言在规则范围内的正确调试结果

图3符合测试要求的运行结果

输入魔王语言ZJIAEFD,因为又不在规则范围内的语言所以翻译为“***蝴蝶为花醉,花开为谁谢,花谢为谁悲!

花哭花瓣飞,”。

调试结果如图4所示:

输入语言部分在规则范围内的调试结果

图4部分符合测试要求的运行结果

输入错误的魔王语言UKUITYOJOIOI;

LOW则显示魔王语言错误。

调试结果如图5所示:

输入语言全部不在规则范围内的调试结果及错误的魔王语言

图5完全不符合测试要求的运行结果

6、学年设计总体设计与体会

在设计的过程中,主要使用到了数据结构中的栈和队列,将魔王的语言自右至左进栈,总是处理栈顶字符。

若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。

此课程设计旨在解决魔王的语言逐步翻译为人能听懂的语言,可扩充为对相应简单加密的文件进行翻译解释。

通过三次分别测试,包括符合测试要求、部分符合测试要求、不符合测试要求,并且实验结果和我们预想的一样,说明了魔王语言解释系统是符合学年设计任务要求的。

本学年设计,一方面在透彻地理解c语言和数据结构的基本概念和原理之上,使之由抽象理论转变成了具体的实际应用,化抽象为具体;

另一方面,通过本学年设计极大地增强了该小组成员的实验手段与实践技能,提高了发现问题、分析问题、解决问题的能力。

培养了应用知识的能力、团队合作精神和创新精神。

虽然遇到了各种各样的问题,但是在设计的过程中我们发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过通过对所学课程的复习和老师的耐心指导设计终于顺利完成了,在此再次感谢刘老师。

7、参考文献

[1]严蔚敏,吴伟民.数据结构[M].北京:

清华大学出版社,2002.

[2]严蔚敏,吴伟民.数据结构题集(C语言版)[M].北京:

清华大学出版社,2003.

[3]胡学钢.数据结构(C语言版)[M].北京:

高等教育出版社,1999.

8、附录

structSta

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

当前位置:首页 > 高等教育 > 农学

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

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