魔王语言实验报告
更新时间:2023-12-23 20:04:01 阅读量: 教育文库 文档下载
数据结构课程设计报告
题 目:系部名称 :专业名称 :班 级 :学
号 :学生姓名 :指导教师 :时
间 : 魔王语言
通信工程
1
一、 课程设计目的
(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)
按照读入的具体规则,对上一步处理的结果进行规则形式(1)的处理,得到魔王所说的话的人类语言结果。 ", 写结果文件
按照所读入的小写字母对应的文字含义,将翻译成的人类语言转换成文字语句,写入文件result.txt中。
2
三、需求分析
对所开发系统功能、性能的描述,想要实现的目标。
利用队列存储左括号之前的英文字母,遇到左括号了把括号后面的字母在栈里面,在存储时将括号里的第一个字母镶嵌存在栈里面,处理完右括号左边的字母后让进栈的元素依次出栈存储在队列中,然后接着扫描括号后面的元素让所有元素都进队列。
从头开始扫描队列,将队列中的大写字母用rule.txt文件里相应的小写字母替换,挂在原来队列的后面,与到小写字母直接挂在队列的尾部,一次处理后再进行循环如上的操作,直到把所有的大写字母换成小写字母。
此时队列里存储的是一串小写字母,再进行扫描将小写字母和mean.txt文件里存储的对应汉字进行替换,依次替换然后输出,再将替换后的汉字存储在result.txt文件里面
四、概要设计
1.系统结构图(功能模块图)
对系统进行分析,给出系统结构图; 主函数 调用读取含义输出人的语言 调用菜单函调用读取规则 文件函数 数 文件函数 调用保存文件 若文件为空,调函数 若文件为空, 添加含义文件调添加规则文 函数 件函数 若选1调用添加若选2调用添加若选0调用翻译 规则文件函数 含义文件函数 函数
3
2.功能模块说明
(1)定义结构体:定义链栈的结构体LinkStackNode;定义链表存储翻译结果的结构体RESULT;定义链队结构体LinkQueueNode和LinkQueue。分别对链栈和链对进行初始化、入栈(队)、出栈(队)操作。
(2)读取规则文件函数read_rule():动态建立链表存放规则,将文件名为rule.txt的文件打开,用fscanf()函数将文件内容读入链表,将链表的头指针返回。
(3)读取含义文件函数read_mean():动态建立链表存放规则,将文件名为mean.txt的文件打开,用fscanf()函数将文件内容读入链表,将链表的头指针返回。
(4)添加规则文件函数append_rule():将存放规则文件内容的链表传递过来,用p2指针指向链表尾结点。循环按正确格式输入需添加的规则,动态建立结点存放输入的规则,将当前结点插入p2的下一个结点处,再让p2向后移动,推出循环添加结束。
(5)添加规则文件函数append_mean():将存放含义文件内容的链表传递过来,用p2指针指向链表尾结点。循环按正确格式输入需添加的规则,动态建立结点存放输入的规则,将当前结点插入p2的下一个结点处,再让p2向后移动,推出循环添加结束。
(6)保存文件函数save_file():将规则链表,含义链表,存放结果的链表分别传递过来,将各自所对应的文件打开,用fprintf()函数将添加的内容保存到文件里。
(7)菜单函数menu():输出刚进入系统后要选择的菜单,分别是添加规则(一)、添加含义、翻译魔王语言,用户选择后调用相应的函数。
(8)去括号函数translate1():首先要求用户输入需翻译的魔王语言,然后判断括号是否输入正确,若不正确,要求用户重新输入;若正确,开始进行翻译。初始化队q1,q2,q3,初始化栈s,将第一个左括号之前的字符全部入队q1,从下一个字符开始到第一个右括号结束,将此段字符入栈。然后出栈入队q2,碰到左括号时结束,出队q2入队q3,同时处理规则形式(二),栈不为空时将队3的字符入栈继续处理括号直到栈为空,处理后的字符在队3里面存放,最后将队3接到队1后面,去括号完成。
(9)大写字母翻译小写字母函数translate2():将规则链表rear和存放去括号后的魔王语言链n表传递过来,遍历n,当碰到大写字母时开始处理,在rear中查找相应的字母,找到后将对应的小写字母插入链表n中。继续遍历链表n,直到所有大写字母处理完。
(10)小写字母翻译成汉语函数translate3():将含义链表mean和存放去大写字母后的魔王语言链n表传递过来,遍历n,逐项在rear中查找相应的n中的字母,找到后将对应的汉语存放到结果链表(动态建立RESULT型的链表)中,若未找到,将此小写字母本身作为翻译后的结果存放在结果链表中。继续遍历链表n,直到所有小写字母遍历完。
(11)翻译函数tanslate():将规则链表rule和含义链表mean传递过来,首先调用tanslate1()函数进行去括号处理,在调用tanslate2()函数进行大写字母处理,将处理后的魔王语言输出,最后调用tanslate3()函数进行翻译处理,将结果存放到链表中,将链表返回至主函数。
五、详细设计及运行结果
流程图, 函数之间相互调用的图示 ,程序设计及编码, 运行结果。
4
(1)如括号处理的流程图:
输入魔王语言ch
判断括号是否匹配
初始化队q1,q2,q3,初 始化栈s,i←0
Y ch[i]='\\0'与
ch[i]='('
N
EnterQueue(q1,ch[i++])
N
ch[i]='('
Y
与 Y Ch[++i]='\\0' ch[i]=')'
N
push(s,ch[i])
N ch[i]=')'
Y
Y S->next=NULL与
(Pop(s,&x),x)='('
5 开始
typedef struct mean /*定义链表存储字母含义*/ { char data1; char data2[20]; struct mean *next; }MEAN;
void InitStack(LinkStack top) /*链栈的初始化*/ { top->next=NULL; }
int Push(LinkStack top,char x) /*进栈操作*/ { LinkStack temp; temp=(LinkStack)malloc(sizeof(LinkStackNode)); if(temp==NULL) return FALSE;/*申请空间失败*/ temp->data1=x; temp->next=top->next; top->next=temp;/*修改当前栈顶指针*/ return TRUE; }
int Pop(LinkStack top,char *x) /*出栈操作*/ { LinkStack temp; temp=top->next; if(temp==NULL) return FALSE;/*栈为空*/ top->next=temp->next; *x=temp->data1; free(temp);/*释放存储空间*/ return TRUE; }
int InitQueue(LinkQueue *q) /*链队列初始化*/ { q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if(q->front!=NULL) { q->rear=q->front; q->front->next=NULL; return TRUE; } else return FALSE; }
int EnterQueue(LinkQueue *q,char x) /*入队操作*/ { LinkQueueNode *NewNode;
11
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if(NewNode!=NULL) { NewNode->data1=x; NewNode->next=NULL; q->rear->next=NewNode; q->rear=NewNode; return TRUE; } else return FALSE; }
int DeleteQueue(LinkQueue *q,char *x) /*出队操作*/ { LinkQueueNode *p; if(q->front==q->rear) return FALSE; p=q->front->next; q->front->next=p->next; if(q->rear==p) /*如果队中只有一个元素p,则p出队后成为空队*/ q->rear=q->front; *x=p->data1; free(p); return TRUE; }
RULE *read_rule() /*读取规则文件*/ { FILE *fp; RULE *head,*p1,*p2; head=p2=(RULE *)malloc(sizeof(RULE)); fp=fopen(\ if(fp==NULL) { printf(\ 规则文件不存在,请建立\\n\ head->next=NULL; return head; }
while(1) { p1=(RULE *)malloc(sizeof(RULE)); if(fscanf(fp,\ { p2->next=p1; p2=p1; } else
12
{ p2->next=NULL; free(p1); return head; } } fclose(fp); }
MEAN *read_mean() { FILE *fp; MEAN *head,*p1,*p2; head=p2=(MEAN *)malloc(sizeof(MEAN)); fp=fopen(\ if(fp==NULL) { printf(\ 含义文件不存在,请建立\\n\ head->next=NULL; return head; } p1=(MEAN *)malloc(sizeof(MEAN)); while(1) { p1=(MEAN *)malloc(sizeof(MEAN)); if(fscanf(fp,\ { p2->next=p1; p2=p1; } else { p2->next=NULL; free(p1); return head; } } fclose(fp); }
RULE *append_rule(RULE *head) { RULE *p1,*p2; char x,a[8]; int n; p2=head;
13
/*读取含义文件*/ /*添加规则*/ while(p2->next!=NULL) p2=p2->next; while(n) { printf(\请已α->β1β2β3β4...形式输入规则\ p1=(RULE *)malloc(sizeof(RULE)); flushall(); scanf(\ p1->data1=x; strcpy(p1->data2,a); p1->next=NULL; printf(\输入的规则是%c->%s\ p2->next=p1; p2=p1; printf(\继续输入规则吗?\\n1-继续 0-不继续\\n请选择:[ ]\\b\\b\ scanf(\ flushall(); } return head; }
MEAN *append_mean(MEAN *head) /*添加含义*/ { MEAN *p1,*p2; int n; p2=head; while(p2->next!=NULL) p2=p2->next; while(n) { printf(\请输入(α->β)\ p1=(MEAN *)malloc(sizeof(MEAN)); flushall(); scanf(\ p1->next=NULL; printf(\输入的含义是 :%c->%s\ p2->next=p1; p2=p1; printf(\继续输入规则吗?\\n1-继续 0-不继续\\n请选择:[ ]\\b\\b\ scanf(\ flushall(); } return head; }
void save_file(RULE *p1,MEAN *p2,RESULT *p3) /*将规则、含义及翻译结果存入文件
14
*/ { FILE *fp; if((fp=fopen(\ {
printf(\读规则文件错误!\\n\ return; } while(p1) { if((fprintf(fp,\ { printf(\写规则文件错误!\\n\ break; } if(p1->next==NULL) break; else p1=p1->next; }
fclose(fp); if((fp=fopen(\ { printf(\读用户信息文件错误!\\n\ return; } while(p2) { if((fprintf(fp,\ { printf(\写含义文件错误!\\n\ break; } if(p2->next==NULL) break; else p2=p2->next; } fclose(fp); if((fp=fopen(\ { printf(\读翻译结果文件错误!\\n\ return; } while(p3) { if((fprintf(fp,\ {
15
case 2:append_mean(mean); break;/*添加含义*/ case 0:result=translate(mean,rule); break;/*开始翻译*/ } flushall(); }while(choice!=0); re=result->next; printf(\魔王说的话是: **\ while(re!=NULL) { printf(\ re=re->next; } printf(\ save_file(rule->next,mean->next,result->next);/*将规则、含义及翻译结果存入文件*/ }
21
正在阅读:
魔王语言实验报告12-23
C地块总承包招标文件07-05
数学选修课第一周教案 数独(一)03-17
计算机文化基础知识(计算机一级复习资料)05-03
小院四季作文300字06-24
文广局2021年健康中国行活动总结08-16
福州年会策划公司那家好?05-27
《国际金融学》课后练习09-18
第2章 关系数据库基本原理05-29
9#设计说明05-31
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 魔王
- 语言
- 实验
- 报告
- 刘爱梅讲解如何预测儿童身高
- 浙江省高中生物学考选考2016-2018年第33题实验题汇编
- GRE熟词僻义
- 贵州重点项目-德江8万亩中药材种植基地及初加工项目可行性研究报告
- 医院健康教育工作总结2013
- 九年级化学第十二单元课题2《化学元素与人体健康》导学案
- 中国现代诗歌的发展脉络
- 本科生毕业论文规定与要求
- 中考英语专题复习学案 阅读理解 - 图文
- 《物质结构导论》习题集+补充习题集
- 初中英语语法教案
- 我国濒临灭绝的植物 - 图文
- 区环水局年度工作总结及工作计划
- 2015两会提议切实提高农村教师待遇津贴 特级教师实施免税政策
- 浅议高职院校内涵建设
- 与人交流能力理论复习资料 及考试题型、考试注意事项2014.5.24考试用 - 图文
- 5.第五章 营养
- CAD使用技巧
- 人教版 高中英语 必修1-选修10 单词表
- 2014年高考数学真题分类汇编文科-平面向量(文科)