目录
项目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、初始化两个栈,运算符栈s1和存储中间结果的栈s2
-
2、从左至右扫描中缀表达式
-
3、遇到操作数时,将其压入s2
-
4、遇到运算符时,将其与s1栈顶运算符的优先级进行比较:
- 如果s1为空,或栈顶运算符为左括号"(",则直接将此运算符入栈
- 否则,若优先级比栈顶运算符的高,也将运算符压入s1
- 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中的栈顶运算符相比较
-
5、遇到括号时:
- 如果是左括号"(",则直接压入s1
- 如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
-
6、重复步骤2至5,知道表达式最右边
-
7、将s1中剩余的运算符以此弹出并压入s2
-
8、依次弹出s2中的元素并输入,结果的逆序即为中缀表达式对应的后缀表达式。
- 例子:1+(2+3)*4 -5 的转换步骤
- 后缀表达式的计算
- 计算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
(1)从左到右扫描后缀表达式字符串
(2)初始化一个空栈
(3)如果扫描到数字,那么就直接入栈
(4)如果被扫描的字符是一个二元运算符,那么就连续出栈两次,获得两个字符,
元素出栈后,应用运算符进行计算,并将结果压栈
(5)重复3)和4)的操作,直至扫描完字符串
(6)扫描完所有字符串之后,栈中只剩一个元素,该元素就是最终结果,将其出栈并返回。