Java版飛機訂票系統


關注微信公眾號:Worldhello 回復 飛機訂票系統 可獲得系統源代碼並可加群討論交流

 

數據結構課程設計題目:

         【飛機訂票系統】

           通過此系統可以實現如下功能:

           錄入:可以錄入航班情況(數據存儲在一個數據文件中,數據結構和具體數據自定)

           查詢:可以查詢某個航線的情況(如:輸入航班號,查詢起降時間、起飛抵達城市、航班票價、票價折扣、確定航班是否滿倉)

            訂票:訂票情況可以存在一個數據文件中,結構自己設定,可以訂票,如果該航班已經無票,可以提供相關可選擇航班

            退票:可退票,退票后修改航班數據文件


            基本要求:

             根據以上功能說明,設計航班信息,訂票信息的存儲結構,設計程序完成功能;


設計分析:

        1.作為數據結構課程設計,因為題目限制只能是在原有經典算法的基礎上進行改造。飛機訂票系統,因為涉及到查詢,所以考慮利用圖結構進行存儲。每一個城市作為圖中的一個節點,利用鄰接矩陣結構進行表示圖結構,兩節點之間用定義的航班信息結構體進行表示。如果為NULL 則表示沒有兩城市之間沒有航線。然后輸入兩城市名稱后,可以利用改寫后的迪克斯特拉 或者弗洛伊德算法進行查詢。

        2.然后作為訂票系統,則應該可以預定三十日以內的飛機票。所以我建立三個文件夾,

        flight_record 用來存儲城市間的航班信息;

        month_flight_information 用來存儲三十日內每天的航班信(每日打開軟件會根據flight_record文件夾中的信息進行自動更新)息;        

        booking_record 用來存放訂票記錄;

       3.為方便管理使用,該系統一個登陸界面根據登陸人群不同分為兩個使用界面,分別是用戶界面和管理界面。用戶在注冊的時候,系統會先進行身份證號是否合法驗證和查重,如果已經存在則讓其聯系管理員。如下圖

 

  圖1-登陸界面


 

圖2-注冊界面


  

圖3-管理界面


                                                                                             圖4-用戶界面


        4.為了體現系統的保密性,我對用戶的密碼進行用MD5 算法進行加密,使后台管理人員不能夠得到用戶真正的密碼。另外對用戶的賬戶狀態設定了兩種狀態,可以進行注銷不能使用但不刪除,還可以刪除記錄。


  

圖5-用戶管理界面

        操作演示:

1⃣️根據出發到達城市查詢航班:


2⃣️根據航班號查詢航班信息

3⃣️用戶訂票后在用戶界面查詢到的訂票記錄

4⃣️退票操作

5⃣️退票結果(在管理員界面仍能查到)


6⃣️航班價格修改(使用正則表達式做了過濾)




等。。。。

還有很多操作例如:


 

 

 

 


        航班信息數據結構:

 

