航班管理系统实验报告

实验报告

一、开发环境

程序语言:Java
开发环境:IntelliJ IDEA

二、需求分析

(1)航班基本信息管理
航班基本信息管理包括增加新航班,删除航班,修改航班编号,修改航班可售票数,修改航班所属航空公司,查询航班信息并按照机票价格、飞行时间、剩余数量排序

(2) 航班动态管理
发布航班延误、航班取消的信息;当航班发⽣延误和取消时,通知已经购买该航班机票的乘客, 并推荐与该航班具有相同起⻜降落地点且未延误的最近航班。

(3) 航班推荐
根据机票价格、飞行时间、余票数量综合考虑推荐出的最佳航班

image-20200406105326993

(4) 票务管理
客户可以选择申请购票或者将已经买好的票退掉

(5)预约抢票
在剩余机票不足的情况下,⼀旦该航班发⽣退票,⾃动购买,如有多⼈预约,按照预约时间顺序按照先到先得原则分配

未命名文件 (1)

三、 实验方案及实现(数据结构选择、算法设计、关键代码说明等)

(1)类的设计及实现

  1. 航班类:包含航班编号,用于区分不同的航班; 航班公司;可售机票数;经停地点列表
class Flight{  
    private String flightNo; // 航班编号
    private String flightCompany; // 航班公司
    private int leftTickets; // 可售票数
    private List<StopLocation> stopList; // 经停地点
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2FE5svU-1586164280307)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200406101527853.png)]
2) 经停地点类:包含经停城市; 航班公司;可售机票数;经停地点列表

class StopLocation {
    private String city; // 经停城市
    private LocalDateTime time; // 时间
    private double ticketPrice; // 从起始点到当地的价格
    private final static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 时间格式
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpGNt9HR-1586164280309)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200406102002090.png)]

  1. 客户信息类:包含乘客编号,用于区分不同的乘客; 乘客所在的航班编号;航班起飞时间;航班出发城市;航班终点城市;航班的机票价格
class Client {
    private String clientNo; // 乘客ID
    private String flightNo; // 航班号
    private LocalDateTime time; // 航班时间
    private String departureCity; //起飞城市
    private String arrivalCity; //到达城市
    private double ticketPrice; // 票价
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F8yeBjuD-1586164280310)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200406102128313.png)]

(2)数据结构的设计及实现

  1. 哈希表节点:实现了Map中的Entry接口,包括键和值两个属性
public class Node<K,V> implements Map.Entry<K,V> {
    private K key; //键
    private V value; //值
}
  1. 哈希表:实现了Map接口类,包括哈希表初始尺寸,哈希表中现有节点数量,负载因子以及哈希头链表,当哈希表中现有节点数量number > 初始尺寸*重载因子size * loadFactor时,对哈希表进行扩容,将size扩充为size * 2
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjJ5YLnO-1586164280311)(C:\Users\Administrator\Desktop\未命名文件.png)]
public class MyHashMap<K,V> implements Map<K,V> {
    private int size = 16; //初始尺寸
    private int number = 0; //节点数量
    private double loadFactor = 0.75; //负载因子
    private ArrayList<LinkedList<Node<K, V>>> arrayHead = new ArrayList<>(size); //哈希头链表
}
  1. 排序:采用堆排序的方法实现
//构建大顶堆
private void adjustHeap(int[] data, int i, int len) {
	int temp, j;
	temp = data[i];
	for (j = 2 * i; j < len; j *= 2) { //沿关键字较大的孩子结点向下筛选
	   	if (data[j] < data[j + 1]) {
	       	++j; //j为关键字中较大记录的下标
	   	}
	   	if (temp >= data[j]) {
	       	break;
	   	}
	   	data[i] = data[j];
	   	i = j;
	}
	data[i] = temp;
}

//堆排序
private void heapSort(int[] data) {
	 int i;
	 for (i = data.length / 2 - 1; i >= 0; i--) { //构建大顶堆
	     adjustHeap(data, i, data.length - 1);
	 }
	 for (i = data.length - 1; i >= 0; i--) { //交换堆顶对象和当前未经排序子序列最后一个对象
	     int temp = data[0];
	     data[0] = data[i];
	     data[i] = temp;
	     adjustHeap(data, 0, i - 1); //重新调整为大顶堆
	 }
}

