云南大学软件学院数据结构实验
云大软件工程实验三 软件设计

云大软件工程实验三软件设计云大软件工程实验三软件设计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.涉密信息:指涉及国家安全、经济安全、社会公共利益和个人隐私安全等方面的机密信息。
云南大学软件学院数据结构实验1

实验难度: A □ B □ C □学期:2017秋季学期任课教师: 刘宇实验题目:组员及组长:承担工作:联系电话:电子邮件:完成提交时间:2017年10月24日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)实验要求制作一个复数计算器,要求能进行实数和虚数的混合运算,首先要解决的问题是复数的四则运算,确保运算正确无误。
然后要解决的就是分离复数这个问题。
分离复数最简单的方法就是输入复数的时候分别输入实部虚部,然后打印。
但这过于简单,于是采取输入一个字符串来接入这个复数,然后用数组的方法进行实部虚部的分离。
用到的数学知识:复数四则运算,与或非运算,进行分支判断;程序设计知识:目标分析->设计算法->程序编写->后期调试。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)抽象数据类型的定义:typedef struct Complex //构造复数结构Complex{float real; //定义实部为realfloat imag; //定义虚部为imag}Complex;基本操作:功能一可以字符串形式输入一个复数,用数组的方法从字符串中分离出实部和虚部;功能二可以对输入的两个复数进行简单的加减乘除的四则运算。
模块:加法函数:Complex Add(Complex z1, Complex z2)减法函数:Complex Sub(Complex z1, Complex z2)乘法函数:Complex Mul(Complex z1, Complex z2)除法函数:Complex Div(Complex z1, Complex z2)打印函数:void print_Complex(Complex z)分离实部函数:float Getreal(Complex z)分离虚部函数:float Getimag(Complex z)分离函数:void spread_Complex()算法伪码描述(分离函数):输入一个复数字符串;实部标志为flag1,虚部标志为flag2,得到flag1和flag2的取值,判断该复数是否是完整的复数,或是纯实数、纯虚数;用符号来判断一个完整的复数的实部虚部,如果判断出字符串中接收到了‘+’或者‘-’,则符号前面的算实部,将符号舍去,后面的即为虚部,直到遇上‘i’。
云南大学软件学院数据结构实验二实验报告——多项式计算器

云南大学软件学院数据结构实验报告2010秋季学期(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)学号:姓名:专业:指导老师:实验难度A□B□ C □承担任务(难度为C时填写)指导教师评分(签名)【实验题目】实验2. 线性表及其应用【问题描述】用C或C++语言设计并实现一个一元稀疏多项式的简单计算器。
【基本要求】一元稀疏多项式简单计算器的基本功能是:1、输入并建立多项式2、输出多项式,序列按指数降序排列3、多项式A(x)和B(x)相加,并建立多项式A(x)+B(x)4、多项式A(x)和B(x)相减,并建立多项式A(x)-B(x)5、给定 x 的值,计算多项式6、多项式A(x)和B(x)相乘,建立多项式A(x)*B(x) (* 选做,作为难度B的操作)【CDIO项目要求】1、有完整的CDIO四个阶段描述2、有友好美观的操作界面3、有软件使用说明或帮助文档4、项目成员分工明确,团结协作【实现提示】一、【实验构思(Conceive)】(10%)本实验通过C语言实现了多项式加法、减法、乘法、多项式求导、多项式积分的功能。
利用了冒泡排序的算法作为排序的核心算法。
运用了高等数学中多项式的求导积分的知识。
二、【实验设计(Design)】(15%)本程序定义了抽象数据结构listnode,用于存储多项式的系数和指数并存储指向下一个listnode的指针来构成链表。
本程序包含如下*个函数:Main函数:调用input函数—>调用bubble_sort函数—>调用operplus函数—>调用oper_minus函数—>调用oper_mul函数—>调用oper_dy函数—>调用oper_jifen 函数。
Oper_plus函数:将两个链表的相应项系数相加,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
Oper_minus函数:将两个链表的相应项系数相减,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
云南大学-软件学院--汇编实验5

实验五 80x86分支,循环,子程序,宏程序设计姓名:学号:序号:班级:分数:1.编写设计一个2,10,16进制的码制转换程序,要求:①程序有友好的运行界面;②输入任意类型进制的数据,转换为其余两种进制类型;③要求程序有方便的输入输出功能;④要求程序能够处理基本的错误信息;⑤程序的基本结构采用子程序结构;源程序:.8086.model small.datastr db 0ah,0dh,'please input 1 to 8 to choise the function',0ah,0dhdb '1.btd',0ah,0dhdb '2.bth',0ah,0dhdb '3.dth',0ah,0dhdb '4.dtb',0ah,0dhdb '5.htb',0ah,0dhdb '6.htd',0ah,0dhdb '7.again',0ah,0dhdb '8.end',0ah,0dh,'$'b db 'Please input a Binary number',0ah,0dh,'$'d db 'Please input a decimal number',0ah,0dh,'$'h db 'Please input a Hexadecimal number',0ah,0dh,'$'agai db 'Please input again',0ah,0dh,'$'wr db 'A wrong number!',0ah,0dh,'$'num db 6,?,6 dup (?)num1 db 16,?,16 dup (?).codestart:mov ax,@datamov ds,axchoice:lea dx,strmov ah,9int 21hmov ah,1int 21hjmp C1mov ah,2int 21hmov dl,0dhmov ah,2int 21hjmp choiceMo: mov dx,offset agai mov ah,9int 21hjmp choiceC1: cmp al,'1'jnz C2call btdjmp againC2: cmp al,'2'jnz C3call bthjmp againC3: cmp al,'3'jnz C4call dthjmp againC4: cmp al,'4'jnz C5call dtbjmp againC5: cmp al,'5'jnz C6call htbjmp againC6: cmp al,'6'jnz C7call htdjmp againC7: cmp al,'7'jnz C8jmp Mojnz wrongen: mov ah,4chint 21hwrong:lea dx,wrmov ah,9int 21hjmp Mobtd procmov dx,offset bmov ah,9int 21hmov dx,offset num1mov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov di,offset num1mov ch,[di+1]zq2: mov dl,[di+2]cmp dl,39hjg zqsub dl,30hjmp zq1zq: sub dl,37hzq1: mov dh,0or bx,dxcmp ch,1jz zq3rol bx,1zq3: inc didec chjnz zq2jj1: cmp bx,10000 jc jjsub bx,10000inc sijmp jj1jj: mov dx,siand dx,0fhadd dl,30hmov ah,2int 21hxor si,siL1: cmp bx,1000jc L2sub bx,1000inc sijmp L1L2: mov dx,siand dx,0fhadd dl,30hmov ah,2int 21hxor si,siL3: cmp bx,100jc L4sub bx,100inc sijmp L3L4: mov dx,siand dx,0fhadd dl,30hmov ah,2int 21hxor si,siL5: cmp bx,10jc L6sub bx,10inc sijmp L5L6: mov dx,simov ah,2int 21hxor dx,dxmov dx,bxand dx,0fhadd dl,30hmov ah,2int 21hretbtd endpbth procmov dx,offset bmov ah,9int 21hmov dx,offset num1mov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov di,offset num1mov ch,[di+1]K1: mov al,[di+2]sub al,30hor bl,alrol bx,1inc didec chjnz K1ror bx,1mov ch,4mov cl,4K4: rol bx,clmov dl,bland dl,0fhadd dl,30hjmp K3K2: add dl,37hK3: mov ah,2int 21hdec chjnz K4retbth endpdth proclea dx,dmov ah,9int 21hmov dx,offset nummov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov di,offset nummov cl,[di+1]add di,2mov dl,[di]sub dl,30hmov al,10mul dlmov ch,0dec cxI: inc dimov dl,[di]sub dl,30hmov dh,0add ax,dxcmp cx,1jz I1mov bx,axI1: loop Imov bx,axmov si,offset nummov ch,[si+1]inc chinc chmov cl,4O: rol bx,clmov dl,bland dl,0fhcmp dl,9jg MMadd dl,30hjmp PPMM: add dl,37h PP: mov ah,2int 21hdec chjnz Oretdth endpdtb proclea dx,dmov ah,9int 21hmov dx,offset nummov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov di,offset nummov cl,[di+1]add di,2mov al,10mul dlmov ch,0dec cxc: inc dimov dl,[di]sub dl,30hmov dh,0add ax,dxcmp cx,1jz ccmov bx,10mul bxmov bx,axcc: dec cxjnz cmov bx,axmov cx,16x: rol bx,1mov dl,bland dl,01hadd dl,30hmov ah,2int 21hloop xretdtb endphtb procmov dx,offset hmov ah,9int 21hmov dx,offset nummov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov ch,[di+1]Z1: mov bl,[di+2]cmp bl,39hjg ZZsub bl,30hjmp ZXZZ: sub bl,37hZX: mov cl,4mov bh,4shl bl,clZ: rol bl,1mov dl,bland dl,01hadd dl,30hY: mov ah,2int 21hdec bhjnz Zinc didec chjnz Z1rethtb endphtd procmov dx,offset hmov ah,9int 21hmov dx,offset nummov ah,0ahint 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov di,offset nummov ch,[di+1]u2: mov dl,[di+2]sub dl,30hjmp u1u: sub dl,37h u1: mov dh,0or bx,dxcmp ch,1jz Rmov cl,4rol bx,cl R: inc didec chjnz u2xor si,sis1: cmp bx,1000jc s2sub bx,1000inc sijmp s1s2: mov dx,siand dx,0fhadd dl,30hmov ah,2int 21hxor si,sis3: cmp bx,100jc s4sub bx,100inc sijmp L3xor si,sis4: cmp bx,10jc s5sub bx,10inc sijmp s3s5: mov dx,siand dx,0fhadd dl,30hmov ah,2int 21hmov dx,bxand dx,0fhadd dl,30hmov ah,2int 21hrethtd endpend start实验结果:。
云南大学软件学院报告