public class HangBan {
    public String HangBanHao;     //航班號
    public double price;          //價格
    public int    seatNumber;     //座位數
    public String discount;       //折扣
    public String startTime;      //起飛時間
    public String lendTime;       //到達時間
    public long    timeLength=0;  //飛行時長
    public HangBan(String HangBanHao,double price,int seatNumber,String discount,String startTime,String lendTime){
        this.HangBanHao = HangBanHao;
        this.price = price;
        this.seatNumber = seatNumber;
        this.discount = discount; 
        this.startTime = startTime;
        this.lendTime  = lendTime;
        this.timeLength=Tool.getPlayTime(startTime, lendTime);
        //System.out.println(this.timeLength);
        
    }
    


部分代碼:

 

 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ytu.cx.store;

import ytu.cx.io.FileIOImp;
import ytu.cx.util.Tool;

/**
 *
 * @author changxuan
 */
public class CityNode {
    private String[] mapping;
    private HangBan[][] matrix;
    /**
     * 初始化圖的頂點
     * @param vertexes  頂點數組
     */
    public CityNode(String[] vertexes){
        
        int length = vertexes.length;
        mapping = new String[length];
        matrix = new HangBan[length][length];
        for(int i = 0; i < length; i++){
            //System.out.println(vertexes[i]);
            mapping[i] = vertexes[i];
            for(int j = 0; j < length; j++){          //初始化為NULL
                matrix[i][j]=null;
                
            }
        }
        
    }
    /**
     * 添加具有具有直達航班的邊
     * @param start
     * @param end
     * @param hang_ban 
     */
    public String  addEdge(String start,String end,HangBan hang_ban){
        int x = -1;
        int y = -1;
      //尋找坐標
     
      for(int i = 0; i < mapping.length; i++){
      
          if(x != -1 && y != -1){
              break;
          }
          if(mapping[i].equals(start)){
              x = i;
          
          }
          if(mapping[i].equals(end)){
              y = i;
             
          }
       }
          if (x == -1 || y == -1 || x > mapping.length -1 || y > mapping.length - 1){
              return ("邊的頂點不存在!");
              
          }
       if(matrix[x][y]!=null)
           return "城市間已存在航班,航班號為:"+matrix[x][y].HangBanHao+"請去修改頁面進行修改!";
       matrix[x][y]=hang_ban;
       return "錄入成功!";
        
    }
    /**
     * Dijkstra 算法求得用時最少路線
     * @param start 
     * @param  end
     */
    public String dijkstraTime(String start,String end){
        
        //System.out.println("開始尋路!");
        //System.out.println("起點:"+start+"終點:"+end);
        int length = mapping.length;
        int x = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(start)){
                x = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (x == -1){
            return "未找到起點!";
            //throw new RuntimeException("未找到起點");
            
        }
        int y = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(end)){
                y = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (y == -1){
            return "未找到終點!";
            //throw new RuntimeException("未找到起點");
            
        }
        int[] S = new int[length];                       //S[]
        long[][] distance = new long[length][length];    //存儲權值  即時間
        for(int i=0; i < length; i++){
            for(int j = 0; j <length; j++){
                if(matrix[i][j] != null){
                    distance[i][j]=matrix[i][j].timeLength;
                }
                else
                    distance[i][j]=0;
            }
        }
        int[] path = new int[length];
        //初始化path數組
        for(int i = 0; i < length; i++){
            //如果可達就賦值
            if(matrix[x][i]!=null){
                path[i] = x;
            }else{
                //不可達,賦值前一個頂點下標為 -1
                path[i] = -1;
            }
        }
        //先把起點加入S
        S[x] = 1;
        
            //System.out.println("首先尋找start到到各頂點的最短路徑");
            //首先需要尋找start頂點到各頂點最短的路徑
            long min = Integer.MAX_VALUE;
            int v = 0;
            for(int j=0; j < length; j++){
                
                if(S[j] != 1 && x != j&& distance[x][j] != 0 && distance[x][j]<min){       //當此節點不在S[]中,且和出發點有直達航班 並且航班時間小於
                    min = distance[x][j];        
                    v = j;
                }
            }
            //v 是目前寫到各頂點最短的
            S[v] = 1;
            //修正最短距離distance及最短距離path
            //System.out.println("是否進行了修正");
            for(int j = 0; j < length; j++){
                //1.只修正未找到最短路徑的
                //2.修正后新頂點需要可達
                //3.如果使用新得最短路徑比原有路徑短,或者以前不可達,使用新的最短路徑可達了
                //符合面三點要求的可以修正路徑******************************************************************************if語句判斷條件可能會出錯
                boolean b1= (S[j] != 1 );
                if(b1 && distance[v][j] != 0 && ((min + distance[v][j] < distance[x][j]) || distance[x][j] == 0)){
                    //說明加入了中間頂點之后找到了更短的路徑
                    distance[x][j] = min + distance[v][j];
                    path[j] = v;
                }
            }
        
        //System.out.println("判斷是否到達此處");
        // System.out.println("起點:"+start+"終點:"+end);
        for (int i = 0; i < length; i++){
           
            //System.out.println("起點:"+start+"終點:"+end);
            if(distance[x][i] != 0 && mapping[i].equals(end)){
               
               // System.out.println(mapping[x] + "--->" + mapping[i] + "最短用時:" + distance[x][i]);
                int index = i;
                String timeName="||";
                //System.out.println();
                while (index != -1){
                   // System.out.println(mapping[index]);
                    timeName=timeName+","+mapping[index];
                    int indexs=index;
                   
                    index = path[index];
                    if(index!=-1){
                     String   strTishi="(已晚點,推薦訂購次日航班!)";
                     if(Tool.getPlayTime(matrix[index][indexs].startTime,Tool.getTimes())>0)
                         timeName=timeName+","+matrix[index][indexs].HangBanHao+" 起飛時間:"+matrix[index][indexs].startTime;
                     else 
                         timeName=timeName+","+matrix[index][indexs].HangBanHao+" 起飛時間:"+matrix[index][indexs].startTime+strTishi;
                    }
                }
                String[] timename=timeName.split(",");
                long timehour=distance[x][i]/60;
                long timeMini=distance[x][i]%60;
                String timeStr="用時最短:"+timehour+"時"+timeMini+"分"+"\n路線為:\n";
                for(int j=timename.length-1;j>=0;j--)
                    timeStr=timeStr+" "+timename[j];
                return timeStr;
            }
        }
        return "沒有可推薦路線!";
    }
    public void dijkstraTime1(String start,String end){
        //System.out.println("開始尋路!");
        //System.out.println("起點:"+start+"終點:"+end);
        int length = mapping.length;
        int x = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i] == start){
                x = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (x == -1){
            throw new RuntimeException("未找到起點");
            
        }
        int[] S = new int[length];
        long[][] distance = new long[length][length];
        for(int i=0; i < length; i++){
            for(int j = 0; j <length; j++){
                if(matrix[i][j] != null){
                    distance[i][j]=matrix[i][j].timeLength;
                }
                else
                    distance[i][j]=0;
            }
        }
        int[] path = new int[length];
        //初始化path數組
        for(int i = 0; i < length; i++){
            //如果可達就賦值
            if(matrix[x][i]!=null){
                path[i] = x;
            }else{
                //不可達,賦值前一個頂點下標為 -1
                path[i] = -1;
            }
        }
        //先把起點加入S
        S[x] = 1;
        for(int i = 0; i < length; i++){
            //System.out.println("首先尋找start到到各頂點的最短路徑");
            //首先需要尋找start頂點到各頂點最短的路徑
            long min = Integer.MAX_VALUE;
            int v = 0;
            for(int j=0; j < length; j++){
                //System.out.println("難道是死循環?");
                //S[j]==1 說明已經找到最短的距離
                //下面過濾掉不可達的情況
                if(S[j] != 1 && x != j&& distance[x][j] != 0 && distance[x][j]<min){
                    min = distance[x][j];
                    v = j;
                }
            }
            //v 是目前寫到各頂點最短的
            S[v] = 1;
            //修正最短距離distance及最短距離path
            //System.out.println("是否進行了修正");
            for(int j = 0; j < length; j++){
               
                boolean b1= (S[j] != 1 );
                if(b1 && distance[v][j] != 0 && ((min + distance[v][j] < distance[x][j]) || distance[x][j] == 0)){
                    //說明加入了中間頂點之后找到了更短的路徑
                    distance[x][j] = min + distance[v][j];
                    path[j] = v;
                }
            }
        }
        //System.out.println("判斷是否到達此處");
        // System.out.println("起點:"+start+"終點:"+end);
        for (int i = 0; i < length; i++){
           
            //System.out.println("起點:"+start+"終點:"+end);
            if(distance[x][i] != 0 && mapping[i] == end){
               
               // System.out.println(mapping[x] + "--->" + mapping[i] + "最短用時:" + distance[x][i]);
                int index = i;
                String timeName="||";
                //System.out.println();
                while (index != -1){
                   // System.out.println(mapping[index]);
                    timeName=timeName+","+mapping[index];
                    int indexs=index;
                   
                    index = path[index];
                    if(index!=-1){
                     //System.out.print(matrix[index][indexs].HangBanHao);
                     timeName=timeName+","+matrix[index][indexs].HangBanHao;
                    }
                }
                String[] timename=timeName.split(",");
                String timeStr="用時最短推薦路線為:";
                for(int j=timename.length-1;j>=0;j--)
                    timeStr=timeStr+" "+timename[j];
                System.out.println(timeStr);
                
            }
        }
        System.out.println("沒有可推薦路線!"); 
    }
    /**
     * DijkstraPrice 算法找到費用最少路線
     * @param start
     * @param end
     * @return 
     */
    public String dijkstraPrice(String start,String end){
        //System.out.println("開始尋路!");
        //System.out.println("起點:"+start+"終點:"+end);
        int length = mapping.length;
        int x = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(start)){
                x = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (x == -1){
            return ("未找到起點!");
            
        }
         int y = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(end)){
                y = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (y == -1){
            return ("未找到終點!");
            
        }
        int[] S = new int[length];
        double[][] distance = new double[length][length];
        for(int i=0; i < length; i++){
            for(int j = 0; j <length; j++){
                if(matrix[i][j] != null){
                    distance[i][j]=matrix[i][j].price;
                }
                else
                    distance[i][j]=0;
            }
        }
        int[] path = new int[length];
        //初始化path數組
        for(int i = 0; i < length; i++){
            //如果可達就賦值
            if(matrix[x][i]!=null){
                path[i] = x;
            }else{
                //不可達,賦值前一個頂點下標為 -1
                path[i] = -1;
            }
        }
        //先把起點加入S
        S[x] = 1;
        for(int i = 0; i < length; i++){
            //System.out.println("首先尋找start到到各頂點的最短路徑");
            //首先需要尋找start頂點到各頂點最短的路徑
            double min = Integer.MAX_VALUE;
            int v = 0;
            for(int j=0; j < length; j++){
                //System.out.println("難道是死循環?");
                //S[j]==1 說明已經找到最短的距離
                //下面過濾掉不可達的情況
                if(S[j] != 1 && x != j&& distance[x][j] != 0 && distance[x][j]<min){
                    min = distance[x][j];
                    v = j;
                }
            }
            //v 是目前寫到各頂點最短的
            S[v] = 1;
            //修正最短距離distance及最短距離path
            //System.out.println("是否進行了修正");
            for(int j = 0; j < length; j++){
                //1.只修正未找到最短路徑的
                //2.修正后新頂點需要可達
                //3.如果使用心得最短路徑比原有路徑短,或者以前不可達,使用新的最短路徑可達了
                //符合面三點要求的可以修正路徑
                boolean b1= (S[j] != 1 );
                if(b1 && distance[v][j] != 0 && ((min + distance[v][j] < distance[x][j]) || distance[x][j] == 0)){
                    //說明加入了中間頂點之后找到了更短的路徑
                    distance[x][j] = min + distance[v][j];
                    path[j] = v;
                }
            }
        }
        //System.out.println("判斷是否到達此處");
        // System.out.println("起點:"+start+"終點:"+end);
        for (int i = 0; i < length; i++){
           
            //System.out.println("起點:"+start+"終點:"+end);
            if(distance[x][i] != 0 && mapping[i].equals(end)){
               
               // System.out.println(mapping[x] + "--->" + mapping[i] + "費用最少:" + distance[x][i]);
                int index = i;
                String feeName="||";
                System.out.println();
                while (index != -1){
                   // System.out.println(mapping[index]);
                    feeName=feeName+","+mapping[index];
                    int indexs=index;
                   
                    index = path[index];
                    if(index!=-1){
                      String   strTishi="(已晚點,推薦訂購次日航班!)";
                     //System.out.print(matrix[index][indexs].HangBanHao);
                     if(Tool.getPlayTime(matrix[index][indexs].startTime,Tool.getTimes())>0)
                         feeName=feeName+","+matrix[index][indexs].HangBanHao+" 起飛時間:"+matrix[index][indexs].startTime;
                     else 
                         feeName=feeName+","+matrix[index][indexs].HangBanHao+" 起飛時間:"+matrix[index][indexs].startTime+strTishi;
                    }
                }
                String[] feename=feeName.split(",");
                String feeStr="費用最少:"+distance[x][i]+"¥\n路線為:\n";
                for(int j=feename.length-1;j>=0;j--)
                    feeStr=feeStr+" "+feename[j];
                return feeStr;
            }
        }
        return "無費用最少推薦路線!";
    }
    public void dijkstraPrice1(String start,String end){
        //System.out.println("開始尋路!");
        //System.out.println("起點:"+start+"終點:"+end);
        int length = mapping.length;
        int x = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i] == start){
                x = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (x == -1){
            throw new RuntimeException("未找到起點");
            
        }
        int[] S = new int[length];
        double[][] distance = new double[length][length];
        for(int i=0; i < length; i++){
            for(int j = 0; j <length; j++){
                if(matrix[i][j] != null){
                    distance[i][j]=matrix[i][j].price;
                }
                else
                    distance[i][j]=0;
            }
        }
        int[] path = new int[length];
        //初始化path數組
        for(int i = 0; i < length; i++){
            //如果可達就賦值
            if(matrix[x][i]!=null){
                path[i] = x;
            }else{
                //不可達,賦值前一個頂點下標為 -1
                path[i] = -1;
            }
        }
        //先把起點加入S
        S[x] = 1;
        for(int i = 0; i < length; i++){
            //System.out.println("首先尋找start到到各頂點的最短路徑");
            //首先需要尋找start頂點到各頂點最短的路徑
            double min = Integer.MAX_VALUE;
            int v = 0;
            for(int j=0; j < length; j++){
                //System.out.println("難道是死循環?");
                //S[j]==1 說明已經找到最短的距離
                //下面過濾掉不可達的情況
                if(S[j] != 1 && x != j&& distance[x][j] != 0 && distance[x][j]<min){
                    min = distance[x][j];
                    v = j;
                }
            }
            //v 是目前寫到各頂點最短的
            S[v] = 1;
            //修正最短距離distance及最短距離path
            //System.out.println("是否進行了修正");
            for(int j = 0; j < length; j++){
                //1.只修正未找到最短路徑的
                //2.修正后新頂點需要可達
                //3.如果使用心得最短路徑比原有路徑短,或者以前不可達,使用新的最短路徑可達了
                //符合面三點要求的可以修正路徑
                boolean b1= (S[j] != 1 );
                if(b1 && distance[v][j] != 0 && ((min + distance[v][j] < distance[x][j]) || distance[x][j] == 0)){
                    //說明加入了中間頂點之后找到了更短的路徑
                    distance[x][j] = min + distance[v][j];
                    path[j] = v;
                }
            }
        }
        //System.
        for (int i = 0; i < length; i++){
           
          
            if(distance[x][i] != 0 && mapping[i] == end){
               
                System.out.println(mapping[x] + "--->" + mapping[i] + "費用最少:" + distance[x][i]);
                int index = i;
                String feeName="||";
                System.out.println();
                while (index != -1){
                   // System.out.println(mapping[index]);
                    feeName=feeName+","+mapping[index];
                    int indexs=index;
                   
                    index = path[index];
                    if(index!=-1){
                     //System.out.print(matrix[index][indexs].HangBanHao);
                     feeName=feeName+","+matrix[index][indexs].HangBanHao;
                    }
                }
                String[] feename=feeName.split(",");
                String feeStr="費用最少推薦路線為:";
                for(int j=feename.length-1;j>=0;j--)
                    feeStr=feeStr+" "+feename[j];
                System.out.println(feeStr);
            }
        }
    }
    /**
     * 判斷兩城市之間是否存在直達航班
     * @param start
     * @param end
     * @return 
     */
    public String judgeThrough(String start,String end){
        int length = mapping.length;
        int x = -1;
        //判斷兩點是否存在
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(start)){
                x = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (x == -1){
            return ("未找到起點!");
            
        }
         int y = -1;
        for(int i = 0; i < length; i++){
            if(mapping[i].equals(end)){
                y = i;                    //找到起始點的下標
                //System.out.println("起始點坐標為:"+i);
                break;
            }
        }
        if (y == -1){
            return ("未找到終點!");
            
        }
        if(matrix[x][y]!=null){
            String tishi="已晚點,請選擇其他航班!";
            if(Tool.getPlayTime(matrix[x][y].startTime,Tool.getTimes())>0)
            return "直達航班為:"+matrix[x][y].HangBanHao+"["+matrix[x][y].startTime+"\n";
             else
            return "直達航班為:"+matrix[x][y].HangBanHao+"["+matrix[x][y].startTime+"]"+tishi+"\n";

        }
       
        
      return "無直達航班!\n";
    }
    /**
     * 查詢航班詳細資料
     * @param hangban
     * @return 
     */
    public  String InquiryHangBan(String hangban){
        String result="航班信息:\n航班號   價格  余量  折扣   起飛時間    到達時間     時長(分鍾)\n";
        int length = mapping.length;
        int i,j;
        for(i = 0; i < length; i++){
            for(j = 0;j < length; j++){
              
                if(matrix[i][j]!=null){
                    if(matrix[i][j].HangBanHao.equals(hangban)){
                        String lines=" | ";
                        result=result+matrix[i][j].HangBanHao+lines+matrix[i][j].price+lines+matrix[i][j].seatNumber+lines
                                +matrix[i][j].discount+lines+matrix[i][j].startTime+lines+matrix[i][j].lendTime+lines+matrix[i][j].timeLength;
                        return result;
                   }
                }
            }
        }
        return "無此航班信息!";
    }
    /**
     * 將訂票后的數據重新存到文件中
     * @param riqi 
     */
    public void storeToFile(String riqi){
        int i,j;
        String str="";
        String lines="-";
        int length = mapping.length;
        for(i=0; i<length;i++){
            for(j=0;j<length;j++){
                if(matrix[i][j]!=null){
                    str=str+matrix[i][j].HangBanHao+lines+matrix[i][j].price+lines+matrix[i][j].seatNumber+lines
                     +matrix[i][j].discount+lines+matrix[i][j].startTime+lines+matrix[i][j].lendTime+lines+mapping[i]+lines+mapping[j]+"\n";
                }
            }
        }
        FileIOImp.write("./month_flight_information/", str, false, riqi);
    }
    /**
     * 深度優先搜索 遍歷節點 找到節點后 將此城市的航班信息打印出來
     * @param hangbanhao
     * @return 
     */
    public String depthFirstTravel(String City){
        String city="";
        Stack stack = new Stack(mapping.length);
        //初始化各頂點的訪問狀態
        int[] visited = new int[mapping.length];
        //從未訪問頂點中選擇一個頂點作為起始頂點
        int unvisited = getUnVisited(visited);
        while(unvisited >= 0){
            //訪問起始頂點 並入棧
            visited[unvisited] = -1;
            stack.push(unvisited);
            //System.out.println(mapping[unvisited]+",");
            if(mapping[unvisited].equals(City)){
                city = cityAllHangban(unvisited);
                return city;
            }
            
            while(!stack.isEmpty()){
                //獲取棧頂元素,不出棧
                int index = stack.peek();
                //遍歷找到未被訪問的節點
                boolean found = false;
                for (int i = 0;i < mapping.length; i++){
                    //不能是自己、未被訪問、可到達
                    if(index != i && visited[i] == 0 && matrix[index][i] != null){
                        //如果找到未被訪問的節點則訪問並入棧
                        visited[i] = 1;
                        stack.push(i);
                        //System.out.println(mapping[i] + ",");
                        if(mapping[i].equals(City)){
                            city = cityAllHangban(i);
                            return city;
                        }
                        found = true;
                        break;
                    }
                }
                //如果未找到 則出棧元素
                if (!found)
                {
                    stack.pop();
                }
                
            }
            unvisited = getUnVisited(visited);
            
        }
        //System.out.println("\n");
        
        return "此城市無航班信息!";
    }
    private int getUnVisited(int[] visited){
        int index = -1;
        for(int i = 0; i <visited.length; i++){
            if(visited[i] == 0){
                index = i;
                break;
            }
        }
        return index;
    }
    private String cityAllHangban(int index){
        int i = 0;
        String result = "";
        for(i = 0; i < mapping.length; i++){
            if(matrix[index][i] != null)
            {
                result = result+"航班號:"+matrix[index][i].HangBanHao+"   目的地:"+mapping[i]+"\n";
            }
        }
        return result;
    }
    /**
     * 訂票函數
     * @param hangban
     * @return 
     */
    public String DingPiao(String hangban){
        int i,j;
        int length = mapping.length;
        for(i = 0; i < length; i++){
            for(j = 0;j < length; j++){
              
                if(matrix[i][j]!=null){
                  
                    if(matrix[i][j].HangBanHao.equals(hangban)){
                        if( matrix[i][j].seatNumber>0){
                             matrix[i][j].seatNumber--;
                             return "訂票成功!";
                        }
                        else
                           return "無票或距起飛時間不到半小時\n,請選擇其他日期或者路線進行訂票!";
                               
                   }
                }
            }
        }
        return "此航班不存在,請核實后再進行訂票!";
    }
}

 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ytu.cx.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import ytu.edu.server.Operation;

 
