魔王语言实验报告
数据结构魔王语言实验报告

数据结构与算法实验报告姓名院系学号任课教师指导教师实验地点软件学院实验时间2011年10月29 日实验名称数据结构实验一栈和队列同组人无预习报告(对实验主要内容的认识) 得分实验内容(问题,思路,程序,结果)得分1.题目:魔王语言2.问题描述:有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的;α→β1β2…βm(θδ1δ2…δn)→δnθδn-1θ…δ2θδ1在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂得话。
3.算法思想描述(1)算法的思想①我将设置三个堆栈和两个队列处理这个问题,首先将魔王语言自右向左压入堆栈*2(一个用来测试S_3另一个用来操作S_1),然后判断此句话中是否有括号,若无则直接将操作堆栈弹出到队列中然后输出;②若有括号则先弹出操作堆栈S_1到队列Q_1中,遇到"("时跳过这个括号然后将括号后面的第一个字母标记(记作A ),将除第一个字母外的其他字母弹出到队列Q_2中,直到遇到")"为止,将“)”弹出;③将Q_2的元素每后面一个加原来的第一个元素A 压入堆栈S_2;④将堆栈S_2的元素弹出到Q_1中,然后将S_1中剩余的元素弹出到Q_!; ⑤按照对应的字母翻译即可。
(2)算法流程图开始 是否有括号 直接将堆栈中的弹出入队列翻译输出 将魔王语言自右向左压入堆栈S_1 NO YES 将堆栈S_1中的元素弹出到Q_1 弹出元素为"(" YES NO 弹出(后第一个元素记为A 将剩余元素弹入队列Q_2中 NO弹出元素为)YES将Q_2元素每个加A压入栈S_2将S_2中的元素弹出到Q_1中将S_1中剩余元素弹出到Q_1中翻译后输出结果结束4.数据结构描述(描述解决问题用到的数据结构)(1)所用数据结构的描述S_1堆栈负责自右向左存放魔王语言S_2堆栈存放处理过的括号里的语言S_3堆栈负责判断是否有括号Q_1队列存放处理后的语言Q_2队列负责存放括号中的语言(2)函数功能说明及函数的实现源代码①堆栈实现#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDED#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100#define STACK_INIT_MAX 100#define STACKINCREMENT 10#define ERROR 0#define OK 1#define FALSE 0#define TRUE 1typedef int Status;typedef struct{ //顺序栈类型定义char *top;char *base;int stacksize;}SqStack;Status InitStack(SqStack &s){ //构造一个空栈ss.base=(char *)malloc(STACK_INIT_MAX*sizeof(char)); if(!s.base) exit(OVERFLOW); //存储分配失败s.top = s.base;s.stacksize = STACK_INIT_MAX;return OK;}Status Pop(SqStack &s,char &e){ //删除s的栈顶元素,并以e返回其值if(s.top == s.base) return FALSE;s.top--;e = *(s.top);return TRUE;}Status Push(SqStack &s,char e){ //在栈s的栈顶插入新的栈顶元素e if((s.top-s.base) >= s.stacksize){s.base=(char*)realloc(s.base,(s.stacksize+STACKINCREMENT) * sizeof(char));if(!s.base) exit(OVERFLOW); //存储分配失败s.top = s.base + s.stacksize;s.stacksize += STACKINCREMENT;}*s.top = e;s.top++;return OK;}Status DestroyStack(SqStack &s){ //销毁栈sfree(s.base);s.stacksize = 0;return OK;}void InStack(char* ch,SqStack &s){//把字符数组从右至左压入栈中int i,L=0;while(ch[L]!='\0'){L++;}for(i=L-1;i>=0;i--){Push(s,ch[i]);}}Status StackEmpty(SqStack s){//栈是否为空if(s.top==s.base){return 1;}else{return 0;}}#endif // STACK_H_INCLUDED②队列实现#ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100#define ERROR 0#define OK 1#define FALSE 0#define TRUE 1typedef struct{ //循环队列类型定义char *base;int front;int rear;}SqQueue;Status InitQueue(SqQueue &q){ //构造一个空队列qq.base = (char *)malloc(MAXSIZE*sizeof(char));if(!q.base) exit(OVERFLOW); //存储分配失败q.front = q.rear = 0;return OK;}Status EnQueue(SqQueue &q,char e){ //插入元素e为q的新的队尾元素if((q.rear+1) % MAXSIZE == q.front) return ERROR;q.base[q.rear] = e;q.rear = (q.rear + 1) % MAXSIZE;return OK;}Status DeQueue(SqQueue &q,char &e){ //若队列不空,则删除q的对头元素,用e返回其值,//并返回OK;否则返回ERRORif(q.front == q.rear) return ERROR;e = q.base[q.front];q.front = (q.front + 1) % MAXSIZE;return OK;}Status DestroyQueue(SqQueue &q){ //销毁队列q,q不再存在free(q.base);return OK;}#endif // QUEUE_H_INCLUDED③main函数实现#include <iostream>#include"Stack.h"#include"Queue.h"int main(){int length,i,mark; //length表示魔王语言的长度,mark为"("数mark=0;char e,str,j; //e为插入值或删除值,str为重复打印的字符,j为检测符char MoWang[100];//用来储存魔王的语言SqStack S_1;SqStack S_2;SqStack S_3;//检测栈InitStack(S_1);//初始化堆栈InitStack(S_2);InitStack(S_3);SqQueue Q_1;SqQueue Q_2;InitQueue(Q_1);//初始化队列InitQueue(Q_2);printf("请输入魔王的语言:\n");scanf("%s",&MoWang);//将魔王语言存入数组中length=strlen(MoWang);//魔王语言的长度包括括号i=0;InStack(MoWang,S_1);//将魔王语言自右向左入栈InStack(MoWang,S_3);//检测魔王语言while(!StackEmpty(S_3)){Pop(S_3,j);if(j=='('){mark=1;}}if(mark==1){while(e!=')'){//处理")"之前的元素Pop(S_1,e);if(e=='('){Pop(S_1,str);//记录需要重复打印的字符while(e!=')'){Pop(S_1,e);EnQueue(Q_2,e);//将括号内的元素入队列i++;}break;}EnQueue(Q_1,e);//将"("外的元素存入第一个队列中}for(;i>2;i--)//将括号内除了第一个和最后一个元素,其他元素连同第一个元素分次入栈{DeQueue(Q_2,e);//将队列中的第一个元素弹出存入ePush(S_2,e);//将e压入s_2中Push(S_2,str);//将str压入s_2中}DeQueue(Q_2,e);//将括号中的最后一个元素弹出存入ePush(S_2,e);//将e压入s_2中//将s_2堆栈中的元素弹出到队列Q_1中while(!StackEmpty(S_2)){Pop(S_2,e);EnQueue(Q_1,e);}while(!StackEmpty(S_1))//将魔王语言")"后的读入到Q_1中{Pop(S_1,e);EnQueue(Q_1,e);}}else{//若无括号直接输入while(!StackEmpty(S_1)){Pop(S_1,e);EnQueue(Q_1,e);}}while(Q_1.front!=Q_1.rear){DeQueue(Q_1,e); //删除队首元素switch(e) //判断并打印翻译后的语言{case 't': printf("天");break;case 'd': printf("地");break;case 's': printf("上");break;case 'a': printf("一只");break;case 'w': printf(",");break;case 'e': printf("鹅");break;case 'z': printf("追");break;case 'g': printf("赶");break;case 'x': printf("下");break;case 'n': printf("蛋");break;case 'i': printf("恨");break;case 'A': printf("上一只鹅");break;case 'B': printf("天上一只鹅地上一只鹅");break;default: printf("error!!!");}}printf("\n"); //换行DestroyQueue(Q_1);DestroyQueue(Q_2); //释放队列qDestroyStack(S_1); //释放栈s DestroyStack(S_2);return 0;}5.测试结果翻译成功结果如下图:实验结论得分成功利用堆栈和数组完成魔王语言的翻译教师评价总分实际得分。
魔王语言解释