(3)类之间的关系

Flight类和StopLocation类为组合关系,和Client类为依赖关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFas4bHF-1586164280313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200406102929080.png)]

MyHashMap类和Node类为组合关系,Node类实现了Entry类的接口,MyHashMap类实现了Map类的接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVcNL1jh-1586164280314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200406104015292.png)]

(4)航班信息的存储
将航班信息和客户信息分别存入flight.xmlclien.xml文件中, 由SAXReader进行文件读取,通过parseXML()进行文件的解析, 文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>

<flights>
	<flight flightNo="MU5293">
		<flightCompany>东方航空</flightCompany>
		<stoplocation stopNo="1">
			<city>温州</city>
			<time>2019-11-05 15:40:00</time>
			<ticketPrice>0.0</ticketPrice>
		</stoplocation>
		<stoplocation stopNo="2">
			<city>北京</city>
			<time>2019-11-05 21:40:00</time>
			<ticketPrice>1381</ticketPrice>
		</stoplocation>
		<leftTickets>17</leftTickets>
	</flight>
</flights>

(5)航班动态管理

当乘客发出购票申请的时候,判断是否有余票,有余票则购买此航班,没有余票则加入预约抢票名单中

未命名文件 (2)

当乘客退票时,查询预约抢票名单中是否含有该航班,有该航班则使最先发出购票申请的人得到票

未命名文件 (3)

(6)推荐航班
根据出发城市和终点城市筛选出可能的航班列表,并存入List中。影响结果的三个因素分别是机票价格、飞行时间、余票数量,三个因素的相对权重为:

价格时间余票数量
价格10.52
时间214
余票数量0.50.251

为了保证三个因素权重的合理性,需要引进一致性指标,进行一致性检验。为了消除数值对于计算带来的影响,对机票价格、飞行时间、余票数量进行归一化处理,然后计算每个航班的相对权重,选择出推荐值最大航班即为推荐最优航班

private List<Double> calculateWeight() {
        Double[][] matrix=new Double[3][3];
        Double[] column=new Double[3];
        Double[][] matrixColumn= new Double[3][3];
        for(int i=0;i<3;i++){
            matrix[i][i]=1.0;
        }
        matrix[0][1]=0.5;
        matrix[0][2]=2d;
        matrix[1][2]=4d;
        //填写矩阵剩余项
        for(int i=2;i>=0;i--){
            for(int j=2;j>=0;j--){
                matrix[i][j]=1/matrix[j][i];
            }
        }
        for(int j=0;j<3;j++){
            for(int i=0;i<3;i++){
                if(column[j]!=null){
                    column[j]=column[j]+matrix[i][j];
                }else{
                    column[j]=matrix[i][j];
                }
            }
        }
        //矩阵归一化
        for(int j=0;j<3;j++){
            for(int i=0;i<3;i++){
                matrixColumn[i][j]=matrix[i][j]/column[j];
            }
        }
        //获得行数组
        Double[] line=new Double[3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(line[i]!=null){
                    line[i]=line[i]+matrixColumn[i][j];
                }else{
                    line[i]=matrixColumn[i][j];
                }
            }
        }
        //行归一化获得特征向量
        Double[] w=new Double[3];
        Double sum=0.0;
        for(int i=0;i<3;i++){
            sum=sum+line[i];
        }
        for(int i=0;i<3;i++){
            w[i]=line[i]/sum;                    //特征向量
        }
        Double[] bw=new Double[3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(bw[i]!=null){
                    bw[i]=bw[i]+matrix[i][j]*w[j];
                }else{
                    bw[i]=matrix[i][j]*w[j];
                }
            }
        }
        double sumR=0.0;                        //最大特征根R
        for(int i=0;i<3;i++){
            sumR=sumR+bw[i]/(3*w[i]);
        }
        return new ArrayList<>(Arrays.asList(w).subList(0, 3));
    }

(7)Hash函数
使用String哈希函数:

int hashCode(byte[] value) {
    int hash = 0;
    int length = value.length >> 1;
    for (int i = 0; i < length; i++) {
        hash = 31 * hash + getChar(value, i);
    }
    return hash;
}

测试部分数据结果为:

索引:
0有2个 1有4个 2有2个 3有2个 4有2个 5有2个 6有4个 7有5个 8有2个 10有1个 11有3个 12有3个 13有2个 14有3个 15有4个 16有1个 17有3个 18有1个 19有2个 21有2个 22有1个 24有2个 25有3个 26有1个 27有3个 29有2个 30有3个 31有2个 33有3个 37有1个 39有1个 40有1个 43有1个 44有2个 47有2个 49有2个 51有2个 54有2个 55有1个 56有1个 57有2个 60有1个 61有1个 63有1个 65有1个 66有2个 71有1个 73有1个 75有1个 82有1个 84有1个 85有1个 86有1个 88有1个 89有1个 94有2个 95有2个 97有1个 103有1个 108有1个 110有1个 111有2个 113有1个 118有1个 125有2个
查找成功次数为98

使用加法Hash,即把输入元素加起来获得结果:

int additiveHash(String key)
{
	int hash, i;
	for (hash = key.length(), i = 0; i < key.length(); i++)
	  	hash += key.charAt(i);
	return hash;
}

测试部分数据结果为:

索引:
0有1个 1有1个 2有1个 3有2个 4有2个 5有1个 6有2个 7有2个 9有2个 10有2个 11有4个 12有3个 15有1个 16有1个 17有1个 18有1个 19有1个 20有1个 21有4个 22有1个 23有3个 24有1个 25有3个 26有1个 27有4个 29有3个 30有1个 31有2个 33有1个 35有3个 37有1个 42有1个 43有1个 44有1个 46有1个 48有2个 50有2个 51有3个 52有4个 53有4个 54有1个 55有2个 56有1个 57有1个 58有2个 60有1个 61有1个 63有1个 84有1个 85有1个 86有2个 87有2个 89有1个 90有1个 91有2个 93有3个 94有1个 95有1个 97有1个 98有1个 99有4个 106有1个 107有1个 108有4个 109有1个 110有1个 111有4个 112有1个 113有1个 115有4个 116有3个 117有2个 118有4个 119有2个 121有1个 122有1个 124有1个 125有1个 127有1个
查找成功次数累加为96

使用位运算Hash,即通过利用移位和异或充分的混合输入元素

int rotatingHash(String key)
    {
        int hash, i;
        for (hash=key.length(), i=0; i<key.length(); ++i)
            hash = (hash<<4)^(hash>>28)^key.charAt(i);
        return hash;
    }

测试部分数据结果为:

索引:
0有5个 1有3个 2有1个 3有8个 4有2个 5有7个 6有3个 7有6个 8有1个 9有3个 16有3个 17有2个 18有1个 19有4个 20有1个 21有2个 22有3个 23有1个 25有2个 32有3个 33有1个 34有3个 35有4个 36有1个 37有4个 38有3个 39有1个 41有2个 48有3个 49有2个 50有3个 51有1个 52有1个 54有1个 55有2个 56有1个 57有1个 64有2个 69有3个 71有2个 80有2个 81有1个 83有1个 85有1个 89有1个 98有1个 99有1个 101有1个 105有2个 115有1个 118有1个 120有1个
查找成功次数累加为93

使用乘法Hash,利用乘法的不相关性得到Hash值

int FNVHash1(String key)
{
    final int p = 16777619;
    int hash = (int)2166136261L;
    for(int i=0;i<key.length();i++)
        hash = (hash ^ key.charAt(i)) * p;
    hash += hash << 13;
    hash ^= hash >> 7;
    hash += hash << 3;
    hash ^= hash >> 17;
    hash += hash << 5;
    return hash ;
}

测试部分数据结果为:

索引:
0有5个 1有5个 2有2个 3有2个 4有2个 5有5个 6有1个 7有5个 8有3个 10有2个 11有1个 12有1个 13有3个 14有1个 15有2个 16有2个 17有3个 18有3个 19有3个 20有1个 21有1个 22有1个 23有1个 24有3个 26有2个 28有3个 29有1个 30有1个 32有1个 35有1个 36有2个 37有2个 40有1个 42有1个 43有2个 44有1个 45有2个 47有2个 48有4个 49有2个 51有1个 52有1个 54有2个 55有1个 58有1个 60有1个 62有2个 63有1个 68有2个 69有1个 71有1个 80有1个 81有1个 82有1个 83有2个 84有1个 88有1个 90有1个 96有1个 99有1个 100有2个 101有1个 104有1个 106有1个 109有1个 111有3个 112有2个 113有1个 119有1个
查找成功次数累加为86

所以,根据测试结果选择乘法哈希函数作为哈希函数

四、 测试结果

五、 总结

包括对程序进行分析、评价运行效果,总结遇到的问题及解决办法等。

六、 程序清单

类名清单:

  1. Flight 航班信息类
  2. Client 乘客信息类
  3. StopLocation 航班经停地点类
  4. Node 哈希表节点类
  5. MyHashMap 自定义哈希类
  6. FlightService 航班基础功能接口类
  7. FlightService 航班基础功能类 实现增删改查基本功能
  8. ReadFile 读取文件
  9. ChooseBestFlight 根据价格,时间,余票数量三个因素推荐最优航班
  10. Sort 推排序
  11. Recommend 根据出发城市和终点城市查询航班并排序