课程:数据结构实验学期: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; //图中当前顶点数边数。
最新云南大学 软件学院数据库试验5

云南大学软件学院实验报告课程:数据库概论任课教师:包崇明姓名:学号:专业:成绩:实验5 数据查询-基于CAP数据库完成教科书第三章如下习题(SQL语句及结果截屏):[3.2]b: select aid from AGENTS where [percent] >=all(select MAX([percent]) from AGENTS)截图:[3.5]:select aid,cid from AGENTS A,CUSTOMERS C where aid not in (select aid from ORDERS X where X.cid=C.cid and X.aid=a.aid) order by aid,cid截图:[3.8]a:注意:中文版教材翻译有误,应该是求每个顾客在他购买的所有产品中的最大花费值,参考英文原版select cid,pid,MAX(dollars)as MAXSPENTfrom ORDERSgroup by cid,pid,dollars截图:[3.8]b:select AVG (MAXSPENT) as AVERAGEfrom (select cid,pid,MAX(dollars) as MAXSPENTfrom ORDERSgroup by cid,pid,dollars)as x group by cid截图:[3.11]b:需要先求出按cid,pid分组的qty均值,并完整数据截图;其次,本题中最小qty均值修改为900select cid,pid,AVG(qty) as AVGQTYfrom ORDERSgroup by cid,pid,qty截图:select cid from(select cid,pid,AVG(qty) as AVGQTYfrom ORDERS group by cid,pid,qty)as x where AVGQTY > 900截图:[3.11]d: select aid from ORDERSwhere cid IN(select cidfrom CUSTOMERSwhere city = 'Duluth' or city = 'Kyoto')截图:[3.11]f: select pid from ORDERSwhere cid IN(select cidfrom CUSTOMERSwhere city = 'Dallas')截图:[3.11]h: delete from AGENTS where aname = 'Gray' 截图:INSERT INTO AGENTS(aid,aname,city,[percent]) values('a04','Gray','New york',6)截图:[3.11]j: update PRODUCTSset price = 1.1*pricewhere city = 'Duluth' or city = 'Dallas'截图:[3.11]k:select cid,sum(dollars) as totalDollars from ORDERS where aid = 'a04'group by cid截图:[3.11]l: select aid,[percent] from AGENTS a where not exists(select cid from CUSTOMERS cwhere city = 'Duluth' and not exists(select o.cid from ORDERS owhere o.cid = c.cid and a.aid = o.aid))order by [percent]截图:。
云南大学--软件学院--数据库实验4

