云南大学软件学院大数据结构实验3
- 格式:doc
- 大小:246.00 KB
- 文档页数:11
序号:云南大学软件学院实验报告课程:数据库原理与实用技术实验学期: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 语句分别向四张表中添加教材上的数据记录。
云大软件工程实验三软件设计云大软件工程实验三软件设计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.涉密信息:指涉及国家安全、经济安全、社会公共利益和个人隐私安全等方面的机密信息。
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期: 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)向表中插入数据。
数据结构复习提纲第一章:1.数据结构的逻辑结构:集合结构、线性结构、树形结构、图状结构2.数据结构的物理〔存储〕结构:顺序结构、链式结构3.抽象数据类型的两个重要特性:数据抽象、数据封装4.算法的五个重要特性:有穷性、确定性、可行性、输入、输出5.算法设计原则:正确的、可读性、健壮性、高效率与低存储量第二章1.线性表存储结构的公式:Loc(a i+1)=Loc(a i )+LLoc(a i )=Loc(a 1)+(i-1)*L2.线性表的顺序存储结构“在表中任何位置(1≦i ≦n+1)上插入结点”算法时间复杂度: O(n)3.线性表的顺序存储结构“在表中任何位置(1≦i ≦n)上删除结点”算法时间复杂度: O(n)4.域的定义:举例data :数据域,用来存放结点的值。
next :指针域〔亦称链域〕,用来存放结点的直接后继的地址。
5.线性表的链式表示和实现〔建表〕:头插法:该方法从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。
、 尾插法:该方法是将新结点插入到当前链表的表尾上,为此必须增加一个尾指针r ,使其始终指向当前链表的尾结点。
6.线性表的链式表示和实现〔查找〕:按序号查找:在链表中,当知道被查找结点的序号pos 时,只能从链表的头指针出发,顺链域next 个结点往下搜索,直到搜索到第i 个结点为止。
因此,链表不是随机存取结构。
按值查找:按值查找是在链表中,查找是否有结点值等于给定值key 的结点,假设有的话,则返回首次找到的其值为key 的结点的存储位置;否则返回NULL 。
查找过程从开始结点出发,顺着链表逐个将结点的值和给定值key 作比较。
7.线性表的链式表示和实现〔插入和删除运算的实现代码略〕8.涉及遍历操作时,其终止条件:非循环链表判断p 或p —>next 是否为空9.循环链表:涉及遍历操作时,其终止条件:判断它们是否等于某一指定指针,如头指针等。
云南大学软件学院数据结构实验报告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函数:将两个链表的相应项系数相减,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
课程:数据结构实验学期: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; //图中当前顶点数边数。
云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(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%)主函数显示开始界面,选择相应的功能进行哈夫曼编码译码。
云南大学软件学院实验报告课程:计算机网络原理实验任课教师:姓名:学号:专业:成绩:实验三、套接字编程1.实验目的:两人一组,编写一个客户端、服务器程序,掌握Socket编程原理。
2.实验环境:连入局域网络的主机一台。
3.实验指导:Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。
理解socket编程模型及其原理。
4.实验分析,回答下列问题。
a.运行指导书中的程序,并修改服务器的功能(自己思考),改写成多线程web服务器(选作),附上源代码,并加关键代码注释。
b.给出程序调试和运行的截图。
c.回答下列问题:(1)为什么在服务器和客户端要包含winsock2.h文件?winsock2.h是头文件,声明了在C/C++下进行Winsock编程需要的函数,结构等内容.是提供给编译器用的。
以此来提供自带程序库。
.(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?表示链接Ws2_32.lib这个库,否则就无法使用Ws2_32.lib库(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用程序会有什么问题?当调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。
以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
如果不调用就无法完成上述功能。
(4)如果服务器程序中没有memset(server.sin_zero, 0,sizeof(server.sin_zero));语句,程序会出现什么错误,为什么?不能够读出内容,因为删除该句话之后不能够分配内存空间来存储内容。
(5)如果先运行客户端程序,程序会有什么现象,为什么会有这一现象?终止访问,客户端会自动关闭程序,因为其请求未接收到有服务器端的回应。
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期: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 架构,是分层架构还是微服务架构等。
同时,还要划分出各个模块,并明确它们之间的关系。
这就像是把大楼划分成不同的区域,如客厅、卧室、厨房等,并确定它们之间的通道和连接方式。
在进行总体设计时,要充分考虑系统的可扩展性、可维护性和性能等方面的要求。
然后是详细设计。
详细设计是对总体设计的进一步细化,包括每个模块的内部结构、算法流程、数据结构、接口定义等。
这就好比是为每个房间确定具体的布局、装修风格、家具摆放等。
详细设计的好坏直接影响到代码的编写质量和效率,因此需要我们非常仔细和认真地对待。
在软件设计过程中,有几个关键的原则需要遵循。
首先是高内聚低耦合原则。
高内聚意味着一个模块内部的各个元素之间联系紧密,共同完成一个明确的功能;低耦合则表示模块之间的依赖关系尽量少,这样当一个模块发生变化时,对其他模块的影响最小。
其次是开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
实验难度: 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;}。