OOP(机试)[具体要求在压缩文档中给出] 项目名称: Air Infomation System 基于控制台的航班信息系统,简称AIS 具体要求如下: (1)显示航班信息系统主菜单,如图-1所示,包括: 1)列出所有航班 2)按起飞时间查询 3)按目的地查询 4)删除航班 5)更新航班 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 航班信息实体类(AirInfo) 航班编号(id) 航班号(flight_number) 目的地(destination) 起飞日期(flight_date) 航班信息管理类AirInfoManager类 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 6.创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 7.创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询 的方法、按目的地查询的方法、删除航班的方法、更新航班的方法、退出系统的方法。 8.创建TestAirInfo类,启动和运行系统。 9.航班的信息用ArrayList(或数组)保存。 10.要求代码规范,命名正确。
数学与计算机学院 课程设计说明书 课 程 名 称: 软件工程与数据库课程设计 课 程 代 码: 题 目: 民航售票系统 年级/专业/班: 学 生 姓 名: 学   号: 开 始 时 间: 2012 年 6 月 5 日 完 成 时 间: 2012 年 6 月 20 日 课程设计成绩: "学习态度及"技术水平与实 "创新(5 " 说明书(计算书、图纸 "总 " "平时成绩("际能力(20) ") "、分析报告)撰写质量("分(100" "30) " " "45) ") " " " " " " " 指导教师签名: 年 月 日 摘 要 随着计算机的普及,计算机应用已深入到人类社会的各个领域,计算机应用早已不限于 科学计算,而更多地应用在信息处理方面。计算机可以存储的数据对象不再是单纯的数 值,而扩展到了字符、声音、图像、表格等各种各样的信息。对于信息的处理也不再是 单纯的计算,而是一些如信息存储、信息检索等非数值的计算。那么,现实世界的各种 各样的数据信息怎样才能够存储到计算机的内存中,对存入计算机的数据信息怎样进行 科学处理,这涉及计算机科学的信息表示和数据库的设计问题。数据库设计的目标是为 用户和各种应用系统提供一个信息基础设施和高效的运行坏境,按照规范化设计的方法 ,设计的步骤一般是:需求分析、概念结构设计、逻辑结构设计、物理结构设计、编码 、反复调试得到正确的结果。 关键词: 数据模型;计算机;数据库设计 目 录 引 言 1 1 需求分析 2 1.1系统分析 2 1.2用户需求 2 2 概要设计 2 2.1系统流程图 2 2.2系统功能模块设计 3 2.3系统总体设计 4 3 数据库设计 4 3.1概念模型设计 4 3.2逻辑结构设计 7 3.3物理结构设计 8 4 程序模块设计 10 4.1开发环境及数据库连接 10 4.2 登录模块设计 10 4.3航空公司模块设计 10 4.4普通用户模块设计 11 4.5经常用户模块设计 12 5 系统测试 13 5.1测试环境 13 5.2测试用例及结果 13 致 谢 24 参考文献 25 引 言 随着计算机的普及,人们每天使用计算机中的各种软件,然而许多软件都要结合数据 库才能正确和方便储取数据,数据库能保证数据的正确性、安全性、完整性,所以各种 软件离不开数据库,数据库在计算机领域中占有很大的地位,正因为数据库如此重要, 所以对设计数据库时要正确、效率高。 而软件工程与数据库课程设计的目的和意义就是为了使我们熟练地掌握软件工程中数 据库设计的方法,并用它来解决实际生活中的问题,进一步理解和掌握课堂上所学的各 种数据库设计所使用的概念模型和数据库设计的流程及通用方法,掌握软件设计的基本 内容和设计方法,并培养进行规范化软件设计的能力,掌握使用各种计算机资料和有关 参考资料,提高进行程序设计的基本能力。本次课程设计的题目是送水管理系统,要求 自来水公司或者水站对其客户信息进行详细的管理,对客户的使用情况进行详细记录, 并实现客户信息录入、查询、修改、删除的基本功能。我所采用的设计工具为VS2010和 SQL2008。 1 需求分析 本系统是民航管理系统,此系统主要分为机场、航空公司和客户三方的服务。航空公司 提供航线和飞机的资料,机场则对在本机场起飞和降落的航班和机票进行管理,而客户 能得到的服务应该有航班线路和剩余票数的查询,以及网上订票等功能。客户又可以分 为两类,一类是普通客户,对于普通客户只有普通的查询功能和订票功能,没有相应的 机票优惠,另一种是经常旅客,需要办理注册手续,但增加了里程积分功能和积分优惠 政策。机场还要有紧急应对措施,在航班出现延误时,要发送相应的信息。 1.1系统分析 本系统分为三类用户、航空公司、普通用户、经常用户,系统功能的基本要求: 1) 每个航班信息的输入。 2) 每个航班的坐位信息的输入。 3) 当旅客进行机票预定时,输入旅客基本信息,系统为旅客安排航班,打印取票通知 和帐单。 4) 旅客在飞机起飞前一天凭取票通知交款取票。 5) 旅客能够退订机票。 6) 能够查询每个航班的预定情况、计算航班的满座率。 1.2用户需求 本系统分为三类用户:航空公司需要软件能够实现航班信息录入、座位信息录入、航班 信息删除等,普通用户能够订票、退票、取票、查询航班信息、余票查询、注册成为经 常用户,经常用户能够订票、退票、取票、余票查询查询航班信息、使用积分打折、 查询积分等功能 2 概要设计 2.1系统流程图 图2-1 系统流程图 2.2系统功能模块设计 系统主要功能如下图2-2所示: 图2-2 系统功能模块图 2.3系统总体设计系统使用登录区分三种用户、对登录成功的用户实现不同的权限和功能和对数据库的 存取控制,当普用户登录后只能实现订票、退票、取票、查
# OOP(机试) 本程序总结文章:http://blog.qiji.tech/?p=10344 - - - ## 程序基本要求 一、项目名称: Air Infomation Programming 基于控制台的航班信息程序,简称AIP 二、具体要求如下: (1)显示航班信息程序主菜单,如图-1所示,包括: * 1)列出所有航班 * 2)按起飞时间查询 * 3)按目的地查询 * 4)删除航班 * 5)更新航班 * 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 * 航班信息实体类(AirInfo) * 航班编号(id) * 航班号(flight_number) * 目的地(destination) * 起飞日期(flight_date) * 航班信息管理类AirInfoManager类 * 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 1. 创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 1. 创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询的方法、按目的地查询的方法、删除航班的方法、更新航班的方法、退出程序的方法。 2. 创建TestAirInfo类,启动和运行程序。 3. 航班的信息用ArrayList(或数组)保存。 4. 要求代码规范,命名正确。 - - -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值