一.实验目的设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题。
通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练二.实验内容主要功能:魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:1)a---> (B1)(B2)....(Bm)2)[(op1)(p2)...(pn)]---->[o(pn)][o(p(n-1))].....[o(p1)o]在这两种形式中,从左到右均表示解释.试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话.基本要求:用下述两条具体规则和上述规则形式(2)实现.设大写字母表示魔王语言的词汇;小写字母表示人的语言的词汇;希腊字母表示可以用大写字母或小写字母代换的变量.魔王语言可含人的词汇.1) B --> tAdA2) A --> sa三.实验步骤(可选)声明:#include<iostream>using namespace std;#include<string>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10void EnQueue(struct LinkQueue &q,char e) //元素入队列void DeQueue(LinkQueue &q,char &e) //元素出队列int QueueEmpty(struct LinkQueue q) //判断栈是否为空void InStack(char *ch,stack &s) //把字符压入栈中void InQueue(char *ch, LinkQueue &q) //数组元素入队列void ClearQueue(LinkQueue &q, char e) //清空队列定义结构体:struct stack //栈结构体定义{char* base;char* top;int stacksize;};struct LinkQueue //队列结构体定义{struct Queue* front;struct Queue* rear;};初始化栈void InitStack(stack &s){s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));if(!s.base)exit(-1);s.top=s.base;s.stacksize=STACK_INIT_SIZE;}程序主函数:void main(){int i=0,h;char a[100];char A[]="sae";char B[]="tsaedsae";int mark=1;struct stack S;InitStack(S);LinkQueue Q,Q1;InitQueue(Q);InitQueue(Q1);char mowang[100];char x,e;cout<<" *********************魔王语言********************"<<endl<<endl;cout<<" 请输入你要翻译的魔王语言";gets(mowang); //获取字符串存入mowang数组中InStack(mowang,S); //把要解释的魔王语言压入栈中(从右至左)cout<<endl<<" 魔王语言翻译为人语言为:";while(!StackEmpty(S)){Pop(S,e);if(e=='('){mark=0;if(StackEmpty(S)){cout<<" 你输入的魔王语言不合法"<<endl;ClearQueue(Q1,e);break;}Pop(S,e);while(mark==0){if(e!=')')EnQueue(Q,e); //将括号内的字符存入队列else{mark=1;break;}if(!StackEmpty(S))Pop(S,e);elsebreak;}if(mark==0){cout<<" 你输入的魔王语言不合法"<<endl;ClearQueue(Q1,e);break;}if(!QueueEmpty(Q)){DeQueue(Q,e); //规则2字符进栈x=e;Push(S,x);while(!QueueEmpty(Q)){DeQueue(Q,e);Push(S,e);Push(S,x);}}e='\0';}if((e!='\0' && e<'A') || (e>'Z' && e<'a') || (e>'z')) {cout<<" 你输入的魔王语言不合法";ClearQueue(Q1,e);break;}if(e){switch(e){case 'B' : cout<<B; InQueue(B,Q1); e='\0';break;case 'A' :cout<<A;InQueue(A,Q1); e='\0'; break;default : cout<<e;}}if(e)EnQueue(Q1,e);}cout<<endl<<endl<<" 与汉字建立关系输出为:"<<endl; cout<<" ";while(!QueueEmpty(Q1)){DeQueue(Q1,e);switch(e){case 't' : cout<<"天";break;case 'd' : cout<<"地"; break;case 's' : cout<<"上"; break;case 'a' : cout<<"一只"; break;case 'e' : cout<<"鹅"; break;case 'z' : cout<<"追"; break;case 'g' : cout<<"赶"; break;case 'x' : cout<<"下"; break;case 'n' : cout<<"蛋"; break;case 'h' : cout<<"恨"; break;case '\0': cout<<""; break;}}cout<<endl;}四.实验的结果及分析。
魔王语言的课程设计