云南大学软件学院实验报告课程:数据库原理与实用技术实验学期: 2012-2013学年第二学期任课教师:专业:学号:姓名:成绩:实验4 数据查询一、实验目的理解T-SQL语言的使用;熟练掌握数据查询语句;掌握合计函数的使用。
二、实验内容1、CAP数据库的查询(记录每个查询的SQL语句和查询结果)(1)建立CAP数据库,输入C、A、P、O四张表;图表 1 创建cap数据库图表 2创建四个表图表 3向表中插入数据图表 4表的内容(2)完成课后习题[3.2]b、[3.5]、[3.8]a,b、[3.11]b,f,j,l[3.2] (b)Retrieve aid values of agents who receive the maximum percent commission.图表 5最高佣金百分率[3.5] Consider the problem to find all (cid, aid) pairs where the customer does not place an order through the agent. This can be accomplished with the Select statementselect cid, aidfrom customers c. agents awhere not exists(select * from orders x where x.cid = c.cid and x.aid =a.aid) ;Is it possible to achieve this result using the NOT IN predicate in place of the NOT EXISTS predicate with a single Subquery? With more than one Subquery? Explain your answer and demonstrate any equivalent form by execution.图表 6 3.5 not in[3.8](a) Write a Select statement with no WHERE clause to retrieve all customer cids and the maximum money each spends on any product. Label the columns of the resulting table: eid, MAXSPENT.图表 7 3.8(b) Write a query to retrieve the AVERAGE value (over all customers) of the MAXSPENT of query (a)图表 8 3.8(b)[3.11] (b) We say that a customer x orders a product y in an average quantity A if A is avg(qty) for all orders rows with cid = x and pid = y. Is it possible in a single SQL statement to retrieve cid values of customers who order all the products that they receive in average quantities (by product) of at least 300?图表 9 3.11 (b)(f) Get pid values of products that are ordered by all customers in Dallas.图表 10 3.11 (f)(j) Use a single Update statement to raise the prices of all products warehoused in Duluth or Dallas by 10%. Then restore the original values byrerunning the procedure that you originally used to create and load the products table.图表 11 3.11 (j)(l) Write an SQL query to get aid and percent values of agents who take orders from all customers who live in Duluth. The aid values should be reported in order by decreasing percent. (Note that if percent is not retrieved in the select list, we cannot order by these values.)图表 12 3.11 (i)2、Employee数据库的查询(记录每个查询的SQL语句和查询结果)(1)向表中插入数据。
云南大学软件学院综合技能实践-数据库实验指导书

