云南大学数据结构实验3
数据结构3-串及其应用.
实验3:串及其应用一、实验目的掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。
二、问题描述全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作。
用户可完成对文本的插入、删除、修改等功能。
三、实验要求1、对光标实现如下操作:上、下、左、右移动一个字符位置;向前、后翻页;光标移至文件首、尾;光标移至本行首、尾。
2、实现基本编辑命令:I----在当前光标前插入内容,按ESC结束F----在当前光标后插入内容,按ESC结束D----删除光标所在行ND---删除光标位置开始的n行N-----删除光标上的字符W----将修改后的文本保存下来Q----退出编辑状态。
四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、在内存开辟可容纳80行大小的编辑工作区和buffer 的修改缓冲区。
2、要求用户输入编辑文件名,对读入的文件建立相应的页表和行表,在文本编辑程序中设立页指针、行指针、字符指针,分别指示当前操作的页、行、字符。
3、执行插入、删除、修改操作时,将本次操作内容放到缓冲区;4、操作确定后,将修改后的文本存到文件中。
六、测试数据自行设定。
七、实验报告要求实验报告应包括以下几个部分:1、问题描述;2、算法的设计描述;3、测试结果的分析与讨论。
4、设计与实现过程中的体会,进一步的改进设想。
5、实验总结。
八、思考题1、对命令格式非法等错误做严格检查和适当处理。
2、扩充编辑操作,如对某行进行串替换?。
实验3:使用SQL语句创建并管理数据库
序号:云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2015-2016学年第二学期任课教师:张云春专业:信息安全学号:20141120206 姓名:严鑫成绩:实验3使用SQL语句创建并管理数据库做删除或修改操作时,请注意备份数据库一、CAP数据库1、用T-SQL语句创建并管理数据库CAP:记录创建数据库的SQL语句。
CREATE DATABASE capon(name='cap',filename='d:\cap.mdf',size=5mb,maxsize=30mb,filegrowth=10%)log on(name='caplog',filename='d:\cap.ldf',size=5mb,maxsize=25mb,filegrowth=1mb)2、修改数据库:将“CAP数据库”的数据库最大容量更改为无限制(UNLIMITED),然后将“CAP数据库”的日志文件增长方式改为2MB。
记录SQL语句。
alter database capmodify file(name=cap,filename='d:\cap.mdf',maxsize=unlimited)alter database capmodify file(name=caplog,filename='d:\cap.ldf',filegrowth=2)3、用T-SQL语句在“CAP数据库”创建数据表,数据表的结构见教材。
记录创建表的SQL语句。
create table customers(cid char(10)not null,cname char(10)not null,city char(10)not null,discnt char(10)null,primary key(cid))create table agents(aid char(10)not null,aname char(10)not null,city char(10)not null,[percent]char(10)null,primary key(aid))create table products(pid char(10)not null, pname char(10)not null, city char(10)not null, quantity char(10)not null, price char(10)not null, primary key(pid))create table orders(ordno char(10)not null, [month]char(10)not null, cid char(10)not null,aid char(10)not null,pid char(10)not null,qty char(10)not null, dollars char(10)not null, primary key(ordno))4、向表中添加记录,使用Insert Into 语句分别向四张表中添加教材上的数据记录。
数据结构实验报告模板-09版 -v2
云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □学期:2012秋季学期任课教师: 秦江龙实验题目: 线性表及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)基本思路:先写控制台程序,保证算法的正确性后,再将程序封装成界面程序;程序设计:用c++中文件的操作对要进行加密的明文来使之变为乱码,要求用户记住,文件加密密钥,只有记住密钥,然后通过志浩解密器才能转化为明文,从而起到加密的效果;编程知识:用到对文件的操作,对文件的打开,读写,关闭,删除,插入等操作。
对话框的打开以及对话框中的操作。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、文件加密器包括加密以及解密:包括对文件的打开,密钥的输入,验证操作,对文件中字符的转化加密,;1、单击事件有四个:a.浏览…是为了用户能够打开要加密的文件,省去用户输入地址的麻烦,方便用户使用,使界面更加和谐,软件更加人性化;b.重置,是为了用户在输入密码时如果输入错误,可以点击清空后重置;c.加密文件,是用户在填完上面的信息之后可以开始加密就点击,点击完成后将会在相应的目录下生成加密文件,用户可以在原位置找到相应的加密文件;d.解密文件,是对已经用志浩加密器加密过的文件才能操作,在用户确认密钥后方可点击该按钮,点击完成当解密完成后将弹出提示,再到该目录下查找就可以看到加密的密文变为明文;三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
云大软件工程实验三 软件设计
云大软件工程实验三软件设计云大软件工程实验三软件设计1.引言1.1 目的1.2 背景1.3 定义、缩略词和首字母缩略词的解释2.需求分析2.1 功能需求2.1.1 功能12.1.2 功能22.1.32.2 非功能需求2.2.1 性能需求2.2.2 可靠性需求2.2.3 安全性需求2.2.43.概要设计3.1 架构设计3.1.1 客户端-服务器架构3.1.2 分层架构3.1.33.2 模块划分3.2.1 模块13.2.2 模块23.2.33.3 接口设计3.3.1 外部接口3.3.2 内部接口3.3.33.4 数据库设计3.4.1 数据库结构3.4.2 数据库表设计3.4.34.详细设计4.1 模块1设计4.1.1 子模块1.1设计 4.1.2 子模块1.2设计 4.1.34.2 模块2设计4.2.1 子模块2.1设计 4.2.2 子模块2.2设计4.2.35.测试计划5.1 功能测试5.1.1 功能1测试用例 5.1.2 功能2测试用例 5.1.35.2 性能测试5.2.1 性能指标5.2.2 性能测试用例5.2.35.3 安全性测试5.3.1 安全漏洞测试用例5.3.2 安全性能测试用例5.3.36.上线计划6.1 部署步骤6.1.1 部署环境准备6.1.2 代码6.1.36.2 回滚计划6.3 验收标准附件:附件一:需求说明书附件二:设计图纸附件三:测试用例法律名词及注释:1.版权:对作品(例如文学、音乐、软件等)所赋予的法律上的保护,使其著作权人能够授权他人使用或复制作品。
2.专利:对发明的新技术、产品或方法的法律保护,使其专利持有人拥有独占使用或制造的权利。
3.商标:能够识别品牌或企业的标志、名称、符号或设计的法律保护,使其商标持有人能够独占使用。
4.涉密信息:指涉及国家安全、经济安全、社会公共利益和个人隐私安全等方面的机密信息。
数据结构实验报告实验总结
数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
数据结构实验三实验报告
数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。
具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。
二、实验原理树是一种非线性的数据结构,由结点和边组成。
树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。
树的基本操作包括插入、删除和查找。
在本次实验中,我们采用二叉树作为实现树的数据结构。
二叉树是一种特殊的树,每个结点最多只有两个子结点。
根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。
三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。
然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。
2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。
我们可以通过递归的方式实现插入操作。
具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。
如果当前结点为空,则将新的结点作为当前结点。
3. 实现删除操作删除操作是将指定的结点从树中移除的过程。
我们同样可以通过递归的方式实现删除操作。
具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。
如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。
- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。
- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。
4. 实现查找操作查找操作是在树中寻找指定值的过程。
同样可以通过递归的方式实现查找操作。
具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。
国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");
云南大学软件学院报告
课程:数据结构实验学期:2014-2015学年第一学期任课教师:专业:信息安全学号:姓名:成绩:实验5 图基础实验一、实验目的1.掌握图的存储结构及其遍历。
二、实验软硬件环境(CPU、OS、IDE):三、实验任务(要求写出核心代码,并对运行结果截图)1)使用邻接矩阵和邻接表储表示分别实现如下给定的图1、图2、图3所示图的物理存储结构。
2)在1)所建立的图形存储结构上分别实现深度优先搜索遍历和广度优先搜索遍历,并给出遍历结果(序列)。
图3 有向图实验代码:#include<stdio.h>#include<stdlib.h>#define MAXVEX 20#define OK 1#define ERROR 0#define OVERFLOW -1#define INFINITY 65535#define QueueSize 20 //队列中最大元素个数typedef int QElemType; //队列的元素的类型typedef int VertexType;typedef int EdgeType;typedef enum{False,True}Boolean; //Boolean是布尔类型,其值是ture或false Boolean visited[MAXVEX]; //访问标志的数组。
typedef struct{VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numVertexes,numEdges;} MGraph; //邻接矩阵。
typedef struct EdgeNode //边表结点。
{int adjvex;struct EdgeNode *next;}EdgeNode;typedef struct VertexNode //顶点表结点。
{int data;EdgeNode *firstedge;}VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjlist;int numVertexes,numEdges; //图中当前顶点数边数。
数据结构实训实验报告
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
云南大学软件学院数据结构实验报告五
云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □学期:2012秋季学期任课教师:实验题目: 树及其应用小组长:联系电话:完成提交时间:2012年12月10日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号: 20111120 姓名:本人承担角色:小组长综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号: 20111120 姓名:人承担角色:组员综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本实验要求设计一个哈夫曼编码译码器,要求通过统计一段电文中的各字符频率编写哈夫曼码并进行翻译。
首先要解决如何进行哈夫曼编码,然后设计对电文进行编码,最后还有有译码过程。
本程序使用二叉树进行哈夫曼编码,使用文本文档保存电文处理。
利用程序设计的相关知识:贯彻设计程序所必需的五大步骤,目标分析->设计算法->程序编写->后期调试->售后服务的流程完成这个项目。
利用算法设计相关知识:该算法具有有穷性、确定性、可行性、有0个或多个输入、有一个或多个输出、正确性、可读性、健壮性的特性。
离散数学相关知识:正确合理使用与或非之间的关系,进行程序分支判断,保证程序正常进行,以及二叉树的使用。
二、【实验设计(Design)】(20%)本次实验使用C进行编写,自定义函数7个:void SortHufmtree(hufmtree *tree){//将哈夫曼树n个叶子结点由大到小排序Codetype* HuffmanCode(hufmtree *tree){//哈弗曼编码的生成hufmtree* BuildHuffmanTree(hufmtree *tree){//构建叶子结点已初始化的哈夫曼树hufmtree* CreateHuffmanTreeFromSourceFile(){//通过解析源文件建立哈夫曼树hufmtree* Encoding(hufmtree *tree){//对源文件进行编码并保存hufmtree* Decoding(hufmtree *tree)//对存有编码的源文件进行译码并保存主函数为功能选择界面三、【实现描述(Implement)】(30%)主函数显示开始界面,选择相应的功能进行哈夫曼编码译码。
云南大学信息学院 数字电路与逻辑设计基础实验三
0
0
X
0
1
0
1
0
1
1
1
2、集成D触发器:使用芯片74LS74构建集成D触发器,测试D触发器的复位和置位功能
D
0
0
X
X
0
1
0
X
1
1
X
1
1
X
X
3、 JK触发器:使用芯片74LS76构建JK触发器,测试JK触发器的复位和置位功能
J
K
0
0
Q
0
0
0
1
0
1
1
1
4、二分频电路:集成D触发器构成对CP脉冲的二分频电路
5、利用RS触发器来纺防止抖动
实验小结:本章实验主要介绍了RS触发器、D触发器、JK触发器,以及如何使用RS触发器来防止抖动
《数字电路与逻辑设计基础实验》
实验报告
姓名:学号:20081专业:信息学院08级通信工程
实验三、RS触发器与集成触发器
实验目的:1、掌握触发器的逻辑功能及测试方法
2、学习触发器简单的典型应用
实验器材:直流稳压电源、数字逻辑电路实验箱、万用表、示波器,
74LS00、74LS74、74LS76
实验内容和步骤:
云南大学 软件学院 数据库实验3
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2011-2012学年第二学期任课教师:专业:学号:姓名:成绩:实验3使用SQL语句创建并管理数据库、数据表一、实验目的掌握查询分析器的使用方法。
掌握T-SQL语句的基本使用。
熟练掌握DDL语句。
熟练掌握DML(Insert, Delete, Update)语句。
二、实验内容1、用T-SQL语句创建并管理数据库“Employee数据库”,数据库要求见实验二。
记录创建数据库的SQL语句。
2、修改数据库:将“Employee数据库”的数据库最大容量更改为无限制(UNLIMITED),然后将“Employee数据库”的日志文件增长方式改为2MB。
记录SQL语句。
3、用T-SQL语句在“Employee数据库”创建数据表,数据表的结构见实验二。
记录创建表的SQL 语句。
4、修改表结构:将雇员信息表person中,Prof的字段长度改为15。
记录SQL语句。
5、向表中添加记录,使用Insert Into 语句分别向四张表中添加符合表结构属性的数据记录,要求每张表至少4条记录,并显示所添加的记录数据。
6、向雇员信息表person中添加记录完成如下操作:(1)、修改表中记录:将“王辉”的部门修改为“003”;(2)、删除记录:删除表中性别为“女”的员工记录;(3)、删除表:将“person”从“Employee数据库”中删除。
三、思考题如数据库表中存在如下记录:表person中的数据现执行:DELETE FROM department WHERE Depton=“001”,执行结果如何?为什么?。
云大软件工程实验三 软件设计
云大软件工程实验三软件设计在软件工程的学习中,实验是帮助我们深入理解理论知识、掌握实际操作技能的重要环节。
实验三的软件设计,更是让我们亲身体验了从需求分析到架构搭建的整个过程,这不仅考验了我们的专业知识,也锻炼了我们的逻辑思维和创新能力。
软件设计,简单来说,就是根据用户的需求,确定软件系统的整体结构、模块划分、数据结构、算法流程等。
它就像是为一座即将建造的大楼绘制蓝图,只有设计得合理、完善,后续的施工(编码)才能顺利进行,最终建成的大楼(软件系统)才能坚固、美观、实用。
在本次实验中,我们首先进行了需求分析。
需求分析是软件设计的基础,就如同盖房子前要明确房子的用途、居住人数、功能需求等。
我们通过与用户的沟通、对业务流程的了解,收集了大量的需求信息,并对其进行整理、分类和优先级排序。
这其中,要特别注意需求的明确性和完整性,避免模糊不清或者遗漏重要需求,否则后续的设计和开发工作将会陷入困境。
接下来是总体设计。
在这个阶段,我们要确定软件系统的整体架构,比如是采用 C/S 架构还是 B/S 架构,是分层架构还是微服务架构等。
同时,还要划分出各个模块,并明确它们之间的关系。
这就像是把大楼划分成不同的区域,如客厅、卧室、厨房等,并确定它们之间的通道和连接方式。
在进行总体设计时,要充分考虑系统的可扩展性、可维护性和性能等方面的要求。
然后是详细设计。
详细设计是对总体设计的进一步细化,包括每个模块的内部结构、算法流程、数据结构、接口定义等。
这就好比是为每个房间确定具体的布局、装修风格、家具摆放等。
详细设计的好坏直接影响到代码的编写质量和效率,因此需要我们非常仔细和认真地对待。
在软件设计过程中,有几个关键的原则需要遵循。
首先是高内聚低耦合原则。
高内聚意味着一个模块内部的各个元素之间联系紧密,共同完成一个明确的功能;低耦合则表示模块之间的依赖关系尽量少,这样当一个模块发生变化时,对其他模块的影响最小。
其次是开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
云南大学软件学院数据结构实验报告六
云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度:A□ B □ C ■序号学号姓名成绩12指导教师:(签名)学期:2012秋季学期任课教师:实验题目: 图及其应用小组长:联系电话:电子邮件:完成提交时间:2012年12月 20日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:小组长综合得分:(满分100分)指导教师:年月日学号:姓名:本人承担角色:组员综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本实验要求设计一个校园导游系统,要求通过图这一数据结构计算两点之间的最短距离,实现校园导航功能。
首先要收集校园景点信息和景点之间的距离信息,然后利用图存储校园景点信息和景点之间的距离信息,最后使用Dijkstra算法计算最短路径。
离散数学相关知识:正确合理使用与或非之间的关系,进行程序分支判断,保证程序正常进行,以及图的使用。
二、【实验设计(Design)】(20%)本次实验使用C进行编写,自定义函数2个:void init_graph(graph *g)//图的初始化函数void shortest_path(graph *g,int s, int t,int n)//求最短路径的算法主函数为功能选择界面三、【实现描述(Implement)】(30%)主函数显示开始界面,选择相应的功能求最短路径。
人性化设计:1.在输入出现错误时例如功能选择错误时,程序会给出友好的提示;2. 界面友好,容易上手。
四、【代码】(10%)#include<iostream>#include<stdio.h>#include<stdlib.h>#include<windows.h>#define INFINITY 9999 //最大距离#define MAX_NODES 30 //最大结点数int dist[MAX_NODES][MAX_NODES]; //dist[i][j]表示i、j连线的权重int path[MAX_NODES];using namespace std;typedef struct VertexType{char* sight; //景点名称//char* info; //景点描述}VertexType; //定义顶点的类型typedef struct{int vexnum;VertexType vex[MAX_NODES];}graph;void init_graph(graph *g){int a,x,y=0;g->vexnum = 27;g->vex[0].sight="云大西二门";g->vex[1].sight="百家道";g->vex[2].sight="文典广场";g->vex[3].sight="云大会堂";g->vex[4].sight="中山邦翰楼";g->vex[5].sight="仰止楼";g->vex[6].sight="桦苑";g->vex[7].sight="楠苑";g->vex[8].sight="格物楼";g->vex[9].sight="楠苑体育场";g->vex[10].sight="知味堂";g->vex[11].sight="楠苑超市";g->vex[12].sight="综合服务楼";g->vex[13].sight="楸苑";g->vex[14].sight="力行楼";g->vex[15].sight="软件楼";g->vex[16].sight="校医院";g->vex[17].sight="明远楼";g->vex[18].sight="至公大道";g->vex[19].sight="行政办公楼";g->vex[20].sight="云大北门";g->vex[21].sight="文汇楼";g->vex[22].sight="余味堂";g->vex[23].sight="梓苑超市";g->vex[24].sight="梓苑";g->vex[25].sight="钟楼";g->vex[26].sight="校车乘车点";for(x=0;x<g->vexnum;x++)for(y=0;y<g->vexnum;y++)dist[x][y]=INFINITY;//下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,所以要对图中对称的边同时赋值 dist[0][1]=dist[1][0]=10;dist[1][2]=dist[2][1]=20;dist[2][3]=dist[3][2]=20;dist[1][4]=dist[4][1]=50;dist[4][5]=dist[5][4]=200;dist[4][6]=dist[6][4]=130;dist[5][7]=dist[7][5]=600;dist[5][8]=dist[8][5]=800;dist[5][9]=dist[9][5]=600;dist[7][8]=dist[8][7]=100;dist[7][9]=dist[9][7]=600;dist[7][10]=dist[10][7]=150;dist[7][11]=dist[11][7]=110;dist[7][12]=dist[12][7]=100;dist[8][12]=dist[12][8]=80;dist[9][11]=dist[11][9]=700;dist[10][11]=dist[11][10]=5;dist[10][12]=dist[12][10]=50;dist[10][13]=dist[13][10]=150;dist[12][13]=dist[13][12]=100;dist[12][26]=dist[26][12]=20;dist[13][14]=dist[14][13]=200;dist[13][15]=dist[15][13]=250;dist[13][16]=dist[16][13]=700;dist[13][26]=dist[26][13]=100;dist[14][15]=dist[15][14]=20;dist[14][16]=dist[16][14]=500;dist[14][17]=dist[17][14]=1500;dist[16][17]=dist[17][16]=1300;dist[17][18]=dist[18][17]=50;dist[17][25]=dist[25][17]=300;dist[18][19]=dist[19][18]=30;dist[19][20]=dist[20][19]=100;dist[20][21]=dist[21][20]=950;dist[20][22]=dist[22][20]=900;dist[21][22]=dist[22][21]=150;dist[21][24]=dist[24][21]=110;dist[21][25]=dist[25][21]=750;dist[22][23]=dist[23][22]=40;dist[22][24]=dist[24][22]=120;dist[23][24]=dist[24][23]=60;dist[24][1]=dist[1][24]=300;}void shortest_path(graph *g,int s, int t,int n){struct state{int predecessor; //前驱节点int length; //到起始点的距离int label;}state[MAX_NODES];int i,k,min,mypath[MAX_NODES];struct state * p;for(p=&state[0]; p<&state[n]; p++){p->predecessor = -1;p->length = INFINITY;p->label = 0;}state[t].length = 0;state[t].label = 1;k = t; //当前工作结点do{for(i=0; i<n; i++){if(dist[k][i]!=0 && state[i].label==0){if(state[k].length+dist[k][i]<state[i].length){state[i].length = state[k].length+dist[k][i]; state[i].predecessor = k;}}}k=0;min=INFINITY;for(i=0; i<n; i++){if(state[i].label==0 && state[i].length<min){k=i;min=state[i].length;}}state[k].label = 1;}while(k!=s);i=0;k=s;do{path[i] = k;k = state[k].predecessor;mypath[i]=path[i];i++;}while(k>=0);for(i--;i>0;i--){printf("%s->",g->vex[mypath[i]].sight);}printf("%s\n",g->vex[mypath[i]].sight);printf("\n距离为%d m\n",min);}int main(){int m,s,e,c;graph g;g.vexnum = 27;init_graph(&g);printf("\n===========================================================\n");printf("\n 呈贡云南大学校园导游 \n");printf("\n\n");//打印景点列表for(m=0;m<g.vexnum;m++){printf("\t%2d:%s\t\t",m,g.vex[m].sight);if(++m<27&&m!=7)printf("\t%2d:%s\t\n",m,g.vex[m].sight);else if(m==7)printf("\t %d:%s\t\n",m,g.vex[m].sight);elseprintf("\n");}printf("\n===========================================================\n");printf("\n\t■■■■■■■■■■■■■■■■■\n");printf("\t■ ■\n");printf("\t■ 1、查询景点路径■\n");printf("\t■ ■\n");printf("\t■ 0、退出■\n");printf("\t■ ■\n");printf("\t■■■■■■■■■■■■■■■■■\n");while(1){printf("\n===========================================================\n");printf("\n请输入您的选择:");scanf("%d",&c);while(!(c==0||c==1)){printf("\n输入非法,请重新选择:\n");scanf("%d",&c);}switch(c){case 0:exit(0);case 1:printf("\n输入出发点与结束点:");scanf("%d %d",&s,&e);while(s<0||s>26||e<0||e>26||s==e){printf("\n输入非法,请重新选择:");scanf("%d %d",&s,&e);}printf("\n从“ %s ”到“ %s ”的最短路径为\n\n",g.vex[s].sight,g.vex[e].sight); shortest_path(&g,e,s,g.vexnum);break;}//switch}//whilereturn 0;}。
云南大学JAVA程序设计实验三
实验报告序号:实验老师:陆歌皓课程名称:JA V A程序设计实验实验名称:JA V A开发环境学号:20111120279 姓名:李张昱实验三Fundamental programming structures in java:Control Flow, Big Numbers, Arrays and Vectors一.实验目的练习java基本编程结构,包括字符串、输入输出控制流。
二.实验内容(算法、程序、步骤和方法)任务一. Write a Java program called AverageNumbers2.java that calculates the average of numbers 1 to 50 using the for loop. Do it again using the while loop.Output:average of numbers is 25.5根据实验要求写了以下程序:public class AverageNumbers2{public static void main(String[] args){float sum=0;for(int i=1;i<=50;i++)sum+=i;float average=sum/50;System.out.println("average of numbers 1 to 50 is "+average);}}任务二.Write a Java program called InputParms.java that accepts 3 arguments in the main method using an array. Iterate through the array looking for your name using a for loop. Display the message "The name <your name> was found" if your name is found.For example, using the following commandJava InputParms I am MichaelOutput:The name Michael was found.根据实验要求写了以下程序:import java.util.Scanner;public class InputParms {public static void main(String[] args){Scanner in = new Scanner(System.in);System.out.println("you can input 3 number of name at will");int a=3;String[] name=new String[a];for(int i=0;i<a;i++){System.out.println("please input number of "+(i+1)+" name:");name[i]=in.next();}System.out.println("please input your name:");String myname=in.next();for(int k=0;k<a;k++)if(name[k].equals(myname)){System.out.println("The name "+name[k]+" was found");}}}任务三.Write a Java program called BreakLoop.java that uses a for loop with the variable "count" and count 1 to 10.. Display "count=<count>" each time you loop through. Break out of the loop at 5. At the end of the program display "Broke out of the loop at count = 5".Output:count = 1count = 2count = 3count = 4Broke out of the loop at count = 5根据实验要求写了以下程序:public class BreakLoop {public static void main(String[] args){int i=1;for(i=1;i<=10;i++){if(i==5)break;System.out.println("count="+i);}System.out.println("Broke out of the loop at count = "+i);}}任务四.Write a Java program called ContinueLoop.java that uses a for loop with the variable "count" and count 1 to 10.. Display "count=<count>" each time you loop through. Skip the display statement using the continue statement if count = 5. At the end of the program display "Used continue to skip printing 5".Output:count = 1count = 2count = 3count = 4count = 6count = 7count = 8count = 9count = 10Used continue statement to skip printing 5根据实验要求写了以下程序:public class ContinueLoop {public static void main(String[] args){for(int i=1;i<=10;i++){if(i==5)continue;System.out.println("count="+i);}System.out.println("Used continue to skip printing 5");}}三.数据记录和计算任务一运行结果:任务二运行结果:任务三运行结果:任务四运行结果:四.结论break 跳出语句块,执行下面的语句。
计算机网络原理实验三 云南大学
实验三、套接字编程序号:姓名:学号:成绩1.实验目的:两人一组,编写一个客户端、服务器程序,掌握Socket编程原理。
2.实验环境:连入局域网络的主机一台。
3.实验指导:Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。
理解socket编程模型及其原理。
4.实验分析,回答下列问题。
客户端IP:172.25.20.4服务器IP:172.25.20.194客户端源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <conio.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib,"ws2_32.lib")#define PORT 3490 /* 客户机连接远程主机的端口*/#define MAXDATASIZE 100 /* 每次可以接收的最大字节*/int _tmain(int argc, _TCHAR* argv[]){WORD wVersionRequested;WSADATA wsaData;int err = 0 ,rval = 0 ;SOCKET fd;struct sockaddr_in servaddr;struct hostent* hp;char buf[1024] = "";wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("Can not create socket!");exit(2);}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);hp = gethostbyname("172.25.20.194");//根据服务器的网络计算//机名称得到其IP地址等信息memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr,hp->h_length); memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));//和服务器创建连接rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));if (rval < 0){//创建连接失败printf("Can not create connect!");exit(3);}else{ memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);//向服务器发送信息rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");}closesocket(fd);exit(5);}服务器源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include<conio.h>#include<windows.h>#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")#define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/#define SERVER_IP_ADDR "172.25.20.194" /*服务器的IP地址*/int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";int rval= 0, len= 0, err = 0;WORD wVersionRequested;WSADATA wsaData;/*指定socket版本,否则创建socket失败,即使创建socket返回值不为-1,但是bind 时会失败*/wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;/* 建立套接字*/sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){perror("opening stream socket");exit(1);}/* 使用任意端口命名套接字*/server.sin_family = AF_INET;server.sin_port = htons(MYPORT);server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR);memset(server.sin_zero, 0, sizeof(server.sin_zero));//将服务器地址与socket绑定在一起rval = bind(sock, (struct sockaddr *)&server, sizeof(server));if (rval < 0){perror("binding stream socket");exit(1);}// 找出指定的端口号并打印出来length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) < 0){perror("getting socket name");exit(1);}printf("socket port #%d\n", ntohs(server.sin_port));// 开始接收连接,最大请求数为listen(sock, 5);len = sizeof(struct sockaddr);do{ msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);if (msgsock == -1)perror("accept");else{ memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("-->%s\n", buf);}closesocket(msgsock);} while (TRUE);/* 因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。
云南大学软件学院数据结构实验
———————————————————————————————— 作者:
———————————————————————————————— 日期:
实验难度:A□B □ C □
序号
学号
姓名
成绩
指导教师
(签名)
学 期:2017秋季学期
任课教师:ﻩ刘宇
实验题目:
组员及组长:
承担工作:
ﻩﻩﻩz.real=(z1.real*z2.real-z1.imag*z2.imag)/(z1.real*z1.real-z1.imag*z1.imag);
ﻩz.imag = (z1.imag*z2.real-z1.real*z2.imag)/(z1.real*z1.real-z1.imag*z1.imag);
用到的数学知识:复数四则运算,与或非运算,进行分支判断;
程序设计知识:目标分析->设计算法->程序编写->后期调试。
二、【实验设计(Design)】(20%)
(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)
ﻩ{
ﻩﻩif(fushu[k]=='+'||fushu[k] =='-')//判断是否为完整复数
ﻩﻩflag1++;
ﻩﻩﻩelseif(fushu[k]=='i')/*判断是否为纯实数*/
ﻩﻩflag2++;
}
ﻩif(flag2 > 1)
{
ﻩﻩprintf("ERROR!");
ﻩﻩsystem("pause");
云南大学数据结构实验3
实验难度: A □ B C □学期:2017秋季学期任课教师: 储星实验题目: 栈和队列及其应用组员及组长:承担工作:联系电话:电子邮件:完成提交时间: 2018 年 11 月 18 日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)魔王语言的解释规则:B →tAdA;A→ sae;(ehnxgz) → ezegexenehe 则魔王语言B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
在 A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):字母-汉字对应表:"t d s a e z g x n h""天地上一个鹅追赶下蛋恨"运用了离散数学的一些基本知识及程序设计知识。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)为实现上述程序功能,应以栈和队列来表示。
1.设定栈的抽象数据类型定义为:typedef struct stack{char *base; // 顺序栈的栈底指针char *top; // 顺序栈的栈顶int stacksize; // 栈元素空间的大小}stack; // 结构体类型顺序栈基本操作:ListInitiate (&S) 构造一个空栈S。
StackEmpty(S)栈S已经存在。
若栈S为空栈,则返回TRUE,否则返回FALSE。
国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
/*判队空*/
int QueueEmpty(SeqQueue *sq)
{
if(sq->rear==sq->front)
return 1;
else
return 0;
}
/*循环队列入队*/
void InQueue(SeqQueue *sq,ElemType x)
{
if ((sq->rear+1)%MaxSize==sq->front) /*队满*/
InitStack(s);
printf("(2)栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("(3)输入要进栈的数据个数:");
scanf("%d",&n);
printf("依次输入进栈的%d个整数:",n);
/*数据依次进栈*/
for(i=0; i<n; i++)
{
printf("循环队列已空,不能进行出队操作!\n");
exit(1);
}
else{
x=sq->data[sq->front];
sq->front=(sq->front+1)%MaxSize;
return x;
}
}
/*取队头元素*/
ElemType GetQueue(SeqQueue *sq)
{
void InitQueue(SeqQueue *sq); /*初始化队列*/
int QueueEmpty(SeqQueue *sq); /*判队空*/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验难度: A □ B C □学期:2017秋季学期任课教师: 储星实验题目: 栈和队列及其应用组员及组长:承担工作:联系电话:电子邮件:完成提交时间: 2018 年 11 月 18 日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)魔王语言的解释规则:B →tAdA;A→ sae;(ehnxgz) → ezegexenehe 则魔王语言B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
在 A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):字母-汉字对应表:"t d s a e z g x n h""天地上一个鹅追赶下蛋恨"运用了离散数学的一些基本知识及程序设计知识。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)为实现上述程序功能,应以栈和队列来表示。
1.设定栈的抽象数据类型定义为:typedef struct stack{char *base; // 顺序栈的栈底指针char *top; // 顺序栈的栈顶int stacksize; // 栈元素空间的大小}stack; // 结构体类型顺序栈基本操作:ListInitiate (&S) 构造一个空栈S。
StackEmpty(S)栈S已经存在。
若栈S为空栈,则返回TRUE,否则返回FALSE。
Push(&S,e)栈S已经存在。
在栈S的栈顶插入新的栈顶元素e。
Pop(&S,&e)栈S已经存在。
删除S的栈顶元素,并以e返回其值。
2. 设定队列的抽象数据类型定义为:typedef struct QNode{char data;struct QNode *next;}*LinkQueueNode;typedef struct{LinkQueueNode front;LinkQueueNode rear;}LinkQueue;/*结构体队列类型*/基本操作:ListInitiate (&Q) 构造一个空队列Q。
StackEmpty(Q)队列Q已经存在。
若队列Q为空,则返回TRUE,否则返回FALSE。
EnQueue(&Q,e)队列Q已经存在。
插入元素e为Q的新的队尾元素。
DeQueue(&Q,&e)队列Q已经存在。
删除Q的队头元素,并以e返回其值。
2.程序包含四个模块:1)主程序模块:Void main(){初始化;For(){接受处理命令;}接受处理;}2)栈模块——实现栈的抽象数据类型;3)队列模块——实现队列的抽象数据类型。
4)魔王语言解释模块——定义线性表的结点结构。
各模块的之间的调用关系如下:主程序模块魔王语言解释模块栈模块队列模块三、【实现(Implement)】(30%)(本部分应包括:抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。
如有界面则需包括界面的关键实现方法等。
)栈的基本操作:int Initstack(stack &s)// 初始化空栈{s.base = (char*)malloc(100 * sizeof(char));if (!s.base)exit(0);s.top = s.base;s.stacksize = 100;return 1;}int StackEmpty(stack s)// 判断栈是否为空{if (s.top == s.base)return 1;return 0;}void push(stack &s, char e)// 入栈{if (s.top - s.base >= s.stacksize){s.base = (char*)realloc(s.base, (s.stacksize + 10) * sizeof(char));if (!s.base)exit(0);s.top = s.base + s.stacksize;s.stacksize += 10;}*s.top++ = e;}int pop(stack &s, char &e)// 出栈{if (s.top == s.base)exit(0);e = *--s.top;return 1;}队列的基本操作:int InitQueue(LinkQueue &Q)// 初始化空队列{Q.front = Q.rear = (LinkQueueNode)malloc(sizeof(LinkQueueNode));if (!Q.front)exit(-1);Q.front->next = NULL;return 1;}int QueueEmpty(LinkQueue Q)// 判断队列是否为空{if (Q.front == Q.rear)return 1;return 0;}int EnQueue(LinkQueue &q, char e)// 入队列{LinkQueueNode p;p = (LinkQueueNode)malloc(sizeof(QNode));if (!p)exit(-1);p->data = e;p->next = NULL;q.rear->next = p;q.rear = p;return 1;}char DeQueue(LinkQueue &q, char &e)// 删除队列队头元素并返回其值{LinkQueueNode p;if (q.front == q.rear)return 0;p = q.front->next;e = p->data;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free(p);return e;}魔王语言解释的具体实现:void checke(char e)// 翻译列表根据弹栈字母转化为汉字并打印void transmite(stack s)// 翻译模块{LinkQueue q;InitQueue(q);char c, e;printf("魔王是说:");while (!StackEmpty(s))// 若栈不为空则开始翻译{pop(s, e);checke(e);if (e == '(')// 括号处理{while (pop(s, e) && e != ')')// 括号匹配EnQueue(q, e);push(s, e);DeQueue(q, c);while (!QueueEmpty(q)){DeQueue(q, e);push(s, c);push(s, e);}push(s, c);while (!StackEmpty(s)){pop(s, e);if (e == ')')break;else checke(e);}}}printf("\n");}四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)五、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)问题关键:1. 栈的初始化,入栈出栈操作,栈为空的判断条件,队列的初始化,入队和出队操作,队列为空的判断。
以及队列中最后一个元素被删除后尾指针的修改。
2. 一些细节处理,比如数组操作等。
3.将魔王语言作为一个字符串读入进来,首先检查括号是否匹配,如果不匹配就无法解释。
如果匹配,然后将字符串从尾到头依次压入栈 S中,将栈 S中的内容依次弹出压入栈 S2中,直至遇到右括号,将其压入栈 S1中,并将栈 S2弹出依次压入栈 S1中,直至遇到左括号压入栈 S1中,这样栈 S1中存放的内容就是匹配的第一个内重括号,将栈 S1 栈顶元素左括号弹出,将左括号下面的那个元素保存在 e1 变量中,然后将其他元素弹出依次压入栈 S3中,在将 e1与栈 S3中依次弹出的元素压入栈S2 中,重复这个过程,直至将魔王语言中所有的括号都处理完为止,所以这个思路可以处理多重括号嵌套的问题。
六、思考题或【项目运作描述(Operate)】(10%)(注:选择C难度的才需要填写“项目运作描述”,其他难度的只需完成思考题)(项目运作描述应包括:项目的成本效益分析,应用效果等的分析。
)1. 栈:特点就是一个先进后出的结构。
主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。
在 CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。
在编程语言中:主要用来进行函数的调用和返回。
可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。
队列:特点就是一个先进先出的结构。
只要满足数据的先进先出原理就可以使用队列。
2. 可以采用顺序存储结构和链式存储结构,因为他们都是线性表,就像一排站在一条线上的人,位置关系是一个挨一个的,这样的顺序不会改变,而改变点都在头或者尾,仍然保持形态不变的。
七、【代码】(10%)(本部分应包括:完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体: Georgia , 行距: 固定行距12,字号: 小五)#include<iostream>#include<stdlib.h>using namespace std;typedef struct stack{char *base; // 顺序栈的栈底指针char *top; // 顺序栈的栈顶int stacksize; // 栈元素空间的大小}stack; // 结构体类型顺序栈typedef struct QNode{char data;struct QNode *next;}*LinkQueueNode;typedef struct{LinkQueueNode front;LinkQueueNode rear;}LinkQueue;/*结构体队列类型*/int Initstack(stack &s)// 初始化空栈{s.base = (char*)malloc(100 * sizeof(char));if (!s.base)exit(0);s.top = s.base;s.stacksize = 100;return 1;}int StackEmpty(stack s)// 判断栈是否为空{if (s.top == s.base)return 1;return 0;}void push(stack &s, char e)// 入栈{if (s.top - s.base >= s.stacksize){s.base = (char*)realloc(s.base, (s.stacksize + 10) * sizeof(char));if (!s.base)exit(0);s.top = s.base + s.stacksize;s.stacksize += 10;}*s.top++ = e;}int pop(stack &s, char &e)// 出栈{if (s.top == s.base)exit(0);e = *--s.top;return 1;}int InitQueue(LinkQueue &Q)// 初始化空队列{Q.front = Q.rear = (LinkQueueNode)malloc(sizeof(LinkQueueNode));if (!Q.front)exit(-1);Q.front->next = NULL;return 1;}int QueueEmpty(LinkQueue Q)// 判断队列是否为空{if (Q.front == Q.rear)return 1;return 0;}int EnQueue(LinkQueue &q, char e)// 入队列{LinkQueueNode p;p = (LinkQueueNode)malloc(sizeof(QNode));if (!p)exit(-1);p->data = e;p->next = NULL;q.rear->next = p;q.rear = p;return 1;}char DeQueue(LinkQueue &q, char &e)// 删除队列队头元素并返回其值{LinkQueueNode p;if (q.front == q.rear)return 0;p = q.front->next;e = p->data;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free(p);return e;}void checke(char e)// 翻译列表{if (e == 'B')printf("天上一只鹅地上一只鹅");else if (e == 'A')printf("上一只鹅");else if (e == 't')printf("天");else if (e == 'd')printf("地");else if (e == 's')printf("上");else if (e == 'a')printf("一只");else if (e == 'e')printf("鹅");else if (e == 'z')printf("追");else if (e == 'g')printf("赶");else if (e == 'x')printf("下");else if (e == 'n')printf("蛋");else if (e == 'h')printf("恨");else if (e != '(' && e != ')')printf("%c", e);}void transmite(stack s)// 翻译模块{LinkQueue q;InitQueue(q);char c, e;printf("魔王是说:");while (!StackEmpty(s))// 若栈不为空则开始翻译{pop(s, e);checke(e);if (e == '(')// 括号处理{while (pop(s, e) && e != ')')// 括号匹配EnQueue(q, e);push(s, e);DeQueue(q, c);while (!QueueEmpty(q)){DeQueue(q, e);push(s, c);push(s, e);}push(s, c);while (!StackEmpty(s)){pop(s, e);if (e == ')')break;else checke(e);}}}printf("\n");}void main(){stack s;Initstack(s);char a[100];cout <<"规则:"<< endl;cout <<"α->β1β2...βn"<< endl;cout <<"(θδ1δ2...δn)->θδnθδn-1...θδ1θ"<< endl;cout <<""<< endl;cout <<"字母-汉字对应表:"<< endl;cout <<"t d s a e z g x n h"<< endl;cout <<"天地上一个鹅追赶下蛋恨"<< endl;cout <<""<< endl;cout <<"魔王说:";int i = 0;cin >> a;while (a[i])i++;for (int k = i; k >= 0; k--)push(s, a[k]);transmite(s);system("pause");}。