魔王语言数据结构试验报告.docx
《魔王语言数据结构试验报告.docx》由会员分享,可在线阅读,更多相关《魔王语言数据结构试验报告.docx(25页珍藏版)》请在冰豆网上搜索。
魔王语言数据结构试验报告
青岛农业大学
数据结构论文(设计)
题目:
魔王语言解释
姓名:
庞云杰
学院:
理学与信息科学学院
专业:
信息与计算科学
班级:
201502
学号:
20155653
指导教师:
刘倩
2017年9月19日
数据结构课程设计实习任务书
开课学院(章)2017年9月18日
实习项目名称
数据结构课程设计
指导教师
刘倩
实习地点
理信学院机房121,214,127
实习前准备要求
掌握数据结构相关的理论知识和上机操作技能
实习时间、内容、要求(技能、纪律、笔记、考核及成绩评定等)
一、实习目的
本课程设计旨在提高学生综合运用所学知识,加强理论和实际相结合的能力。
通过对一个实际问题的设计与实现,一方面提高学生对课程内容的基本概念、基本原理、数据结构的选取和算法的设计及实现等有关基本知识的理解;另一方面,调动学生自主学习的积极性,培养学生自主学习、查阅文献资料的能力;更重要的是培养学生实际的动手能力、综合应用知识解决实际问题的能力。
同时,通过本课程实践环节,培养学生学习和掌握有关数据结构知识在实际问题中的具体应用。
二、实习要求
本课程设计要求运用数据结构等知识和技术完成一个实际问题的设计与实现,同学们可选取自己熟悉的开发语言(C语言)实现编程。
要求同学们认真对待,独立完成。
课程设计结束后,提交课程设计报告(纸质版和电子版),同时要进行答辩,演示软件运行效果。
课程设计报告应包括以下几方面的内容:
(1)待解决的背景和目的;
(2)需求分析;
(3)概要设计;
(4)详细设计;
(5)测试数据及结果;
(6)设计心得。
课程设计论文写作要求:
(1)要按照书稿的规格打印撰写课程报告;
(2)报告分封面、任务书、正文、课程设计体会(总结)和参考文献。
三、实习内容
设计并实现一个数据结构在实际问题中的具体案例。
本课程设计有教师提供的参考题目,可供同学们选题;同学们自己也可以确定自己擅长的题目,但要征得指导教师的同意。
选题要求:
1.能覆盖若干知识点,使用现有技术能够解决的问题。
2.难易适中,具有典型意义。
3.一人一题。
参考选题
1.设计一元多项式简单计算
2.停车场管理系统
3.学生信息管理系统任务
4.机房管理
5.算术表达式求值
6.内部排序算法比较
7.哈希表的应用
8.图书管理系统
以上题目供同学们参考选题,不仅仅局限于以上题目,同学们也可根据自己的特长,确定自己擅长的题目进行设计实现,但要征得指导教师的同意。
四、实习安排
1.指导教师安排
指导教师班级
刘倩信计15.1-2
2.课程设计时间:
第4周(共1周)
五、成绩评定
成绩评定由以下几部分组成:
平时表现(10%)、实习报告(40%)、答辩(30%)、程序代码(20%)。
其中:
1)平时成绩:
考勤(是否按时到(-5),验收作业时是否按时交(-3),是否遵守纪律(-2)
2)实习报告:
(1)(电子版20%:
程序代码是否完整(10),程序代码是否有注释(5),程序代码格式是否规范(5))
(2)纸质版(20%,(条理是否清晰(5%),文字叙述是否准确(10%)排版是否规范(5%))
3)答辩:
是否认真负责(5%),语言表达是否准确(5%),基本概念是否准确(10%),设计思想是清晰(10%))
4)字数不少于3000,程序代码适当。
指导教师对程序运行状况进行验收,需保证程序正常运行并得到设计结果。
有关的考查材料(文字材料、源代码等)统一妥善保管。
填表人:
刘倩
魔王语言解释
信息与计算科学2班庞云杰
指导教师刘倩
摘要:
随着网络技术的发展,网络安全变得越来越重要,文件加密是其中一个重要部分。
而“魔王语言”就是一个简单的文件加密。
“魔王语言”就是有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是有规则的,可以通过相应的规则来解释。
魔王的语言解释在数据结构的选择和应用、算法的设计及其实现等方面。
关键词:
魔王语言;网络安全;数据结构;
1需求分析
1.1问题描述
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。
但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α->β1β2...βn
(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ
在这两种形式中,从左到右均表示解释;从右到左表示抽象。
试写一个魔王解释系统,把他的话解释成人能听懂得话。
1.2基本要求
用下述两条具体规则和上述规则形式
(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇:
(1)B->tAdA
(2)A->sae
1.3测试数据
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。
t
d
s
a
e
z
g
x
n
h
天
地
上
一只
鹅
追
赶
下
蛋
恨
1.4实现提示
将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考如何处理。
应首先实现栈和队列的基本操作。
2概要设计
为实现上述程序功能,应以栈和队列来表示。
2.1设定栈的抽象数据类型定义为:
ADTStack{
数据对象:
D={ai|ai∈CharSet,I=1,2,......,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,I=1,2,......,n}
基本操作:
ListInitiate(&S)
操作结果:
构造一个空栈S。
StackEmpty(S)
初始条件:
栈S已经存在。
操作结果:
若栈S为空栈,则返回TRUE,否则返回FALSE。
Push(&S,e)
初始条件:
栈S已经存在。
操作结果:
在栈S的栈顶插入新的栈顶元素e。
Pop(&S,&e)
初始条件:
栈S已经存在。
操作结果:
删除S的栈顶元素,并以e返回其值。
}ADTStack
2.2设定队列的抽象数据类型定义为:
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,I=1,2,......,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,I=1,2,......,n}
基本操作:
ListInitiate(&Q)
操作结果:
构造一个空队列Q。
StackEmpty(Q)
初始条件:
队列Q已经存在。
操作结果:
若队列Q为空栈,则返回TRUE,否则返回FALSE。
EnQueue(&Q,e)
初始条件:
队列Q已经存在。
操作结果:
插入元素e为Q的新的队尾元素。
DeQueue(&Q,&e)
初始条件:
队列Q已经存在。
操作结果:
删除Q的对头元素,并以e返回其值。
}ADTQueue
2.3程序包含四个模块:
主程序模块:
Voidmain()
{
初始化;
For()
{
接受处理命令;
}
接受处理;
}
栈模块——实现栈的抽象数据类型;
队列模块——实现队列的抽象数据类型。
魔王语言解释模块——定义线性表的结点结构。
各模块的之间的调用关系如下:
主函数模块
{
括号内元素入栈处理模块;
排序入队模块
{
翻译大写处理模块;
}
}
3详细设计
3.1栈类型
structStack
{
char*base;
char*top;
intstacksize;
};
3.2队列类型
structStack
{
char*base;
char*top;
intstacksize;
};
structLinkQueue
{
structQueue*front;
structQueue*rear;
};
3.3栈的基本操作
//构造栈
voidInitStack(structStack&s)
{
s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
//往栈中压入元素
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++;
}
//取出栈中的元素
voidPop(structStack&s,char&e)
{
e=*--s.top;
}
//判断栈是否为空
intStackEmpty(structStacks)
{
if(s.top==s.base)return1;
elsereturn0;
}
//清空栈
voidClearStack(structStack&s)
{
s.top=s.base;
}
4队列的基本操作
//构造队列
voidInitQueue(structLinkQueue&q)
{
q.front=q.rear=(structQueue*)malloc(sizeof(structQueue));
q.front->next=NULL;
}
//元素入队
voidEnQueue(structLinkQueue&q,chare)
{
structQueue*p;
p=(structQueue*)malloc(sizeof(structQueue));
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
}
//元素出队
voidDeQueue(structLinkQueue&q,char&e){
structQueue*p;
p=q.front->next;
e=p->data;
q.front->next=p->next;
if(q.rear==p)q.rear=q.front;
free(p);
}
//判断队列是否为空,如果对为空,返回,否则返回
intQueueEmpty(structLinkQueueq){
if(q.front==q.rear)return1;
elsereturn0;
}
//把字符数组从右至左压入栈中
voidInStack(char*ch,structStack&s)
{
inti,L=0;
while(ch[L]!
='\0')L++;
for(i=L-1;i>=0;i--)Push(s,ch[i]);
}
3.4主函数和其他函数的算法(含注释):
#include
#include
#defineSTACK_INIT_SIZE100
#defineSTACK_INCREMENT10
intmain()
{
printf("**************************************************************\n");
printf("******************************\n");
printf("**魔王语言解释系统**\n");
printf("******************************\n");
printf("*班级:
信息与计算科学1502班*\n");
printf("*姓名:
*********\n");
printf("*学号:
20155653*\n");printf("**************************************************************\n\n");
intxunhuan=1;
printf("请输入你想要解释的魔王语言:
\n");
while(xunhuan==1)//一个总循环控制整个程序的重复进行
{
charA[]="sae";//大写字母作为字符数组名存放小写字母
charB[]="tsaedsae";
charflag='0';//flag用来标记处理括号
chare1,key,e2,e;
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))
{
printf("魔王语言错误!
\n");
mark=0;f=0;
break;
}
while(!
StackEmpty(S))
{
Pop(S,e1);
if(e1==')')
{
f=1;
break;
}
elseif(!
(e1>='a'&&e1<='z')&&!
(e1>='A'&&e1<='Z'))
{
printf("魔王语言错误!
\n");
mark=0;
break;
}
}
if(mark==0)
break;
if(f!
=1)
{
printf("魔王语言错误!
\n");
break;
}
}
elseif(e1==')')
{
printf("魔王语言错误!
\n");
mark=0;
break;
}
elseif(!
(e1>='a'&&e1<='z')&&!
(e1>='A'&&e1<='Z'))
{
printf("魔王语言错误!
\n");
mark=0;
break;
}
}
if(mark==1&&f==1)//对符合语言规则的魔王语言进行规则处理
{
ClearStack(S);
InStack(MoWang,S);//把魔王语言从右至左压栈存放
while(!
StackEmpty(S))//栈不空时,用栈temp进行存储不带括号内元素的元素
{
Pop(S,e1);
if(e1=='B'||e1=='A')Push(temp,e1);
elseif(e1=='(')//用队存储括号中的元素
{
Push(temp,flag);//有括号的话就用flag标记
Pop(S,e1);
while(e1!
=')')//把括号中的元素存入队列中
{
EnQueue(Q,e1);
Pop(S,e1);
}
if(!
QueueEmpty(Q))DeQueue(Q,key);
//将队头的元素赋值给key
}
elsePush(temp,e1);
}
while(!
StackEmpty(temp))//将魔王说的语言规则地压入栈s中
{
Pop(temp,e1);
if(e1!
=flag)Push(S,e1);//把括号外的元素压入中
else{
while(!
QueueEmpty(Q))//处理括号中的元素进栈
{
DeQueue(Q,e2);
Push(S,key);
Push(S,e2);
}
Push(S,key);//最后还要压一个key
}
}
printf("解释后的语言为:
\n");
while(!
StackEmpty(S))//依次出栈输出处理后的元素
{
Pop(S,e);
EnQueue(Q,e);//元素进队是为了输出对应汉字
if(e=='B')printf("%s",B);
elseif(e=='A')printf("%s",A);
elseprintf("%c",e);
}
printf("\n");
while(!
QueueEmpty(Q))//翻译成对应的汉字
{
DeQueue(Q,e);
switch(e)
{
case't':
printf("天");break;
case'd':
printf("地");break;
case's':
printf("上");break;
case'a':
printf("一只");break;
case'e':
printf("鹅");break;
case'z':
printf("追");break;
case'g':
printf("赶");break;
case'x':
printf("下");break;
case'n':
printf("蛋");break;
case'h':
printf("恨");break;
case'B':
printf("天上一只鹅地上一只鹅");break;
case'A':
printf("上一只鹅");break;
default:
printf("*");break;
}
}
printf("\n");
}
printf("再次输入魔王语言(按数字键:
0----退出)\n");
scanf("%d",&xunhuan);
}
return0;
}
4调试分析
1.函数调用。
函数调用是语言中一块十分重要部分,它可以把一个程序分成若干部分,然后进行配置,所以这块内容一定要学好。
2.栈和队列问题比较简单。
3.由于考虑不周,如果同样的字母出现时,规则会要求重复输入,最终以最后一个为准,这是一个失误,后来改正程序,过滤掉重复字母。
5测试分析
5.1当输入A时系统显示:
5.2当输入B(ehnxgz)B是系统显示:
6用户手册
1、本程序运行在DOS命令下
2、进入程序后即显示用户界面:
3、注意输入后即可得到相应的结果。
7心得与体会
在设计的过程中,主要使用到了数据结构中的栈和队列,将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。
此课程设计旨在解决魔王的语言逐步翻译为人能听懂的语言,可扩充为对相应简单加密的文件进行翻译解释。
通过三次分别测试,包括符合测试要求、部分符合测试要求、不符合测试要求,并且实验结果和我们预想的一样,说明了魔王语言解释系统是符合学年设计任务要求的。
本学年设计,一方面在透彻地理解c语言和数据结构的基本概念和原理之上,使之由抽象理论转变成了具体的实际应用,化抽象为具体。
虽然遇到了各种各样的问题,但是在设计的过程中我们发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过通过对所学课程的复习和老师的耐心指导设计终于顺利完成了,在此再次感谢刘老师。
8参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2002.
[2]严蔚敏,吴伟民.数据结构题集(C语言版)[M].北京:
清华大学出版社,2003.
[3]胡学钢.数据结构(C语言版)[M].北京:
高等教育出版社,1999.
9附录(代码源程序及注释)
#include
#include
#defineSTACK_INIT_SIZE100
#defineSTACK_INCREMENT10
structStack//定义栈
{
char*base;
char*top;
intstacksize;
};
voidInitStack(structStack&s)//构造栈
{
s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
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++;
}
voidPop(structStack&s,char&e)//取出栈中的元素
{
e=*--s.top;
}
intStackEmpty(structStacks)//判断栈是否为空
{
if(s.top==s.base)return1;
elsereturn0;
}
voidClearStack(structStack&s)//清空栈
{
s.top=s.base;
}
structQueue