魔王语言解释数据结构课程设计报告Word文档格式.docx
- 文档编号:22412982
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:28
- 大小:171.97KB
魔王语言解释数据结构课程设计报告Word文档格式.docx
《魔王语言解释数据结构课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《魔王语言解释数据结构课程设计报告Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
一只
鹅
追
赶
#
下
蛋
恨
4.实现提示
将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。
5.本程序采用的是顺序栈。
基本操作列表:
(1)据括号的个数设一个标记。
记下括号的位置。
(2)《
(3)根据标记来执行依次的操作。
(4)没有括号,直接进队,据翻译函数2输出人的语言。
(5)有括号,分为括号内的和括号外的。
,根据括号的位置:
括号外的从右到左入栈;
括号内的从左到右入栈,并且依次插入括号内的第一个字符。
据翻译函数2出栈并且翻译。
二、需求分析
1.本演示程序中,魔王语言限制在小写字母‘a’-‘z’之间,且必须限制在括号内以及大写字母A和B。
且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。
2.魔王语言遵守如下规则:
(θδ1δ2δ3…δn)θδnθδn-1…θδ1θ
@
BtAdAAsae
3.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。
4.程序的执行命令有:
1)选择操作2)任意键结束
5.数据测试
B(ehnxgz)B解释成:
tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:
"
、
?
三、概要设计
为实现上述功能,需要栈和队列两个抽象数据类型。
1.栈抽象数据类型定义
ADTstack{
数据对象:
D={ai|ai∈Elemset,i=1,2,3,…n,n>
=0}
*
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…n}
基本操作:
InitStack(&
s)
操作结果:
构造一个空栈s。
Push(&
s,e)
初始条件:
栈s已存在。
插入元素e为新的栈顶元素。
Pop(&
s,&
e)
栈s已存在且非空。
删除栈s的栈顶元素,并用e返回其值。
StackLenth(&
返回s的元素个数,即栈的长度。
ClearStack(&
将s清为空栈。
DestoryStack(&
栈s被销毁。
StackEmpty(&
若是为空栈,则返回TRUE,否则返回FALSE。
Traverse(&
s,void(*visit)())
·
依次遍历栈s中的元素,依次调用函数,一旦失败,则操作失败。
}ADTstack
2.队列抽象数据类型定义
ADTQueue{
InitQueue(&
q)
构造一个空队列Q。
EnQueue(&
q,e)
队列Q已存在。
插入元素e为Q的新的队尾元素。
QueueLenth(&
队列已存在。
返回Q的元素个数,即队列的长度。
}
DeQueue(&
q,&
删除Q的队尾元素,并用e返回其值。
QueueEmpty(&
若Q为空队列,则返回TRUE,否则返回FALSE.
ClearQueue(&
清空队列Q。
DestoryQueue(&
队列Q被销毁。
不再存在。
QueueTraverse(&
q,Status(*visit)())
依次遍历队列Q的元素,依次调用函数,一旦失败,则操作失败。
}ADTQueue
流程图如下:
本程序主要包括以下几个模块:
主程序模块:
intmain()
{
GhostLanage();
printf("
\n\t按任意键退出\n\n"
);
;
各子程序模块:
/*初始化栈*/voidInitStack(SeqStack*s)
{s->
top=-1;
/*进栈操作*/
voidPush(SeqStack*s,StackElementTypex)
{if(s->
top==Stack_Size-1)
printf("
\n\t栈已满!
"
else{s->
top++;
s->
elem[s->
top]=x;
/*出栈操作*/
voidPop(SeqStack*s,StackElementType*x)
top==-1)
\n\t栈为空!
else{*x=s->
top];
top--;
.
/*取栈顶元素*/
voidGetTop(SeqStack*s,StackElementType*x)
else*x=s->
/*判断栈是否为空*/
intIsEmpty(SeqStack*s)
~
top==-1)return(0);
elsereturn
(1);
/*魔王语言翻译函数*/
voidGhostLanage()
{SeqStackB,A,s,B1,A1,r,M;
StackElementTypech,ch1,ch2,x;
charaa[100];
intchoice,i=0,n;
B);
A);
s);
r);
M);
魔王语言的转换形式:
B->
tAdAA->
sae"
B,'
t'
A'
d'
`
A,'
s'
a'
e'
\n请输入要翻译的魔王语言:
\n"
scanf("
%s"
aa);
for(i=0;
aa[i]!
='
\0'
i++)
s,aa[i]);
while(IsEmpty(&
s))
{Pop(&
s,&
ch);
if(ch=='
B'
)
{B1=B;
while(IsEmpty(&
B1))
{Pop(&
B1,&
ch1);
if(ch1=='
{A1=A;
A1))
】
A1,&
ch2);
Push(&
r,ch2);
}
elsePush(&
r,ch1);
elseif(ch=='
)'
%
while(ch2!
('
{Push(&
M,ch2);
Pop(&
GetTop(&
M,&
x=ch2;
M))
r,x);
r,ch);
M=r;
\n\n\t翻译的结果为:
printf("
%c"
ch);
\n\n\t是否继续翻译为汉语:
(1-继续,0-不继续)"
%d"
&
n);
if(n==1)
{printf("
\n\n\t翻译为汉语的结果为:
\n\n\t"
M=r;
)printf("
天"
地"
上"
—
一只"
鹅"
z'
追"
g'
赶"
x'
下"
n'
蛋"
h'
恨"
else;
模块间的关系是:
栈模块
|
翻译函数2
翻译函数1
主程序
四、详细设计
本程序中的主要函数有:
-
voidInitStack(SeqStack*s);
/*初始化栈*/
voidPush(SeqStack*s,StackElementTypex);
/*进栈操作*/
voidPop(SeqStack*s,StackElementType*x);
voidGetTop(SeqStack*s,StackElementType*x);
intIsEmpty(SeqStack*s);
voidGhostLanage();
函数间的调用关系:
主程序调用魔王语言翻译函数,然后魔王语言翻译函数调用其它的函数(初始化栈,进栈,出栈,取栈顶元素,判断栈空),以此来实现整个程序的运行。
程序的头文件及全局变量的定义
…
#include<
#defineStackElementTypechar
#defineStack_Size100
类型及其基本操作
typedefstruct
{StackElementTypeelem[Stack_Size];
inttop;
}SeqStack;
函数
intmain()
system("
color1b"
voidInitStack(SeqStack*s)
:
》
王语言翻译函数
\t\t*************魔王语言翻译程序***************\n"
\t\t*********\t\t\t************\t\n"
^
\n\t\t\t请输入要翻译的魔王语言:
,
[
(1-继续,0-不继续)"
\n\n\t"
五、调试分析
1.若是括号外的从左到右入栈,并进行翻译,则出来的运行结果是反着的,并未达到要求的结果。
所以进行调试,发现应该从右到左入栈,根据出栈的顺序,先进后出,正好可以达到相应的结果。
2.、
3.括号内的字符的入栈错误。
本来只是将括号内的字符也是据1从右到左入栈。
并且循环插入括号内的第一个字符。
发现结果又是反的。
据调试,发现括号内的字符应该是从左到右入栈,正好符合规则1,结果未相反。
4.将括号内的第一个字符按照循环,进一个字符,再插一个括号内的第一个字符。
发现结果与规则1不符,所以据调试,应在循环外先插入一个括号内的第一个字符,后再进行以上的循环,这样输出的结果与规则1相符,并且第一个输出的不会少了括号内的第一个字符,也不会重复第一个字符的输出。
5.指针和地址符的误用。
在调用函数时,总是误用这两个符号,导致许多不必要的错误。
所以,经过调试,也熟悉了这两个符号的用法。
六、用户手册
第一步:
启动魔王语言.exe应用程序,进入程序界面,如下:
第二步:
输入要翻译的魔王语言后按Enter键确认,结果如下:
第三步:
程序将输入翻译为魔王语言后会再次询问要不要翻译为汉语,如果要翻译为汉语,选择1,按Enter确认,则程序会再次将魔王语言翻译为汉语形式。
具体如下:
第四步:
翻译结束后按任意键退出程序。
七、测试结果
输入的魔王语言为:
B(ehnxgz)B
翻译的结果为:
tsaedsaeezegexenehetsaedsae
翻译为汉语的结果为:
天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅
\
结论:
此程序能够按照给定的翻译规则解释魔王语言。
八、结束语
通过这个实验。
特别是实验中对栈的应用,让我更深入的了解了栈的特性,更加了解了栈的构造及构造方法。
这次实验实现了简单的魔王语言解释,按照给定的规则能够翻译出一句有意义的话,但不足的是,程序中的规则是指导书中给定的规则,没有定义出自己的规则,在今后的时间里,还需要自己进行不断的改善,争取能够自己定义规则。
这次实验对魔王语言的解释,让我看到了如何对信息进行简单的加密,看到了加密的雏形,这对于今后更深入的学习起到了启蒙的作用。
总的来说,这次实验让我收获了很多,同时也让我发现了很多的不足,希望在今后的学习中,不断努力,使程序更加的完美。
九、附录
程序源代码如下:
&
$
/*主函数*/
/
]
《
printf(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 魔王 语言 解释 数据结构 课程设计 报告