2022数据结构实验预习报告(JUST)

​​​​​​在这里插入图片描述

目录

项目1:中国计算机设计大赛赛事统计

项目2:校园导游咨询

项目3:算术表达式求解


项目1:中国计算机设计大赛赛事统计

【问题描述】

参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m。比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。

【基本要求】

  • 每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;每个学校的每个参赛队伍只能参加一个赛事项目
  • 能统计各学校的总分
  • 可以按照学校编号或名称,学校的总分、各项目的总分排序输出
  • 可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校
  • 数据存入文件并能随时查询

【设计要求】

  • 输入数据形式和范围:可以输入学校的名称,赛事项目的名称
  • 输出形式:有中文提示,各学校分数为整数
  • 界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求
  • 存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中

【测试数据】

  • 要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定

【实现提示】

  • 假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。

【解题思路】

01、初步逻辑分析:

  • 每个学校每参加一个赛事项目只能派出一个参赛队伍),所以至少需要10m个参赛队伍,至少10m/6个学校。

02、可能用到的结构体:

  • 学校类:学校名称、编号,参赛队、每个参赛队参加的赛事项目以及成绩、总分,输入、输出、排序
  • 赛事类:项目名称、编号,参赛学校及其队伍、取得的成绩,输入、输出、排序

03、可能需要的功能:

  • // 输入功能(管理员权限):输入赛事项目编号、名称,然后依次输入参赛学校编号、名称及成绩
  • // 存储功能:赛事相关数据存储在文件中
  • // 排序功能:
  • 学校按总分排序的排名情况
  • 学校在各项目中按分数排序的排名情况
  • // 查询功能(用户权限):
  • 按照学校编号或名称查询,输出该学校的总分和参加项目的分数情况
  • 按照项目编号查询,输出前三名的学校的编号和名称
  • 按照学校编号查询,然后按照项目编号查询,输出该学校该项目的获奖情况

04、可能的界面设计:

  • 登录:区分管理员和用户
  • 管理员界面:输入赛事结果并存储到文件中
  • 用户界面:选择查询方式、输入查询对象
  • 输出:根据查询要求,输出各种成绩单和得分报表

05、流程图如下(仅供参考):

项目2:校园导游咨询

【问题描述】

  • 设计一个校园导游程序,为来访的客人提供各种信息查询服务

【基本要求】

  • 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介  等信息;以边表示路径,存放路径长度等相关信息
  • 为来访客人提供图中任意景点相关信息的查询
  • 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径

【测试数据】

  • 以江苏科技大学长山校区为例:

​​​​​​​

【实现提示】

  • 一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网顶点和边均含有相关信息

【解题思路】

01、可能需要的功能:

  • (1)查看游览路线:将一个顶点到其他所有顶点的最短路径输出 
  • (2)查询景点间最短路径:将任意两个顶点间的最短路径输出
  • (3)查询景点间的所有路径:将两景点间路径长度小于定值的路径输出
  • (4)学校景点介绍:将学校的景点列表输出 
  • (5)景点信息查询:查询某景点的详细信息
  • (6)学校地图:校园平面图
  • (7)更改图信息:增加顶点、删除顶点、增加边、删除边、打印邻接矩阵
  • (8)用一个主函数把这些板块合成,生成一个菜单界面呈现在用户面前。

02、数据结构知识:

  • (1)使用的数据结构为:无向带权图,定义三个结构体边、顶点、图。
  • (2)主要算法:迪杰斯特拉算法、弗洛伊德算法

03、可能的数据结构设计:

 04、算法细解:

迪杰斯特拉算法:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

弗洛伊德算法:对于从vi到vj的弧,进行n次试探:首先考虑路径vi,v0,vj是否存在,如果存在,则比较vi,vj和vi,v0,vj的路径长度,取较短者为从vi到vj的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点v1,依此类推,在经过n次比较后,最后求得的必是从顶点vi到顶点vj的最短路径。

项目3:算术表达式求解

【问题描述】

  • 设计一个简单的算术表达式计算器

【基本要求】

  •  实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)​​​​​​​

【测试数据】

  • ​​​​​​​(30+2*70)/3-12*3
  •  5+(9*(62-37)+15)*6
  •  要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
  • NULL
  • 5+(9*(62-37)+15)*6
  • 5++(9*(62-37)+15)*6
  • 5+(9*(62-3.7)+15)*6-0

【实现提示】

  • 可以设计以下辅助函数:
  • status isNumber(char ReadInChar);  //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 
  • int TurnToInteger(char IntChar);   // 将字符’0’.’9’ 转换为整数 9

【解题思路】

01:需求分析

  • 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示
  • 保存和浏览历史运算记录
  • 能够检验算术表达式的合法性
  • 能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符
  • 要求交互界面友好,程序健壮

02、重难点:

  • 中缀表达式 转 后缀表达式

       逆波兰表达又称后缀表达式,将运算符写在操作数之后,便于计算机计算

  • 将中缀表达式转换成后缀表达式的8个步骤:
  1. 1、初始化两个栈,运算符栈s1和存储中间结果的栈s2

  2. 2、从左至右扫描中缀表达式

  3. 3、遇到操作数时,将其压入s2

  4. 4、遇到运算符时,将其与s1栈顶运算符的优先级进行比较:

    • 如果s1为空,或栈顶运算符为左括号"(",则直接将此运算符入栈
    • 否则,若优先级比栈顶运算符的高,也将运算符压入s1
    • 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中的栈顶运算符相比较
  5. 5、遇到括号时:

    1. 如果是左括号"(",则直接压入s1
    2. 如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
  6. 6、重复步骤2至5,知道表达式最右边

  7. 7、将s1中剩余的运算符以此弹出并压入s2

  8. 8、依次弹出s2中的元素并输入,结果的逆序即为中缀表达式对应的后缀表达式。

  • 例子:1+(2+3)*4 -5 的转换步骤

  • 后缀表达式的计算
  • 计算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

(1)从左到右扫描后缀表达式字符串
(2)初始化一个空栈
(3)如果扫描到数字,那么就直接入栈
(4)如果被扫描的字符是一个二元运算符,那么就连续出栈两次,获得两个字符,

          元素出栈后,应用运算符进行计算,并将结果压栈
(5)重复3)和4)的操作,直至扫描完字符串
(6)扫描完所有字符串之后,栈中只剩一个元素,该元素就是最终结果,将其出栈并返回。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值