魔王语言的课程设计第一:课程设计目的利用这个魔王语言的算法以及规则来实现对于一连串的人类听不懂得语言(有大写和小写)第二:课程设计内容通过用“wenjian.”以及“qukuohao”两个文件来是实现对魔王语言的规则的定义,,利用栈和队来实现对于文件的存储来试下你对于魔王语言的翻译。
第三:需求分析:魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:1)a---> (B1)(B2)....(Bm)2)[(op1)(p2)...(pn)]---->[o(pn)][o(p(n-1))].....[o(p1)o]在这两种形式中,从左到右均表示解释.试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话.1.2基本要求:用下述两条具体规则和上述规则形式(2)实现.设大写字母表示魔王语言的词汇;小写字母表示人的语言的词汇;希腊字母表示可以用大写字母或小写字母代换的变量.魔王语言可含人的词汇.1) B --> tAdA2) A --> sae第四:概要设计功能模块层次结构图:第六:调试状况以及分析调试的时候有时候会调用出错,还有就是对于文件的掌握不是很熟悉,调用情况不是特别熟悉第五章源程序清单程序清单如下:魔王.cpp/*-----------------------定义头文件---------------------------*/#include<stdio.h>#include<string.h>#include<malloc.h>/*-----------------------定义全局变量-------------------------*/Int/*-------------------MAIN()主函数---------------------------*/******************************************************* *******************************************************。
魔王语言解释-数据结构课程设计

