下载链接在文末
题目选择 :航空订票系统
开发语言 :Java
代码编写工具: Eclipse
与数据结构相关知识:队列,栈,KMP匹配算法。
一、设计思路:
1,首先在项目工程中创建Main Frame.java作为主窗口文件,设置窗口大小为,主题样式,标题栏,窗口图标,并添加到当前窗口中背景以及窗口可见性,之后创建InitGlobalFont方法,该方法设置全局字体的样式和大小。
2,之后在项目工程中创建MainPanel. Java文件,该文件用于切换界面,首先在该文件中定义一个jpanel,设置为卡片布局,之后将其添加到MainFrame中。
3,在项目工程中创建FunctionPanel.java类,并将其添加到MainPanel.java的CardLayout中,并通过CardLayout.Show方法设置FunctionPanel为默认显示。在FunctionPanel.java中,创建三个图片按钮,,分别代表航班管理,订票,退票,以及一个退出按钮,并将它们添加点击事件。
4,在项目工程中创建FunctionPanel.java文件,创建data文件夹,在该文件夹内创建program-icon和program-store文件夹,分别用于存放图标和数据,在program-store文件夹中创建flight.txt文件,写入所有的航班信息,每一行代表一个航班信息。
5,FunctionPanel.java为航班管理界面,在该文件中,首先创建一个表格table,逐行读取flight.txt的所有信息,将其存入队列中,再从队列弹出将其添加到表格中。创建五个按钮,分别为“添加航班”,“删除航班”,“修改航班”,“刷新”,“返回”,以及一个文本框和搜索按钮。
- 点击“添加航班”,将弹出添加窗口,在窗口中输入航班信息,点击确定即可将该信息添加到flight.txt文件中,并刷新表格。
- 选中某表格中的某一条信息,点击“删除航班”,将会获取该行中的航班号,根据该航班号与flight.txt文件进行逐行匹配,匹配成功则将其删除,并刷新表格。
- 选中某一条信息 点击“修改航班”,过程与删除航班类似,匹配成功后对该行覆盖写入,并刷新表格。
- 点击“刷新”,会重新读取文件,将其显示在表格中。
- 点击“返回”,会使MainPanel的CardLayout显示FunctionPanel,即主界面。
- 在文本框中输入关键词,点击“搜索”按钮,会将从文本框获取的数据与flight.txt进行逐行匹配,将匹配成功的信息存入队列中,之后将队列中的信息输出在表格中。
6,在项目工程中创建addPanel.java,作为航班订票界面,在该界面中创建一个表格,以及三个按钮,分别为“订票”,“候补乘客”,“返回”,在data/ program-store文件夹中创建book-list.txt,用于存储订单,创建candidata-list.txt文件,用于存储候补乘客。表格中显示当前所有航班,点击某一条信息,点击“订票”,输入乘客信息,数量,如果剩余票充足,则将当前的航班号,乘客信息,数量写入到book-list.txt文件中,并修改light.txt文件的该航班剩余票数。若余票不足,则提示是否列入候该航线的候补名单中。选中某一条航班,点击“候补乘客”,则会读取candidate-list.txt文件,并弹出新窗口以表格的形式显示。点击“返回”,则返回到主界面,点击“搜索”,则会根据输入的关键字和日期与flight.txt中的航班信息进行匹配,将所有匹配成功的信息存入队列中,清空表格,之后将队列中的信息输出在表格中,并以时间先后排序。
7,在项目工程中创建deletePanel.java,作为航班退票界面,在该界面中创建一个表格,,以及三个按钮,分别为“退票”,“候补乘客”,“返回”,以及一个文本框和“搜索”按钮,表格中显示当前所有订单,选中某一条订单,点击“退票”,则会根据航班号与book-list.txt文件里航班号匹配,匹配成功则删除该订单,并重新统计该航班剩余票量,并将剩余票量写入到flight.txt中。之后检查是否有候补乘客,如果有则将剩余票给与候补乘客,以排队顺序优先,并删除其在候补名单candidate-list的信息。
8,最后,在FunctionPanel中的点击事件中创建三个判断语句,创建三个标志位为true,当点击事件为searchPanel时,如果标志位为true,则向MainPanel中的CardLayout添加该界面,将标志位置为false,之后显示该界面,其它两个与其相同。
二、需求分析
1.课程设计目的
(1).熟练掌握堆队列和栈的原理和应用。
(2).熟悉Java语言的程序设计与开发,查缺补漏,提高编程能力。
2.设计任务
线性表
本次课程设计使用的线性结构为数组,用于临时存储用户输入的订单信息,退票信息,最后将其写入到文件中。
特殊线性表
本次课程设计使用的特殊线性结构为队列,程序中的表格数据通过从文件中读取,将需要的数据临时存储在队列中,在将队列的数据逐条输出到表格中。
非线性结构
在本次课程设计中,使用的非线性结构为二叉树,在进行模糊搜索时,通过二叉树遍历数据可提高搜索速度。
查找和排序
本程序的查找功能采用了KMP搜索搜索算法以及二叉树遍历,排序采用了冒泡排序法。
3.设计环境
本次设计和开发的平台为Windows10,使用Java语言开发,编译环境为JDK1.8,使用的开发工具为eclipse IDE 2022-03。
三、概要设计
1.数据结构设计
(1)线性表数据结构设计
static String[] tab_title = {}//用于存放表头
//用于将队列转化为数组的方法
public static String[][] queue_to_array(Queue<String[]> queue){
int count=0;//定义一个int型数据充当计数器
//用于存储队列数据的数组
String[][] get_queue_data=new String[queue.size()][7];
//判断队列中是否还有数据
while (queue.size()>0){
//从队列弹出数据并存储到数组中
get_queue_data[count]=queue.poll();
count++;
}
//返回数组
return get_queue_data;
}
(2)特殊线性表数据结构设计
public static Queue<String[]> queue =
new LinkedList<String[]>();//用于存储读取到的符合条件的数据
//定义一个读取文件的方法
public static void read_txt(String src,Queue<String[]> queue){
try {
//根据传入的地址找到文件
File file = new File(src);
//定义一个FileReader
FileReader fileReader = new FileReader(file);
//定义一个LineNumberReader用于读取行数据
LineNumberReader reader = new LineNumberReader(fileReader);
int number = 1;
String txt = ""; //存储得到的行数据
int lines = 0; //从第一行开始读取
while (txt != null) {//如果读取到的数据非空
lines++;//行数加一
txt = reader.readLine();//继续读取下一行
//当读取到的数据不为空时
if (lines > number&&txt!=null&&!txt.trim().equals("")) {
//将当前数据以“/”分割并存储到数组中
String[] data=txt.split("/");
//向队列中送入读取到的数据
queue.offer(data);
}
}
//关闭LineNumberReader
reader.close();
//关闭fileReader
fileReader.close();
}catch (IOException e) {
System.out.println("读取文件出错");
}
}
(3)非线性结构数据结构设计
本次课程设计用到的非线性结构只有堆,因为堆是一个完全二叉树,所以在本次课程设计中采取的是将堆映射到数组上的方式来实现逻辑上的堆结构的。
(4)查找和排序数据结构设计
public static void filter_txt
(String src,String starting_point,String end_point,
String departure_time,Queue<String[]> queue){//筛选航线方法
try {
//根据传入的地址找到文件
File file = new File(src);
//定义一个FileReader
FileReader fileReader = new FileReader(file);
LineNumberReader reader = new LineNumberReader(fileReader);
int number = 1;
String txt = "";
int lines = 0;
while (txt != null) {//如果读取到的数据非空
lines++;
txt = reader.readLine();//继续读取下一行
if (lines > number&&txt!=null&&!txt.trim().equals("")) {
//将读取到的数据以“/”分割并存入数组中
String[] data=txt.split("/");
if(starting_point.trim().equals(data[1])&&end_point.trim().equals(data[2])&&departure_time.trim().equals(data[3].substring(0, 10))) //将符合条件的数据存储队列中
queue.offer(data);
}
}
//关闭文件流
reader.close();
fileReader.close();
}catch (IOException e) {
System.out.println("读取文件出错");
}
}
2.模块设计
(1)线性表模块设计
本次课程设计所采用的线性结构就是数组,而数组是在Java语言中自带的一种结构,直接使用即可,无需做额外设计。
(2)特殊线性表模块设计
本课程设计采用的特殊线性表是队列,在队列中存储的是来自文件的数据,每一条数据需要以数组的形式存储,所以队列中存储的为数组,所以我们定义了Queue<String[]>这样的队列。
(3)非线性结构模块设计
在本次课程设计中,使用的非线性结构为二叉树,在进行模糊搜索时,通过二叉树遍历数据可提高搜索速度。
(4)查找和排序模块设计
本程序的查找功能采用了KMP搜索搜索算法以及二叉树遍历,排序采用了冒泡排序法,此模块主要用于用户输入的信息模糊搜索航班,并将最终结果以时间先后进行排序。
三、详细设计
1.主程序界面及功能的详细设计
首先在项目工程中创建Main Frame.java作为主窗口文件,设置窗口大小为,主题样式,标题栏,窗口图标,并添加到当前窗口中背景以及窗口可见性,之后创建InitGlobalFont方法,该方法设置全局字体的样式和大小。在项目工程中创建FunctionPanel.java类,并将其添加到MainPanel.java的CardLayout中,并通过CardLayout.Show方法设置FunctionPanel为默认显示。在FunctionPanel.java中,创建三个图片按钮,分别代表航班管理,订票,退票,以及一个退出按钮,将按钮添加到界面中,设定其位置,并将它们添加点击事件,点击航班管理将MainPanel.java的CardLayout.show()设定为SearchPanel,点击订票设定为AddPanel,点击订单管理将其设为RefundPanel。
图1 主程序模块流程图
2.航班管理模块界面及功能详细设计
FunctionPanel.java为航班管理界面,在该文件中,首先创建一个表格table,逐行读取flight.txt的所有信息,将其存入队列中,再从队列弹出将其添加到表格中。创建五个按钮,分别为“添加航班”,“删除航班”,“修改航班”,“刷新”,“返回”,以及一个文本框和搜索按钮。点击“添加航班”,将弹出添加窗口,在窗口中输入航班信息,点击确定即可将该信息添加到flight.txt文件中,并刷新表格。选中某表格中的某一条信息,点击“删除航班”,将会获取该行中的航班号,根据该航班号与flight.txt文件进行逐行匹配,匹配成功则将其删除,并刷新表格。选中某一条信息 点击“修改航班”,过程与删除航班类似,匹配成功后对该行覆盖写入,并刷新表格。点击“刷新”,会重新读取文件,将其显示在表格中。点击“返回”,会使MainPanel的CardLayout显示FunctionPanel,即主界面。在文本框中输入关键词,点击“搜索”按钮,会将从文本框获取的数据与flight.txt进行逐行匹配,将匹配成功的信息存入队列中,之后将队列中的信息输出在表格中。
图2 航班管理模块流程图
3.机票预定模块界面及功能详细设计
在项目工程中创建addPanel.java,作为航班订票界面,在该界面中创建一个表格,以及三个按钮,分别为“订票”,“候补乘客”,“返回”,在data/ program-store文件夹中创建book-list.txt,用于存储订单,创建candidata-list.txt文件,用于存储候补乘客。表格中显示当前所有航班,点击某一条信息,点击“订票”,输入乘客信息,数量,如果剩余票充足,则将当前的航班号,乘客信息,数量写入到book-list.txt文件中,并修改light.txt文件的该航班剩余票数。若余票不足,则提示是否列入候该航线的候补名单中。选中某一条航班,点击“候补乘客”,则会读取candidate-list.txt文件,并弹出新窗口以表格的形式显示。点击“返回”,则返回到主界面,点击“搜索”,则会根据输入的关键字和日期与flight.txt中的航班信息进行匹配,将所有匹配成功的信息存入队列中,清空表格,之后将队列中的信息输出在表格中,并以时间先后排序。
图3 航班管理模块流程图
4.订单管理模块界面及功能详细设计
在项目工程中创建deletePanel.java,作为航班退票界面,在该界面中创建一个表格,以及三个按钮,分别为“退票”,“候补乘客”,“返回”,以及一个文本框和“搜索”按钮,表格中显示当前所有订单,选中某一条订单,点击“退票”,则会根据航班号与book-list.txt文件里航班号匹配,匹配成功则删除该订单,并重新统计该航班剩余票量,并将剩余票量写入到flight.txt中。之后检查是否有候补乘客,如果有则将剩余票给与候补乘客,以排队顺序优先,并删除其在候补名单candidate-list的信息。
图4 订单模块流程图
四、测试分析
1.主程序界面及功能测试分析
首先对主页测试分析,如图 5所示:
图5 航空订票系统主界面
窗口可以正常出现,图片的点击事件可以正常响应,当点击航班检索时,页面正常切换到航班检索界面,如图6。
图6 航班检索界面
点击返回可以正常返回主页,并没有出现页面卡死或无法切换的情况,由此可以说明主界面没有问题。
其功能实现的主要代码是:
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getSource().equals(icon_search)||e.getSource().equals(icon_search_text)) {
if(searchPanel_on)
{
SearchPanel searchPanel=new SearchPanel();
MainPanel.jPanel.add(searchPanel,"searchPanel");
searchPanel_on=false;
}
MainPanel.cardLayout.show(MainPanel.jPanel,"searchPanel");
}else
if(e.getSource().equals(icon_add)||e.getSource().equals(icon_add_text)) {
if(addPanel_on)
{
AddPanel addPanel=new AddPanel();
MainPanel.jPanel.add(addPanel,"addPanel");
addPanel_on=false;
}
MainPanel.cardLayout.show(MainPanel.jPanel,"addPanel");
}else
if(e.getSource().equals(icon_delete)||e.getSource().equals(icon_delete_text)) {
if(refundPanel_on)
{
RefundPanel refundPanel=new RefundPanel();
MainPanel.jPanel.add(refundPanel,"refundPanel");
refundPanel_on=false;
}
MainPanel.cardLayout.show(MainPanel.jPanel,"refundPanel");
}
}
2.航班管理模块功能测试分析
下面进行航班检索模块的测试:
点击航班检索,页面将切换到航班检索界面,如图7所示:
图7 航班检索界面
点击添加航班,将弹出添加界面,如图8所示,输入所有信息后点击确定即可添加,表格自动刷新。
图8 航班添加窗口
点击删除航班,将弹出提示是否删除,点击确定后,即可删除该航班。
在搜索框中输入关键信息,点击“搜索”即可查询,查询到的结果显示在表格中。
图9 航班查询功能
其功能实现的主要代码是:
public void delete() {
int count=table.getSelectedRow();
if(count>=0) {
String getname= table.getValueAt(count, 0).toString();
FileOperations.delete_txt_line("src/data/storage/flight.txt", getname, false);
refresh_table();
}else {
JOptionPane.showMessageDialog(null, "请选中列表中的某一行!!", "提示", 0);
}
}
public void search_table() {
FileOperations.search_txt_line("src/data/storage/flight.txt",search_bar.getText(),Constant.queue,0);
table_mode =new DefaultTableModel();
table_mode.setColumnIdentifiers(tab_title);
while(Constant.queue.size()>0) {
table_mode.addRow(Constant.queue.poll());
}
table.setModel(table_mode);
}
public void actionPerformed(ActionEvent e) {
String get_data="\n"+flight_number.getText()+"/"
+starting_station.getText()+"/"+terminal_station.getText()+"/"+departure_time.getText() +"/"+arrival_time.getText()+"/"+crew_quota.getText()+"/"+total_votes.getText()+"/"+total_votes.getText();
FileOperations.write_txt("src/data/storage/flight.txt",get_data);
refresh_table();
add_window_JFrame.dispose();
}
3 .机票预定模块功能测试分析
下面进行机票预订模块的测试:
点击机票预订,页面将切换到机票预订界面,如图9所示:
图9 机票预定模块界面
选中某一航班,点击“订票”,页面将弹出机票预订窗口,如图10所示,输入信息,点击确定即可订票。
图10 机票预定窗口
选中某一航班,点击“订单”,页面将弹出当前航班订单窗口,如图11所示,显示当前成功购票和候补购票名单。
图11 航班当前订单窗口
在右上角的文本框中输入起始站,终点站,出发日期,点击“搜索”,即可显示满足条件的航班,如图12所示。
图12 航班筛选功能
其功能实现的主要代码是:
public void search_table() {
FileOperations.filter_txt("src/data/storage/flight.txt",starting_station_textField.getText(),terminal_station_textField.getText(),departure_time_textField.getText(),Constant.queue);
table_mode =new DefaultTableModel();
table_mode.setColumnIdentifiers(tab_title);
while(Constant.queue.size()>0) {
table_mode.addRow(Constant.queue.poll());
}
table.setModel(table_mode);
}
public void delete() {
int count=table.getSelectedRow();
if(count>=0) {
String getname= table.getValueAt(count, 0).toString();
FileOperations.delete_txt_line("src/data/storage/flight.txt", getname, false);
refresh_table();
}else {
JOptionPane.showMessageDialog(null, " 请选中列表中的某一行!!", "提示", 0);}}
4.订单管理模块功能测试分析
下面进行订单管理模块的测试:
点击订单管理,页面将切换到订单管理界面,如图13所示:
图13 订单管理模块界面
选中某一航班,点击“退票”,将弹出退票界面,如图14所示,输入退票数量,点击“确定”,即可完成退票。
图14 订单管理模块
选中某一航班,点击“详情”,将弹出该航班详细信息界面,如图15所示。
图15 航班详情界面
在搜索框中输入关键信息,点击搜索即可显示搜索到的订单,具体界面上文已有所提到,这里不多赘述。
其功能实现的主要代码是:
public static void delete_line(JTable table) {
int count=table.getSelectedRow();
if(count>=0) {
if(JOptionPane.showConfirmDialog(null, "是否删除当前所选候补信息", "注意", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) {
FileOperations.delete_txt_line("src/data/storage/alternate.txt",table.getValueAt(count, 0).toString(),true);
JOptionPane.showMessageDialog(null, " 删除成功!!", "提示", 1);
refresh_table("src/data/storage/alternate.txt", table_mode2, table2, order_tab_title2,true);
}
}else {
JOptionPane.showMessageDialog(null, " 请选中列表中的某一行!!", "提示", 1);
}
}
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(refund_button)) {//退票
OrderWindow.refund_window(table_mode1,table1,order_tab_title1);
}else if(e.getSource().equals(details_button1)) {//详情1
OrderWindow.details_window(table1);
}else if(e.getSource().equals(booking_button)){
booking();
}else if(e.getSource().equals(delete_button)) {//删除
delete_line(table2);
}else if(e.getSource().equals(refresh_button1)||e.getSource().equals(refresh_button2)) {//刷新
refresh_table("src/data/storage/booking.txt", table_mode1, table1, order_tab_title1,true);
refresh_table("src/data/storage/alternate.txt", table_mode2, table2, order_tab_title2,true);
}else if(e.getSource().equals(return_button1)||e.getSource().equals(return_button2)) {//返回
MainPanel.cardLayout.show(MainPanel.jPanel,"featuresPanel");
}else if(e.getSource().equals(search_button1)) {
FileOperations.search_txt_line("src/data/storage/booking.txt",search_bar1.getText(),Constant.queue,0);
refresh_table("src/data/storage/booking.txt", table_mode1, table1, order_tab_title1,false);
}else if(e.getSource().equals(search_button2)) {
refresh_table("src/data/storage/alternate.txt", table_mode2, table2, order_tab_title2,false);
}
}
下载链接:数据结构课设之航空订票系统(Java).zip-Java文档类资源-CSDN下载