魔王语言学习知识报告(带有完整编辑程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安郵電學院
数据结构课程设计报告题目:魔王语言
院系名称:
专业名称:
班级:
学生姓名:
学号(8位):
指导教师:
设计起止时间:
一. 设计目的
以栈和队列为数据结构,使用文件读写、查找等操作,完成对魔王语言的解释。
二. 设计内容
有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α→β1β2 ……βm
(2)(θδ1δ2 ……δn)→θδnθδn-1 …… θδ1 θ
在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
三.概要设计
通过栈、队列和函数的调用来实现魔王语言。
1
2.各个模块详细的功能描述。
1.
通过打开规则文件读取文件中的数据,并将其保存在数组r 中
通过打开小写字母匹配文件读取文件中的数据,并将其存储在链表
head 中。
3.
通过这个函数将所有的魔王语言存储在栈中。
4.
通过这个函数将魔王语言中所有的括号去掉,并将其结果存储在队列Q 中
5.
通过这个函数,根据规则文件,将去掉括号后的魔王语言中的大写字母全部转换为小写字母 6
通过这个函数,根据小写字母匹配文件,将小写字母全部翻译为人类语言。
7.
通过这个文件将翻译好的魔王语言保存在结果文件中,并为文件加密。
四.详细设计
1.功能函数的调用关系图
1.Open-rule()、Open-mean()keep()和translate()函数无调用其他自己设定的函数;
2.Pushall()函数调用关系图
3. Test_brack( );函数调用关系图
4.dealUpletter();函数调用关系图
5. password( );函数的调用关系图
2.各功能函数的数据流程图 dealUpletter函数的流程图:
dealUpletter()函数中的if语句
brack()函数的流程图:
brack()函数中的for循环语句:
for循环语句中的while语句1的流程图:
for循环语句中的while语句2的流程图:
for循环语句中的if语句的流程图:
3.重点设计及编码
void brack(LinkStack top,LinkQueue * Q)//处理括号
{
int n,k,s,i;
LinkStackNode * p;
LinkStack top1;
char x,y,ch;
n=0;
for(p=top->next;p!=NULL;p=p->next)
if(p->data == '(')
n++; //记录括号的个数
for(i=1;i<=n;i++)
{
for(s=0;s<n-i+1;)
{
Pop(top,&x); //将最内层括号外的数据存在下层栈
if(x == '(')
s++;
if(s!=n-i+1)
EnterQueue(Q,x);
}
InitStack(&top1);
k=0;
while(top->next->data != ')' ) //将最内层的括号内的字母逆序存储在辅助栈{
Pop(top,&x);
if(k==0)
ch=x; //记录最内层括号内第一个字母
Push(top1,x);
k++;
}
Pop(top,&y); //最内层括号)出栈
k=0; //处理最内层括号的内容
Pop(top1,&y);
while(top1->next != NULL)
{
if(k%2 == 0)
EnterQueue(Q,ch); //把最内层的括号的内容插入队列中
if(k%2 == 1)
{
EnterQueue(Q,y);
Pop(top1,&y);
}
k++;
}
EnterQueue(Q,ch);
while(top->next!=NULL)
{
Pop(top,&x);
EnterQueue(Q,x); //将最内层括号)外的字母存到队列中
}
if(i!=n)
{
InitStack(&top);
while(Q->front->next != NULL)
{
ch = Q->front->next->data;
DeleteQueue(Q,&ch); //处理外层括号,将队列中的数据存储在栈中
Push(top1,ch); //按照队列的存储数据存储到栈top中,top为辅助栈}
while(top1->next!=NULL)
{
Pop(top1,&ch);
Push(top,ch);
}
InitQueue(Q); //最后的结果存储在队列中
}
}
}
void dealUpletter(LinkQueue * Q,struct rule *r,LinkQueue* Q1) //处理大写字母{
LinkQueueNode * q;
char ch;
int flage;
InitQueue(Q1);
while(Q->front->next != NULL)
{
DeleteQueue(Q,&ch);
if(ch<='Z' && ch>='A')
alter(ch,r,Q,Q1);
else
EnterQueue(Q1,ch);
}
flage = 0;
for(q=Q1->front->next;q!=NULL;q=q->next) //查询是否含有大写字母if(q->data>='A' && q->data <= 'Z')
flage = 1;
if(flage == 1)
{
while(Q1->front->next != NULL)
{
DeleteQueue(Q1,&ch);
EnterQueue(Q,ch);
}
dealUpletter(Q,r,Q1);
}
}
五.测试数据及运行结果
1.正常测试数据和运行结果
1.魔王说的话B(ehnxgz)B
解释成人类语言:tsaedsaeezegexenehetsaedsae
将魔王语言翻译成汉语:
天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅
2. 魔王说的话A(hnxB(egz)xh)
解释成人类语言:saehhhxhehghehzhehtsaedsaehxhnh
将魔王语言翻译成汉语:
上一只鹅恨恨恨下恨鹅恨赶恨鹅恨追恨鹅恨天上一只鹅地上一只鹅恨下恨蛋恨
3. 魔王说的话se(heasan)d
解释成人类语言:sehnhahshahehd
将魔王语言翻译成汉语:
上鹅恨蛋恨一只恨上恨一只恨鹅恨地
异常测试数据及运行结果
1、输入:魔王说的话()
输出:解释成人类语言
将魔王语言翻译成汉语
2、输入:输入:魔王说的话se
输出:解释成人类语言se
将魔王语言翻译成汉上鹅
六.调试情况,设计技巧及体会语:
1.改进方案
此次魔王语言的设计,合理之处:使用链式存储结构,位置确定,可以简化思维过程。
不足之处:界面不够简洁明朗,有些异常数据并没有处理。
改进方案:合理使用清屏函数,使界面更加的简洁。
合理使用判断语句,处理异常数据。
2.体会
在此次魔王语言设计过程中,对于链栈和链队列有了更好的复习,但是在此过程中,对于链队列和链栈总是不自觉的当作普通的链表来处理其判断语句。
所以以后应该多复习,做到温故而知新。
七.参考文献
《C语言程序设计》谭浩强清华大学出版社
《C语言程序设计》王曙燕等科学出版社
《数据结构——使用C语言》陈一华等电子科技大学出版社
《数据结构题》严蔚敏吴伟民清华大学出版社
八.附录:
源代码(电子版)。