项目1:中国计算机设计大赛赛事统计
设计目标:
1,能统计各学校的总分
2,能按照学校编号或者名称,将学校的总分或者各项目的总分排序输出
3,能够按照编号查询学校某个项目的获奖情况
4,可以按照项目编号查询取得前三名的学校
5,数据能够存入文件并随时查询
设计要求:
1,每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;每个队伍只能参加一项比赛
2,输入形式:输入学校的名称和赛事项目
3,界面要求:交互设计合理;根据提示完成相关功能的要求
4,存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中
设计思路:
数据结构:
data:
list--存储所有的data
方法一,主函数
创建dataStorage类存储学校信息,id,name,int[](参加的项目)
用list来存放dataStorage
定义choice变量,打印菜单,用户根据提示输入选择。通过while循环实现交互
方法二,菜单实现
1,初始化信息 2,统计各学校总分 3,按学校名称显示学校总分 4,按学校名称或编号显示各项目总分排序 5,按学校编号查询某个项目的获奖状况 6,按项目编号查询取得前三名的学校 7,打印所有学校信息 8,保存文件 9,读取文件 0,退出
方法三,初始化信息
创建dataStorage对象并通过Scanner来键盘输入信息,输入学校名、编号、队伍数目、队伍名、参赛项目和得分。创建完毕后用list统一存储。输入完后通过Java语言的序列化存储到本地txt文件上,为避免重复输入,每次直接读取已经保存的序列化文件。
方法四,统计各学校总分
循环访问list,用迭代器访问list中的每一个元素的map中的分数,累加得到总分
方法五,按照学校名称显示各项目排序
输入学校的名称或者编号,遍历list找到对应的学校,用迭代器访问整个数据,根据项目名来得到不同项目的总分
方法六,通过学校名称显示学校总分
通过输入学校名找到对应的list中的元素,通过迭代器访问所有的成绩并进行累加,得到该学校的总分
方法七,找到项目的前三名学校名称
输入项目名称,新建list1存储学校名和得分;通过迭代器访问得到list元素中的所有数据,通过比较项目名称得到前三名的数据
方法八,找到学校的项目奖项
通过方法七能够得到各个项目的前三名,新建map将每个前三名的学校和奖项村粗,全部存储后进行遍历,通过匹配输入的学校名和map中的学校名是否相等来判断是否输出
文件的保存和读取
通过Java语言的序列化来实现存储自定义类型数据
项目2:校园导游咨询
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【数据结构】
dt
{
景点编号;(int)
景点名称;(String)
景点描述;(String)
}
【景点选择】(以江苏科技大学地图为例)
文理大楼、东苑、西操场、西苑、北苑、图书馆、梦溪园、文体中心、东操场、杨帆广场
初始化信息后将所有的景点信息存储到array数组中
【拓扑图如下】
【无向图实现】
用二维数组表示无向图
graph[i][j]代表第i个景点和第j个景点之间的距离;若距离为INF,则代表无限大,两者之间不能达到
【无向图和dt建立连接】
通过无向图的下标=景点id-1的关系建立连接
【方法实现】
查询信息-首先通过菜单将所有的景点信息和编号呈现给用户,让用户输入景点的编号,遍历访问数组array比较输入的id和数字每个元素的id,找到对应的景点后打印输出。
查询路径-通过键盘输入当前景点和目标景点,两者的数值-1对应无向图矩阵的下标。用dijkstra算法实现
【详情B站搜索-最短路径算法】
通过此算法得到当前景点到所有景点的最短距离,在代码实现中,创建新的数组(list1)保存节点访问顺序;访问整个保存结点访问的数组list1一直到数组元素为目标景点,进而得到最短路径的长度和路线
项目3:算术表达式计算器
目标:
实现简单的计算:+、-、*、/、(、)
实现思路:
【按照先乘除后加减,先左后右,先括号里后括号外的顺序,得到操作符优先关系表(7*7的二维数组】
将信息存入map中
symLvMap.put('=', 0);
symLvMap.put('-', 1);
symLvMap.put('+', 1);
symLvMap.put('*', 2);
symLvMap.put('/', 2);
symLvMap.put('(', 3);
symLvMap.put(')', 1);
1,创建两个栈:存放操作符的OPTR和存放数字的OPND
2,输入字符串,每次读取一个字符a
3,判断a是否为数字:
是
将a压入OPND
否
和当前OPTR栈顶元素b比较优先级,优先级高则将a直接压栈;优先级低则先将b出栈,后将a入栈
4,遍历访问两个栈,根据操作符的不同实现不同的算法,当操作符出栈元素为#时代表已经计算完毕,程序结束
重点:
检验括号是否匹配
LinkedList<Character> stack = new LinkedList<>();
for (char c : str.toCharArray()) {
if (c == '(') {
stack.add(c);
} else if (c == ')') {
if (stack.isEmpty()) {
return false;
}
stack.removeLast();
}
}
if (stack.isEmpty()) {
return true;
} else {
return false;
}
对于负数的操作,在字符串处理的时候进行补充0的操作,例如,将-1转换为(0-1)的形式
if ('-' == str.charAt(0)) {
str = 0 + str;
}
对于直接用8(7-4)这种形式,在对字符串进行处理的时候将“(”补齐为“*(”的形式。
if (i != 0 && c == '(' && (isCharNum(str.charAt(i - 1)) || str.charAt(i - 1) == ')')) {
sb.append("*(");
continue;
}
对于操作符栈,i-代表当前操作符,j-代表上一个操作符,如果i的优先级>j的优先级,则直接入栈,反之则先把i操作符出栈,再把j入栈,再把i入栈,同时对括号处理的时候,当出现一堆括号则将括号里面的内容计算后压入数字栈。