云南大学软件学院综合技能实践——《常用数据库系统的安装和调试》实验指导书第一部分MySQL数据库的安装和使用一、实验目的:1.掌握MySQL数据库环境搭建的具体步骤和操作方法。
2.掌握启动和运行MySQL的方法。
3.掌握使用SQL语句创建数据库、表及向表中插入记录的方法。
二、实验内容预习一、MySQL概述MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。
MySQL AB是由多名MySQL开发人创办的一家商业公司。
它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。
数据库是数据的结构化集合。
它可以是任何东西,从简单的购物清单到画展,或企业网络中的海量信息。
要想将数据添加到数据库,或访问、处理计算机数据库中保存的数据,需要使用数据库管理系统,如MySQL服务器。
计算机是处理大量数据的理想工具,因此,数据库管理系统在计算方面扮演着关键的中心角色,或是作为独立的实用工具,或是作为其他应用程序的组成部分。
关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内。
这样就增加了速度并提高了灵活性。
MySQL的SQL指得是“结构化查询语言”。
SQL是用于访问数据库的最常用标准化语言,它是由ANSI/ISO SQL标准定义的。
SQL标准自1986年以来不断演化发展,有数种版本。
在本手册中,“SQL-92”指得是1992年发布的标准,“SQL:1999”指得是1999年发布的标准,“SQL:2003”指得是标准的当前版本。
我们采用术语“SQL标准”标示SQL标准的当前版本。
二、MySQL的安装MySQL是一个开源的用于数据库管理的软件。
可以到MySQL的主页上进行下载,地址为。
登录学院ftp://172.25.10.20/(内网)或者ftp://113.55.4.20(外网) 用户名:zhuyp_std, 密码:std,下载区常用数据库的安装和调试文件夹下载相关软件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验难度: A □ B □ C □序号学号成绩指导教师(签名)学期:2017秋季学期任课教师:实验题目:组员及组长:承担工作:联系:电子:完成提交时间:年月日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)魔王语言的解释规则:大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
在A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):输入wasjg,则魔王语言解释为“我爱数据结构”。
运用了离散数学的一些基本知识及程序设计知识。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)//---------------抽象数据类型的定义------------------//#define STACK_INIT_SIZE 50#define STACKINCREMENT 10#define OVERLOW -2#define ERROR -1typedef struct {char *base; //顺序栈的栈底指针int top; //顺序栈的栈顶int size; //栈元素空间的大小}SqStack; //结构体类型顺序栈typedef struct {char *base;int front;int rear;}SqQueue; //结构体类型队列//---------------各个模块功能的描述------------------//void Init_SqStack(SqStack &s) //初始化顺序桟void Push_SqStack(SqStack &s, char c) //压入数据int Pop_SqStack(SqStack &s, char &e) //出桟char GetTop_SqStack(SqStack s)//或得栈顶int IsEmpty_SqStack(SqStack s)//判断是否空栈void Init_SqQueue(SqQueue &q)//初始化void En_SqQueue(SqQueue &q, char c)//进队列int De_SqQueue(SqQueue &q, char &e) //出队列void Translate(char c) //打印字符void Reverse(char str[],char strtmp[])//将字符串反向int Execute(char ch[], SqStack &s, SqQueue &q)//魔王语言操作调用关系:三、【实现(Implement)】(30%)(本部分应包括:抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。
如有界面则需包括界面的关键实现方法等。
)主程序模块:int main(){char ch[100];char ch1[100];char ch2[100];char e;//********************************************************英文解密printf("请输入魔王语言:");gets(ch);SqStack s;SqQueue q;Init_SqStack(s);Init_SqQueue(q);if(Execute(ch,s,q) == 1){while(De_SqQueue(q,e) == 1){Translate(e);}}elseprintf("输入的括号不匹配!"); //左括号比右括号多,不匹配//********************************************************中文解密printf("\n");printf("请输入魔王语言:");gets(ch1);Init_SqStack(s);Init_SqQueue(q);Reverse(ch1,ch2);{for(int i=0;ch2[i]!='\0';i++)Push_SqStack(s,ch2[i]);while(Pop_SqStack(s,e) == 1){switch(e){case'w':printf("我");break;case'a':printf("爱");break;case's':printf("数据");break;case'j':printf("结");break;case'g':printf("构");break;}}}return 0;}其他函数实现代码见七、【代码】部分。
时间复杂复分析:o(n)。
四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)输入的魔王语言为:B(ehnxgz)B翻译的结果为:tsaedsaeezegexenehetsaedsae错误模式:括号匹配错误提示。
输入的魔王语言为:wasjg翻译为汉语的结果为:我爱数据结构结论:此程序能够按照给定的翻译规则解释魔王语言。
五、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)问题关键:1.栈的初始化,入栈出栈操作,栈为空的判断条件,队列的初始化,入队和出队操作,队列为空的判断。
以及队列中最后一个元素被删除后尾指针的修改。
2.主函数的操作。
由于队列和栈的操作始终为同一个,所以在主函数中,采用指针函数的调用,确保操作在同一个队列和栈上。
3.一些细节处理,比如数组操作等。
4.另在查阅资料时候发现:将魔王语言作为一个字符串读入进来,首先检查括号是否匹配,如果不匹配就无法解释。
如果匹配,然后将字符串从尾到头依次压入栈S 中,将栈S中的容依次弹出压入栈S2中,直至遇到右括号,将其压入栈S1中,并将栈S2弹出依次压入栈S1中,直至遇到左括号压入栈S1中,这样栈S1中存放的容就是匹配的第一个重括号,将栈S1栈顶元素左括号弹出,将左括号下面的那个元素保存在e1变量中,然后将其他元素弹出依次压入栈S3中,在将e1与栈S3中依次弹出的元素压入栈S2中,重复这个过程,直至将魔王语言中所有的括号都处理完为止,所以这个思路可以处理多重括号嵌套的问题。
六、思考题或【项目运作描述(Operate)】(10%)(注:选择C难度的才需要填写“项目运作描述”,其他难度的只需完成思考题)(项目运作描述应包括:项目的成本效益分析,应用效果等的分析。
)1.栈:特点就是一个先进后出的结构。
主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。
在CPU 部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。
在编程语言中:主要用来进行函数的调用和返回。
可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。
队列:特点就是一个先进先出的结构。
只要满足数据的先进先出原理就可以使用队列。
2. 可以采用顺序存储结构和链式存储结构,因为他们都是线性表,就像一排站在一条线上的人,位置关系是一个挨一个的,这样的顺序不会改变,而改变点都在头或者尾,仍然保持形态不变的。
七、【代码】(10%)(本部分应包括:完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体: Georgia , 行距: 固定行距12,字号: 小五)#include<stdio.h>#include<stdlib.h>#include<string.h>#define STACK_INIT_SIZE 50#define STACKINCREMENT 10#define OVERLOW -2#define ERROR -1typedef struct {char *base;int top;int size;}SqStack;typedef struct {char *base;int front;int rear;}SqQueue;void Init_SqStack(SqStack &s) //初始化顺序桟{s.base = (char *)malloc(sizeof(char) * STACK_INIT_SIZE);if(!s.base) exit(OVERLOW);s.top = 0;s.size = STACK_INIT_SIZE;}void Push_SqStack(SqStack &s, char c) //压入数据{if(s.top >= s.size){s.base = (char *)realloc(s.base,(sizeof(char) * (s.size + STACKINCREMENT)));s.size += STACKINCREMENT;}s.base[s.top] = c;s.top ++;}int Pop_SqStack(SqStack &s, char &e) //出桟{if(s.top == 0)return 0;s.top --;e = s.base[s.top];return 1;}char GetTop_SqStack(SqStack s){return s.base[s.top - 1];}int IsEmpty_SqStack(SqStack s){if(s.top == 0)return 1;elsereturn 0;}void Init_SqQueue(SqQueue &q)//初始化{q.base = (char *)malloc(sizeof(char) * STACK_INIT_SIZE);if(!q.base)exit(OVERLOW);q.front = 0;q.rear = 0;}void En_SqQueue(SqQueue &q, char c)//进队列{if((q.rear + 1) % STACK_INIT_SIZE == q.front) exit(ERROR);q.base[q.rear] = c;q.rear = (q.rear + 1) % STACK_INIT_SIZE;}int De_SqQueue(SqQueue &q, char &e) //出队列{if(q.front == q.rear)return 0;e = q.base[q.front];q.front = (q.front + 1) % STACK_INIT_SIZE;return 1;}void Translate(char c) //打印字符{printf("%c",c);}void Reverse(char str[],char strtmp[])//将字符串反向{int len = strlen(str);int i,t=0;for(i=len - 1;i>=0;i--)strtmp[t++] = str[i];strtmp[t] = '\0';}int Execute(char ch[], SqStack &s, SqQueue &q){SqStack ss;Init_SqStack(ss);char ch1[100];char ch2[100];char ch3[100];char c1,e,c;int flag=0,t = 0,i=0,len;Reverse(ch,ch1); //将输入进来的ch 反向for(i=0;ch1[i]!='\0';i++)Push_SqStack(s,ch1[i]);while(Pop_SqStack(s,e) == 1){if(flag != 0 && e != ')') //此处是为了将找到第一个左括号之后的字符全部进入括号操作桟ss 中{Push_SqStack(ss,e);if(GetTop_SqStack(ss) == '(') //遇到左括号'(' flag加1{flag ++;}continue;}if(e == 'B') //如果是字符'B'就进桟{Push_SqStack(s,'A');Push_SqStack(s,'d');Push_SqStack(s,'A');Push_SqStack(s,'t');}else if(e == 'A') //如果是字符'A'就相对应的字符进队列{En_SqQueue(q,'s');En_SqQueue(q,'a');En_SqQueue(q,'e');}else if(e == '('){Push_SqStack(ss,e);flag ++; //flag每加一次,都有一个左括号,用flag来表示左括号的数量}else if(e == ')'){if(flag == 0){printf("输入的括号不匹配!\n"); //左括号和右括号不匹配,右括号比左括号多exit(-1);}t=0;while(GetTop_SqStack(ss) != '('){Pop_SqStack(ss,c);ch2[t++] = c;}Pop_SqStack(ss,c); //弹出左括号'('flag --; //每弹出一个左括号就flag减少1ch2[t] = '\0';len = strlen(ch2);if(len == 0) //此处是处理空括号的情况continue;c1 =ch2[len - 1];t = 0;for(i=0;i<len - 1;i++) //此步是对括号中的操作{ch3[t++] = c1;ch3[t++] =ch2[i];}ch3[t++] = c1; //对第一个字符的操作(在最后一个字符处加上第一个字符:上一步的操作时只操作到最后第二个字符)ch3[t] = '\0';if(IsEmpty_SqStack(ss) == 1) //如果操作括号的ss桟里面为空,则说明处理过程结束,ch3字符串现在是标准处理好的字符串,将ch3字符串倒着进入原来的桟s{Reverse(ch3,ch2);for(i=0;ch2[i]!='\0';i++){Push_SqStack(s,ch2[i]); //进入之前操作的桟}}else //如果括号操作桟ss 不空,则将操作好的一个括号中的字符压入字符操作桟ss 等待下一个右括号字符')'的输入{for(i=0;ch3[i]!='\0';i++){Push_SqStack(ss,ch3[i]);}}}elseEn_SqQueue(q,e);}if(flag != 0)return 0;elsereturn 1;}int main(){char ch[100];char ch1[100];char ch2[100];char e;printf("请输入魔王语言:");gets(ch);SqStack s;SqQueue q;Init_SqStack(s);Init_SqQueue(q);if(Execute(ch,s,q) == 1){while(De_SqQueue(q,e) == 1){Translate(e);}}elseprintf("输入的括号不匹配!"); //左括号比右括号多,不匹配//********************************************************中文解密printf("\n");printf("请输入魔王语言:");gets(ch1);Init_SqStack(s);Init_SqQueue(q);Reverse(ch1,ch2);{for(int i=0;ch2[i]!='\0';i++)Push_SqStack(s,ch2[i]);while(Pop_SqStack(s,e) == 1){. . . . .switch(e){case'w':printf("我");break;case'a':printf("爱");break;case's':printf("数据");break;case'j':printf("结");break;case'g':printf("构");break;}}}return 0;}. . 优质资料. .。