实习2、魔王语言解释一、需求分析1. 问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂,但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α->β1 β2 ... βn(2)(θδ1 δ2 ... δn) —>θδn θδn-1 ...θδ1 θ在这两种形式中,从左到右均表示解释。
试写一个魔王解释系统,把他的话解释成人能听懂得话。
2. 基本要求用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B—>tAdA(2)A—>sae3. 测试数据B(ehnxgz)B 解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。
4. 实现提示将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考如何处理。
应首先实现栈和队列的基本操作。
二、概要设计1、设定栈的抽象数据类型定义:ADT Stack {数据对象:D= {a i| a i∈CharSet, i= 1,2,……n,. n≥0 }数据关系:R1={ <a i-1 ,a i> | a i-1,a i∈D, a i-1<a i ,i=1,2……,n}基本操作:InitStack(*S)操作结果:构造一个空栈。
Push(*S,e)初始条件:栈S已存在操作结果:在栈顶插入新的元素。
Pop(*S,*e)初始条件:栈S已存在操作结果:删除栈顶元素,并用e返回其值。
StackEmpty(S)初始条件:栈S已存在操作结果:若S为空栈,则返回1,否则返回0。
教师语言暴力实验报告

一、实验背景随着社会的发展和教育的进步,教师作为学生成长道路上的引路人,其言行对学生的影响愈发重要。
然而,近年来,教师语言暴力现象逐渐引起广泛关注。
为了深入了解教师语言暴力对学生心理和行为的影响,本实验旨在通过模拟实验的方式,探讨教师语言暴力对学生的影响。
二、实验目的1. 了解教师语言暴力的表现形式及对学生心理和行为的影响。
2. 探讨教师语言暴力与学生心理健康之间的关系。
3. 为预防和减少教师语言暴力提供参考依据。
三、实验方法1. 实验对象:选取某小学五年级学生30名,随机分为实验组和对照组,每组15人。
2. 实验材料:教师语言暴力模拟材料、学生心理测试量表、学生行为观察记录表。
3. 实验步骤:(1)实验前,对实验组和对照组进行心理测试和行为观察,了解两组学生的基本情况。
(2)实验过程中,实验组学生接受教师语言暴力模拟,对照组学生接受正常教学。
(3)实验后,再次对两组学生进行心理测试和行为观察,比较两组学生在实验前后的变化。
四、实验结果1. 实验组学生在接受教师语言暴力模拟后,心理测试得分显著低于对照组,表现出焦虑、抑郁等心理问题。
2. 实验组学生在接受教师语言暴力模拟后,行为观察记录表显示,他们在课堂上的注意力不集中、参与度低,甚至出现逃课、打架等不良行为。
3. 实验结果表明,教师语言暴力对学生的心理健康和行为产生负面影响。
五、讨论与分析1. 教师语言暴力对学生心理的影响:实验结果显示,教师语言暴力会导致学生产生焦虑、抑郁等心理问题。
这可能是由于教师语言暴力使学生感到自尊心受损,进而影响到他们的心理健康。
2. 教师语言暴力对学生行为的影响:实验结果显示,教师语言暴力会使学生在课堂上的注意力不集中、参与度低,甚至出现逃课、打架等不良行为。
这可能是由于教师语言暴力使学生产生逆反心理,进而影响到他们的行为。
3. 教师语言暴力的成因:教师语言暴力产生的原因主要有以下几点:(1)教师教育观念落后,缺乏对学生人格尊严的尊重。
DS_上机实验的目的、要求和评分标准

上机实验的目的、要求和评分标准一、实验目的上机实践是各位对本门课程所学知识的一种全面、综合的能力训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节,也是对课堂教学与实践教学效果的一种检验。
通常,实验题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合,使你们学会如何把书上学到的知识运用于解决实际问题的过程中去,培养从事软件开发设计工作所必需的基本技能;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析(需求分析)、总体结构设计和用户界面设计(概要设计)、程序设计基本技能和技巧等,即一整套软件工程规范的训练和科学作风的培养。
此外,还有很重要的一点是:机器是比任何教师都严厉的主考者。
为了达到上述目的,本课程共安排了10个实验单元,各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实验单元与教科书的各章具有紧密的对应关系。
二、要求:⒈做好每一次上机前的准备以提高上机效率:①预先认真阅读相关实验内容,做到心中有明确的目的要求和任务,要有备而来,应该自己独立的思考和设计你的算法和程序,并争取在规定的时间内如期完成上机工作任务。
对于个别目前基础较差的同学,实在是没法完成任务的建议你先参考其他同学的算法,勤学好问,最终自己独立完成,以增强你的感性认识,强化你的实践基础,提高你的实践能力。
②按照实验内容规定的习题题目,事先在实验预习报告上编写好源程序及运行程序所需的典型数据,并经人工静态检查认为无误;手编程序应书写整齐,应在每个题目之间留出一定的空间,以备记录上机调试情况和运行结果等;对程序中自己有疑问的地方,应作出记号,以便上机时给以注意。
③将想要上机验证的问题草拟提纲;制定一个简捷的程序调试计划。
⒉上机时输入和调式自己所编写的程序。
对“出错信息”,应善于自己分析判断,并充分利用开发工具提供的错误信息和调试手段解决出现的问题,及时修改与完善算法、源程序,随时记录有价值的内容。
数据结构课程设计报告-魔王语言实验报告模板

西安郵電學院数据结构课程设计报告题目:魔王语言院系名称:计算机学院专业名称:软件工程班级:学生姓名:学号(8位):指导教师:设计起止时间:一. 设计目的1、熟悉链表、队列、栈、排序、查找、文件等内容的的使用。
2、将数据结构的内容结合到一起使用。
3、熟悉掌握数据结构的内容。
4、了解递归与非递归的使用。
二. 设计内容以栈和队列为数据结构,使用文件读写、查找等操作,完成对魔王语言的解释。
三.概要设计1.功能模块图;开始主函数输入魔王说的话调用取括号函数读取文件rule.txt 读取文件mean.txt将栈中的元素存入数组中将魔王的话转化成小写字母将魔王语言翻译为汉语意思将结果保存到文件中结束2.各个模块详细的功能描述。
1.入栈操作函数int push(Stack *s,char x)讲传递过来的字符入栈;2.出栈操作char pop(Stack *s)将当前栈顶的字符出栈,并将其返回;3.入队操作函数int queue_in(Queue *p,char ch)将传递过来的ch中的字符入队;4.出队操作char queue_out(Queue *p)将当前队头的字符出队,并将其返回;5.去除魔王语言中括号模块void deletenode(Stack *s,Queue *r,char a[],int i)利用队栈的进栈出栈操作,入队出队操作,将魔王语言中的括号去除,使之成为一个字母的序列;6 .文件读取函数void read_file(),void word_file()通过文件函数,读取rule和mean文件,并将其输出到终端;7.将栈中的元素存入数组中void store(char a[],Stack *s)将栈中的元素按次序存入到数组中;8. 魔王语言转字母语言void change(char a[])将输入的魔王语言通过循环判断转换成字母语言;9 .将字母语言翻译为人类语言void translate(char a[],struct Word *h)将已经由魔王语言转换成的字母语言通过对照转换成人类语言10.文件保存函数void save_file(struct Word *h)将已经转换好的魔王语言保存到自定义路径。
魔王语言实验报告

数据结构课程设计报告题目:魔王语言系部名称:通信工程专业名称:班级:学号:学生姓名:指导教师:时间:一、课程设计目的(1)熟练掌握C语言和数据结构的相关操作。
(2)综合应用C语言的知识和数据结构的知识,编写程序,并且对以前所学的知识进行复习。
( 3 ) 培养学生独立完成课程设计的能力。
二、课程设计内容1.用带头结点的动态单链表来存储多项式;在此基础上完成多项式乘法运算要求以动态链表为存储结构、使用到查找和排序等操作;在创建多项式的过程中,可以按指数的任意顺序输入,并且可在同一多项式中输入指数相同的多项;在进行乘法操作之前,输出参与操作的两个多项式。
要求输出的多项式按指数降序排列,同指数的多项合并,项数的正负号显示合理。
2.魔王语言有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 ……θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
读取文件,并统计1. 读取文本文件(rule.txt), 将具体规则的对应关系读入数组或链中2. 读取文本文件(mean.txt), 将小写字母及其对应的含义读入数组或链表中处理规则形式(2)按照规则形式(2)处理魔王所说的话。
处理完毕后,对应的解释语句不再含有()。
处理规则形式(1)按照读入的具体规则,对上一步处理的结果进行规则形式(1)的处理,得到魔王所说的话的人类语言结果。
写结果文件按照所读入的小写字母对应的文字含义,将翻译成的人类语言转换成文字语句,写入文件result.txt中。
读取文件,并统计1. 读取文本文件(rule.txt),将具体规则的对应关系读入数组或链表中2. 读取文本文件(mean.txt), 将小写字母及其对应的含义读入数组或链表中处理规则形式(2)按照规则形式(2)处理魔王所说的话。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
魔王语言实验报告本页仅作为文档页封面,使用时可以删除This document is for reference only-rar21year.March数据结构实验报告(魔王语言)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)魔王语言的解释规则:大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)抽象数据类型:typedef struct{StackElementType elem[Stack_Size]; int top;}SeqStack;主程序模块:int main(){GhostLanage();printf("\n\t按任意键退出\n\n");}各子程序模块:/*初始化栈*/void InitStack(SeqStack *s){s->top=-1;}/*进栈操作*/void Push(SeqStack *s,StackElementType x){if(s->top==Stack_Size-1)printf("\n\t栈已满! ");else {s->top++;s->elem[s->top]=x;}}/*出栈操作*/void Pop(SeqStack *s,StackElementType *x){if(s->top==-1)printf("\n\t栈为空! ");else {*x=s->elem[s->top];s->top--;}}/*取栈顶元素*/void GetTop(SeqStack *s,StackElementType *x) {if(s->top==-1)printf("\n\t栈为空! ");else *x=s->elem[s->top];}/*判断栈是否为空*/int IsEmpty(SeqStack *s){if(s->top==-1) return(0);else return(1);}/*魔王语言翻译函数*/void GhostLanage(){SeqStack B,A,s,B1,A1,r,M;StackElementType ch,ch1,ch2,x;char aa[100];int choice,i=0,n;InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r);InitStack(&M);printf("魔王语言的转换形式: B->tAdA A->sae");Push(&B,'t');Push(&B,'A');Push(&B,'d');Push(&B,'A');Push(&A,'s');Push(&A,'a');Push(&A,'e');printf("\n请输入要翻译的魔王语言:\n");scanf("%s",aa);for(i=0;aa[i]!='\0';i++)Push(&s,aa[i]);while(IsEmpty(&s)){Pop(&s,&ch);if(ch=='B'){B1=B;while(IsEmpty(&B1)){Pop(&B1,&ch1);if(ch1=='A'){A1=A;while(IsEmpty(&A1)){Pop(&A1,&ch2);Push(&r,ch2);}}else Push(&r,ch1);}}else if(ch=='A'){A1=A;while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2);}}else if(ch==')'){Pop(&s,&ch2);while(ch2!='('){Push(&M,ch2);Pop(&s,&ch2);}GetTop(&M,&ch2);x=ch2;Pop(&M,&ch2);while(IsEmpty(&M)){Push(&r,x);Pop(&M,&ch2);Push(&r,ch2);}Push(&r,x);}else Push(&r,ch);}M=r;printf("\n\n\t翻译的结果为: ");while(IsEmpty(&M)){Pop(&M,&ch);printf("%c",ch);}printf("\n\n\t是否继续翻译为汉语:( 1-继续,0-不继续)"); scanf("%d",&n);if(n==1){ printf("\n\n\t翻译为汉语的结果为: \n\n\t");M=r;while(IsEmpty(&M)){Pop(&M,&ch);if(ch=='t') printf("天");else if(ch=='d') printf("地");else if(ch=='s') printf("上");else if(ch=='a') printf("一只");else if(ch=='e') printf("鹅");else if(ch=='z') printf("追");else if(ch=='g') printf("赶");else if(ch=='x') printf("下");else if(ch=='n') printf("蛋");else if(ch=='h') printf("恨");}printf("\n");}else ;}三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
)void InitStack(SeqStack *s);/*初始化栈*/void Push(SeqStack *s,StackElementType x); /*进栈操作*/void Pop(SeqStack *s,StackElementType *x);/*出栈操作*/void GetTop(SeqStack *s,StackElementType *x);/*取栈顶元素*/int IsEmpty(SeqStack *s);/*判断栈是否为空*/void GhostLanage();/*魔王语言翻译函数*/函数间的调用关系:主程序调用魔王语言翻译函数,然后魔王语言翻译函数调用其它的函数(初始化栈,进栈,出栈,取栈顶元素,判断栈空),以此来实现整个程序的运行。
四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)输入的魔王语言为:B(ehnxgz)B翻译的结果为: tsaedsaeezegexenehetsaedsae翻译为汉语的结果为:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅结论:此程序能够按照给定的翻译规则解释魔王语言。
四、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,注意组内的任意一位同学都必须独立完成至少一项接口的实现;对所完成实验的经验总结、心得)通过这个实验。
特别是实验中对栈的应用,让我更深入的了解了栈的特性,更加了解了栈的构造及构造方法。
这次实验实现了简单的魔王语言解释,按照给定的规则能够翻译出一句有意义的话,但不足的是,程序中的规则是指导书中给定的规则,没有定义出自己的规则,在今后的时间里,还需要自己进行不断的改善,争取能够自己定义规则。
这次实验对魔王语言的解释,让我看到了如何对信息进行简单的加密,看到了加密的雏形,这对于今后更深入的学习起到了启蒙的作用。
总的来说,这次实验让我收获了很多,同时也让我发现了很多的不足,希望在今后的学习中,不断努力,使程序更加的完美。
五、【项目运作描述(Operate)】(10%)(本部分应包括:项目的成本效益分析,应用效果等的分析。
)六、【代码】(10%)(本部分应包括:完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体: Georgia , 行距: 固定行距12,字号: 小五)#include <>#define StackElementType char#define Stack_Size 100typedef struct{StackElementType elem[Stack_Size];int top;}SeqStack;void InitStack(SeqStack *s);/*初始化栈*/void Push(SeqStack *s,StackElementType x); /*进栈操作*/void Pop(SeqStack *s,StackElementType *x);/*出栈操作*/void GetTop(SeqStack *s,StackElementType *x);/*取栈顶元素*/int IsEmpty(SeqStack *s);/*判断栈是否为空*/void GhostLanage();/*魔王语言翻译函数*//*主函数*/int main(){GhostLanage();printf("\n\t按任意键退出\n\n");}/*初始化栈*/void InitStack(SeqStack *s){s->top=-1;}/*进栈操作*/void Push(SeqStack *s,StackElementType x){if(s->top==Stack_Size-1)printf("\n\t栈已满!");else {s->top++;s->elem[s->top]=x;}}/*出栈操作*/void Pop(SeqStack *s,StackElementType *x){if(s->top==-1)printf("\n\t栈为空!");else {*x=s->elem[s->top];s->top--;}}/*取栈顶元素*/void GetTop(SeqStack *s,StackElementType *x){if(s->top==-1)printf("\n\t栈为空!");else *x=s->elem[s->top];}/*判断栈是否为空*/int IsEmpty(SeqStack *s){if(s->top==-1) return(0);else return(1);}/*魔王语言翻译函数*/void GhostLanage(){SeqStack B,A,s,B1,A1,r,M;StackElementType ch,ch1,ch2,x;char aa[100];int choice,i=0,n;InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r);InitStack(&M); printf("魔王语言的转换形式:B->tAdA A->sae");Push(&B,'t');Push(&B,'A');Push(&B,'d');Push(&B,'A');Push(&A,'s');Push(&A,'a');Push(&A,'e');printf("\n请输入要翻译的魔王语言:\n"); scanf("%s",aa);for(i=0;aa[i]!='\0';i++)Push(&s,aa[i]);while(IsEmpty(&s)){Pop(&s,&ch);if(ch=='B'){B1=B;while(IsEmpty(&B1)){Pop(&B1,&ch1);if(ch1=='A'){A1=A;while(IsEmpty(&A1)){Pop(&A1,&ch2);Push(&r,ch2);}}else Push(&r,ch1);}}else if(ch=='A'){A1=A;while(IsEmpty(&A1)){Pop(&A1,&ch2);Push(&r,ch2);}}else if(ch==')'){Pop(&s,&ch2);while(ch2!='('){Push(&M,ch2);Pop(&s,&ch2);}GetTop(&M,&ch2);x=ch2;Pop(&M,&ch2);while(IsEmpty(&M)){Push(&r,x);Pop(&M,&ch2);Push(&r,ch2);}Push(&r,x);}else Push(&r,ch);}M=r;printf("\n\n\t翻译的结果为:");while(IsEmpty(&M)){Pop(&M,&ch);printf("%c",ch);}printf("\n\n\t是否继续翻译为汉语:(1-继续,0-不继续)"); scanf("%d",&n);if(n==1){ printf("\n\n\t翻译为汉语的结果为:\n\n\t");M=r;while(IsEmpty(&M)){Pop(&M,&ch);if(ch=='t') printf("天");else if(ch=='d') printf("地");else if(ch=='s') printf("上");else if(ch=='a') printf("一只");else if(ch=='e') printf("鹅");else if(ch=='z') printf("追");else if(ch=='g') printf("赶");else if(ch=='x') printf("下"); else if(ch=='n') printf("蛋"); else if(ch=='h') printf("恨"); }printf("\n");}else ;}。