import java.io.InputStreamReader;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;
/**
 *
 * @author changxuan
 */
public  class Tool {
    /**
      * 某文件中有幾條記錄
      * @param FILEPATH
      * @param filename
      * @return 
      */
     public static int readToLines(String FILEPATH,String filename) {
		int n=0;
		String lineString="";
		try {
			//測試語句System.out.println("文件名"+filename);
			File  file=new File(FILEPATH+filename);
			FileReader fr =new FileReader(file);
			BufferedReader br=new BufferedReader(fr);
			while((lineString=br.readLine())!=null){
				n++;
			}
			fr.close();
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return n;
	}
    
    /**
     * 獲得當前日期
     * @return 
     */
    public static String getTime(){                                       
		Date now=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(now);
		
	}
    public static String getTimes(){                                       
		Date now=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(now);
		
	}
    /**
     * 產生訂單編號
     * @param hangBanHao
     * @return 
     */
    public static String getDingDanID(String hangBanHao){                 
        int countDingDan=readToLines("./booking_record/","booking.txt");
        String count = "0";
        if(countDingDan<10){
            count = count+count+count+countDingDan;
        }else if(countDingDan < 1000){
            count = count+ count +countDingDan;
        }else if(countDingDan < 10000){
            return (hangBanHao+Tool.getTime()+countDingDan);
        }else{
            countDingDan = 0;
            count = count+count+count+countDingDan;
        }
        return (hangBanHao+Tool.getTime()+count);
    }
    
    /**
     * 返回飛行時間差,作為權值
     * @param startTime
     * @param endTime
     * @return 
     */
    public static long getPlayTime(String startTime,String endTime){      
        long timeLen=0;
        DateFormat df = new SimpleDateFormat("HH:mm:ss");
        try{   
        
        Date d1 = df.parse(endTime);   
        Date d2 = df.parse(startTime);   
        long diff = d1.getTime() - d2.getTime();   
        long days = diff / (1000 * 60 );
        timeLen=days;
        }catch (Exception e){
        }
        return timeLen;
    }
     /**
     * 判斷當日文件是否存在,存在則
     * @param file
     * @return 
     */
     public static boolean judeFileExists(File file) {

        if (file.exists()) {
            return true;
        } else {
            try {
                file.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(Operation.class.getName()).log(Level.SEVERE, null, ex);
            }
            return false;
        }
     }
     

  /**
     * 判斷文件夾中是否存在文件
     * @param path
     * @return 
     */
    public static boolean testDir(String path)
  {
    File f = new File(path);
     if (f.exists())
     {
         
            //System.out.println("文件夾中存在文件");
           return true;
       }
       else{
            //System.out.println("文件夾中不存在文件");
            return false;
     }
  }
    /**
     * 獲取n天前的日期
     * @param n
     * @return 
     */
    public static String getBeforetime(int n){
        Date now=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
	return sdf.format(new Date(now.getTime() -  n*24 * 60 * 60 * 1000));
    }
     /**
      * 獲取n天后的日期
      * @param n
      * @return 
      */
    public static String getAftertime(int n){
        Date now=new Date();
        GregorianCalendar gc=new GregorianCalendar(); 
        gc.setTime(new Date()); 
        gc.add(5,n); 
        gc.set(gc.get(Calendar.YEAR),gc.get(Calendar.MONTH),gc.get(Calendar.DATE));
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(gc.getTime());
       // 單純的使用Data類進行加運算時容易出錯
       // return sdf.format(new Date(now.getTime() +  n*24 * 60 * 60 * 1000));
    }
    /**
     * 刪除某路徑下的文件
     * @param fileName 
     */
    public static void deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路徑所對應的文件存在,並且是一個文件,則直接刪除
        if (file.exists() && file.isFile()) {
            //此處應該做異常處理,可是我不想處理
            file.delete();
                //System.out.println("刪除單個文件" + fileName + "成功!");
              
        } else {
            //System.out.println("刪除單個文件失敗:" + fileName + "不存在!");
            System.out.println("程序刪除文件異常!");
        }
    }
    public static void deleteFiles(String fileName){
        File file = new File(fileName);
        // 如果文件路徑所對應的文件存在,並且是一個文件,則直接刪除
        if (file.exists()) {
            //此處應該做異常處理,可是我不想處理
            file.delete();
           System.out.println("刪除單個文件" + fileName + "成功!");
              
        } else {
            //System.out.println("刪除單個文件失敗:" + fileName + "不存在!");
            System.out.println("程序刪除文件異常!");
        }
    }
   public static void recurDelete(File f){
    for(File fi:f.listFiles()){
        if(fi.isDirectory()){
            recurDelete(fi);
        }
        else{
            fi.delete();
        }
    }
    f.delete();
}
    /**
     * 將file1 中的文件拷貝到file2 文件夾中
     * 例      copy("./flight_information/flight_record.txt","./month_flight_information");
     * @param file1
     * @param file2 
     */
    public static void copy(String file1, String file2) {


    System.out.println(file1);
    System.out.println(file2);
    File src=new File(file1);
    File dst=new File(file2);
    if(!dst.exists()){
         dst.mkdirs();
    }
    InputStream in = null;
    OutputStream out = null;
    //System.out.println(file1.substring(file1.lastIndexOf("/"),file1.length()));//獲取單個文件的源文件的名稱
    try {
            in = new BufferedInputStream(new FileInputStream(src), 16 * 1024);
            FileOutputStream f= new FileOutputStream(dst+file1.substring(file1.lastIndexOf("/"),file1.length()));//一定要加上文件名稱
            out = new BufferedOutputStream(f, 16 * 1024);
            byte[] buffer = new byte[16 * 1024];
            int len = 0;
            while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
            }
    } catch (Exception e) {
            e.printStackTrace();
    } finally {
    if (null != in) {
    try {
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (null != out) {
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
}
    /**
     * 將Path路徑下的oldname文件重命名為newname
     * @param Path
     * @param oldname
     * @param newname 
     */
    public static void renameFile(String Path,String oldname,String newname){ 
        if(!oldname.equals(newname)){//新的文件名和以前文件名不同時,才有必要進行重命名 
            File oldfile=new File(Path+"/"+oldname); 
            File newfile=new File(Path+"/"+newname); 
            if(!oldfile.exists()){
                return;//重命名文件不存在
            }
            if(newfile.exists())//若在該目錄下已經有一個文件和新文件名相同,則不允許重命名 
                System.out.println(newname+"已經存在!"); 
            else{ 
                oldfile.renameTo(newfile); 
            } 
        }else{
            System.out.println("新文件名和舊文件名相同...");
        }
    }
    
    /**
     * 檢查文件夾及其路徑是否存在,否,則創建文件
     * @param FILEPATH
     * @param filename 
     */
     public static void checkFile(String FILEPATH,String filename) {
                File  file=new File(FILEPATH+filename);
		
		File fileDir= new File(FILEPATH);
		 file=new File(FILEPATH+filename);
		if(!fileDir.exists()){
			fileDir.mkdirs();
		}
		if(!file.exists()){
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
     /**
      * 判斷身份證號是否符合格式
      * @param idCard
      * @return 
      */
     public static boolean checkID(String idCard){
         /* BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));  
            String idNum=null;  
            try {  
                idNum= consoleReader.readLine();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }
         */ 
            //定義判別用戶身份證號的正則表達式(要么是15位,要么是18位,最后一位可以為字母)  
            Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");  
            //通過Pattern獲得Matcher  
            Matcher idNumMatcher = idNumPattern.matcher(idCard);  
            //判斷用戶輸入是否為身份證號  
            if(idNumMatcher.matches()){  
                return true;
            }else{  
                //如果不是,輸出信息提示用戶  
                return false; 
            }  
     }
      public static boolean compare_date(String DATE1, String DATE2) {
        
        
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date dt1 =df.parse(DATE1);
            Date dt2 =df.parse(DATE2);
            if (dt1.getTime() >= dt2.getTime()) {
               return true;
            } else if(dt1.getTime() < dt2.getTime()) {
               return false;
            }

       } catch (Exception exception) {
           exception.printStackTrace();
        }
        return false;
     }
     
}

 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ytu.edu.server;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import ytu.cx.util.Tool;

/**
 *
 * @author changxuan
 */
public class Operation {
    /*思路:當打開軟件是執行構造函數,然后判斷是否是今天第一天打開軟件,如是則創建以當天日期為命名的
    的txt文件,用來存儲當日訂票數據,並且創建一個文件用來存儲當日航班情況信息。
    
    一個文件用來存儲航班信息,如果判斷是當天第一次打開軟件,則從此文件中讀取信息存儲到圖結構中
    若不是第一次打開此軟件,則從存儲當日航班請況信息文件中讀取數據到圖結構中
    
    */
    public Operation(){
       
        //返回TRUE 說明曾經使用過此軟件,但,是當日第一次打開軟件,在flight_information文件夾中存在 flight_record.txt用來記錄
        //航班信息的文件 
        if( Tool.testDir("./flight_information/flight_record.txt")&&Tool.testDir("./month_flight_information/"+Tool.getBeforetime(1)+".txt")){
            //刪除 記錄昨天全部航班票量的信息文件
            Tool.deleteFile("./month_flight_information/"+Tool.getBeforetime(1)+".txt");
            //增加 以flight_information文件夾中的文件為模板向month_flight_information文件夾中拷貝一份
            Tool.copy("./flight_information/flight_record.txt", "./month_flight_information");
            //然后將拷貝過來的文件重命名為29天后的一個txt文件 
            Tool.renameFile("./month_flight_information", "flight_record.txt", Tool.getAftertime(29)+".txt");
            
        }else if(!Tool.testDir("./flight_information/flight_record.txt")){//返回FALSE 說明是第一次使用軟件
            //創建 flight_information 文件夾及其存儲航班信息的 flight_record.txt 文件 
            Tool.checkFile("./flight_information/", "flight_record.txt");
            //創建30個txt文件用於記錄近三十天內的售票情況
            for(int i=0;i<30;i++){
                Tool.checkFile("./month_flight_information/", Tool.getAftertime(i)+".txt");
            }
            Tool.checkFile("./booking_record/", "booking.txt");
        }else
            System.out.println("表示當日使用過此軟件!");
        
    }
    
   
     
}

   

/*
 public static void judeFileExists(File file) {
17 
18         if (file.exists()) {
19             System.out.println("file exists");
20         } else {
21             System.out.println("file not exists, create it ...");
22             try {
23                 file.createNewFile();
24             } catch (IOException e) {
25                 // TODO Auto-generated catch block
26                 e.printStackTrace();
27             }
28         }
29  }
*/

/*

  // 判斷文件夾是否存在
33     public static void judeDirExists(File file) {
34 
35         if (file.exists()) {
36             if (file.isDirectory()) {
37                 System.out.println("dir exists");
38             } else {
39                 System.out.println("the same name file exists, can not create dir");
40             }
41         } else {
42             System.out.println("dir not exists, create it ...");
43             file.mkdir();
44         }
45 
46     }

*/

 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ytu.cx.util;

import java.security.MessageDigest;

/**
 *
 * @author changxuan
 */
public class MD5password {
     public final static String MD5(String s){
        char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        try{
            byte[] btInput = s.getBytes();
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            mdInst.update(btInput);
            byte[] md=mdInst.digest();
            int j = md.length;
            char str[] = new char[j*2];
            int k=0;
            for(int i=0;i<j;i++){
                byte byte0=md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            
            }
            return new String(str);
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
        
    }
}

 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ytu.cx.store;
import java.util.Arrays;
/**
 *
 * @author changxuan
 */
public class Stack {
    private int size = 0;
    private int[] array;
    /**
     * 構造函數
     */
   /* public Stack(){
        this(10);
    }*/
    public Stack(int init){
        if(init <= 0){
            init = 10;
        }
        array = new int[init];
    }
    /**
     * 入棧
     * @param item 
     */
    public void push (int item){
        if(size == array.length){
            array = Arrays.copyOf(array, size*2);
        }
        array[size++] = item;
    }
    /**
     * 獲取棧頂元素,但是沒有出棧
     * @return 
     */
    public int peek(){
        if (size == 0){
            throw new IndexOutOfBoundsException("棧里已經空!");
            
        }
        return array[size -1];
    }
    /**
     * 出棧,同時獲取棧頂元素
     * @return 
     */
    public int pop(){
        int item = peek();
        size --;         //直接使元素個數剪一,不需要真的清除元素,下次入棧自動覆蓋元素的值
        return item;
    }
    /**
     * 判斷棧是否滿了
     * @return 
     */
    public boolean isFull(){
        return size == array.length;
    }
    /**
     * 棧是否為空
     * @return 
     */
    public boolean isEmpty(){
        return size == 0;
    }
    public int size(){
        return size;
    }
    
}


由於代碼量太大,不全部放出。如有需要可以關注微信公眾號:worldhello(左側掃碼可以關注喲!),根據提示獲取!或者直接聯系微信后台管理人員。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM