飞机订票系统
飛機訂票系統
- 飛機訂票系統
- 一、問題描述和要求
- 二、總體設計
- 三、詳細設計
- 1. 單個航班信息的數據類型
- 2. 所有航班信息采用單鏈表進行存放
- 3. 單個用戶信息的數據類型
- 4. 單個用戶信息的數據類型
- 四、主要操作的算法描述:
- 五、難點問題
- 六、具體實現
- 七、總結
- 八、源碼
飛機訂票系統
這是用java實現的簡單的飛機訂票系統(無窗口),屬于自己創造,有缺點,不吝賜教。 如果需要相關PPT 和 課程設計說明書的可以私信哦!先點個贊唄!嘿嘿!
一、問題描述和要求
任務:通過此系統可以實現如下功能:
錄入:
可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定)
查詢:
可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉);可以輸入起飛抵達城市,查詢飛機航班情況;
訂票:(訂票情況可以存在一個數據文件中,結構自己設定)
可以訂票,如果該航班已經無票,可以提供相關可選擇航班;
退票: 可退票,退票后修改相關數據文件;
客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。
修改航班信息:
當航班信息改變可以修改航班數據文件
要求:
根據以上功能說明,設計航班信息,訂票信息的存儲結構,設計程序完成功能;
二、總體設計
主要使用以下操作實現對飛機航班信息和用戶信息管理:
錄入:(將飛機航班信息記錄到文件中)
查詢:(可以依據航班航號,起飛抵達城市等進行查詢)
訂票:(將用戶信息存入文件中,如果訂票無票的話,可以提供航班)
退票:(根據用戶航班號,刪除對應用戶信息)
修改航班信息:(訪問航班信息文件,找到對應的航班信息進行修改)
總體設計:
三、詳細設計
1. 單個航班信息的數據類型
public class Plane implements Serializable {public String number;public String start_place;public String end_place;public String start_time;public String end_time;public double price;public double discount;String flag;//是否滿倉 0為沒有滿倉 }2. 所有航班信息采用單鏈表進行存放
List<Plane> list_info = new LinkedList<>();3. 單個用戶信息的數據類型
public class User implements Serializable {public String name;public String idcard;public int sum = 1;//訂票數量public String number_user;public String ordernumber; //訂單號4. 單個用戶信息的數據類型
List<User> list_user_info = new LinkedList<>();四、主要操作的算法描述:
該問題分成以下幾個模塊:分別是儲存用戶信息(訂票)和航班信息(錄入)的類,還有一個訂票系統類(里面有項目里面所以涉及的所有信息和一些操作),還有一個是管理員類(錄入信息只有管理員才可以記錄的)由以下幾個類的具體表述:
Plane :存放了航班的基本信息
plane_info :這個類是關于航班信息怎么存入文件內
User :存放了用戶的基本信息
User_info : 關于航班信息怎么存入文件內
Admin :這個是飛機訂票系統的管理員,里面含有管理員密碼和賬號,項目中加入航班信息和修改航班信息可不是隨便人都可以的
PlaneSystem:這個是最重要的,項目的基本方法都放在這里
下面對幾個主要操作的算法進行描述
4.1 check算法進行描述(比如檢測管理員賬號密碼)
4.2 WriteObj(把對象寫入文件里面)
4.3 info_plane(把對象寫入文件里面)
4.4 show (把航班信息展示出來)
五、難點問題
因為要把很多信息存入文件,好存入,但是不好取出。所以就想到了直接存入一個鏈表,鏈表元素為對應的航班和用戶信息的對象,這樣好讀出。于是就解決了這個問題。
按照上面的操作之后發現,存入文件,只能存入一次,再次存入,總是會被覆蓋。
怎么解決 ?為什么會造成這樣的原因呢?
就是每次讀入文件的時候都更新了這個鏈表,導致了更新。那么每次把對象存入文件的時候呢,我讀出這個鏈表,賦值給我創建的鏈表,然后,在調用方法add()加入元素就好了
但是這意味著文件必須一開始就有數據,所以我程序運行的第一次就加入了一個鏈表,但是二次加入的時候的空鏈表就要刪除。。
這個就難解決,暫時沒有想到好的方法,如果有好辦法的話可以私信我哦。
六、具體實現
這個是把航班信息讀入,讀出文件的主要返回。就是應用對象輸入流:
輸出流:
這個是生成隨機第一個為字母和八位隨機數組成的訂單號
設計思路:主要是兩個字符串的拼接,第一個是隨機生成八位數。第二個生成一個字母,然后拼接返回字符串就好了
這個是存入航班信息的方法
1:創建一個飛機對象
2:輸入飛機航班對應信息
3:讀取文件(目的是把鏈表讀出賦值給創建的鏈表,然后把航班對象加入鏈表,最后返回這個鏈表。
4:在飛機訂票系統里面加入信息。
下面這張圖片是連著上面的 ,哈哈哈,截屏截不到那么多
這張是調用上面的方法
這個是通過航班號進行展示航班
1:創建航班信息對象(目的是引用對應的對象屬性(鏈表)
2:打開文件
3:讀取文件賦值給1中的航班對象的屬性鏈表
4:用迭代器進行訪問鏈表,一個一個進行判斷。
這個是沒有合適的航班的話,這個方法會推薦另外其他合適的航班。------------利用依靠起降地點,嘿嘿嘿。
七、總結
1 : 圖形化界面
是否可以做出一個圖形化界面,這樣用戶體驗感會更強
2 :判斷
是否可以加入一些判斷身份證號碼的方法
3 : 對齊
在輸出文件信息的時候沒有做到比較好的對齊
4 : 復雜度
是不是可以更加的優化一下算法
5 : 推薦算法
是否能加入更多的信息,優化算法,做到真正訂票的時候強大的推薦性
八、源碼
package object_plane;import java.util.Scanner;public class Admin {String admin = "admin";String passwd = "123";public int check(){Scanner in = new Scanner(System.in);System.out.printf("請輸入賬號:");String admin_output = in.next();System.out.printf("請輸入密碼:");String passwd_output = in.next();if (admin.equals(admin_output) && passwd.equals(passwd_output)) {System.out.printf("操作成功!\n");return 0;} // System.out.printf("賬號密碼錯誤");return -1;} }package object_plane;import java.io.Serializable;public class Plane implements Serializable {public String number;public String start_place;public String end_place;public String start_time;public String end_time;public double price;public double discount;String flag;//是否滿倉 0為沒有滿倉 }package object_plane;import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.List;public class plane_info {public List<Plane> list_plane ;public static void WriteObj(Object obj,File file) throws Exception{FileOutputStream fo = null;ObjectOutputStream oos = null;fo = new FileOutputStream(file);oos = new ObjectOutputStream(fo);oos.writeObject(obj);oos.writeObject(null);oos.flush();oos.close();fo.close();}public static void info_plane(Object obj){File file = new File("plane");try {WriteObj(obj,file);} catch (Exception e) {e.printStackTrace();}} }package object_plane;import java.io.*; import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.Scanner;public class PlaneSystem {//對象寫的操作public static void WriteObj(Object obj,File file) throws Exception{FileOutputStream fo = null;ObjectOutputStream oos = null;fo = new FileOutputStream(file);oos = new ObjectOutputStream(fo);oos.writeObject(obj);oos.writeObject(null);oos.flush();oos.close();fo.close();}public static Object ReadObj(File file) throws Exception{FileInputStream fi = null;ObjectInputStream ois = null;Object obj = null;fi = new FileInputStream(file);ois = new ObjectInputStream(fi);obj = ois.readObject();ois.close();fi.close();return obj;}public static String random_ordernumber(){StringBuilder str1 = new StringBuilder();Random random = new Random();for(int j=0;j<8;j++){str1.append(random.nextInt(10));}String a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";int index = random.nextInt(a.length());String str2 = a.substring(index,index+1);String str3 = str1.toString();String str = str2+str3;return str;}public static String check_flag(String numbers){plane_info pi = new plane_info();File file = new File("plane");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.number.equals(numbers) && p.flag.equals("滿")){return "滿";}}} catch (Exception e) {e.printStackTrace();}return "無";}public List create_plane(){Scanner in = new Scanner(System.in);Plane p = new Plane();//創建基本信息System.out.printf("請輸入航班號:");p.number = in.next();System.out.printf("請輸入起飛地點:");p.start_place = in.next();System.out.printf("請輸入降落地點:");p.end_place = in.next();System.out.printf("請輸入起飛時間:");p.start_time = in.next();System.out.printf("請輸入降落時間:");p.end_time = in.next();p.flag = "無";System.out.printf("請輸入該航班價格:");p.price = in.nextDouble();System.out.printf("請輸入該航班折扣:");p.discount = in.nextDouble();plane_info pi = new plane_info();File file = new File("plane");try {pi.list_plane = ((LinkedList) ReadObj(file));} catch (Exception e) {e.printStackTrace();}pi.list_plane.add(p);return pi.list_plane; // 把對象plane加入文件里面}//所以查詢的方法public void show() {plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}} catch (Exception e) {e.printStackTrace();}}public void plane_show(String start_planes, String end_planes){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.start_place.equals(start_planes) && p.end_place.equals(end_planes)){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public void plane_numbers_show(String plane_numbers){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.number.equals(plane_numbers)){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public void plane_time_show(String start_times, String end_times){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.start_time.equals(start_times) && p.end_time.equals(end_times)){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public void plane_prince_show(double price){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.price == price){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public void plane_discount_show(double discount){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.discount == discount){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public void plane_flag_show(String flag){plane_info pi = new plane_info();File file = new File("plane");System.out.printf("航班號 起點 終點 出發時間 到達時間 價 格 折扣 滿倉\n");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.flag.equals(flag) ){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}//查詢方法的結束位置public List change_plane_info(String number, String start_place, String end_place, String start_time, String end_time, double price, double discount, String flag){plane_info pi = new plane_info();File file = new File("plane");try {pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.number.equals(number)) {p.start_place = start_place;p.end_place = end_place;p.start_time = start_time;p.end_time = end_time;p.price = price;p.flag = flag;p.discount = discount;}}} catch (Exception e) {e.printStackTrace();}return pi.list_plane;}public static void best_plane(String numbers){System.out.printf("已經為你尋找最適合的航班!!\n");plane_info pi = new plane_info();File file = new File("plane");try {String start_place = " ";String end_place = " ";pi.list_plane = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.number.equals(numbers) ){start_place = p.start_place;end_place = p.end_place;}}for (int i = 0; i < pi.list_plane.size(); i++) {Plane p = (Plane) pi.list_plane.get(i);if(p.start_place.equals(start_place) && p.end_place.equals(end_place)&& !p.number.equals(numbers) ){System.out.printf( p.number + " " + p.start_place + " " + p.end_place + " " +p.start_time + " " + p.end_time + " " + p.price + " " + p.discount + " "+p.flag+"\n");}}} catch (Exception e) {e.printStackTrace();}}public List create_user(){Scanner in = new Scanner(System.in);User u = new User();//創建基本信息System.out.printf("請輸入航班號");u.number_user = in.next();if (check_flag(u.number_user).equals("滿")){System.out.printf("已經滿倉了,請等待,正在為你尋找最適合的航班\n");best_plane(u.number_user);System.out.printf("是否需要,不需要按n(or N) 需要 按 y (or Y)");String a =in.next();if(a.equals("n")||a.equals("N")){return null;}else if ((a.equals("Y")||a.equals("y"))){}else{System.out.printf("輸入了錯誤的字符");return null;}}System.out.printf("請輸入姓名");u.name = in.next();System.out.printf("請輸入身份證號碼");u.idcard = in.next();User_info pi = new User_info();File file = new File("user");try {pi.list_users = ((LinkedList) ReadObj(file));u.ordernumber = random_ordernumber();for(int i=0;i<pi.list_users.size();i++){User u1 = pi.list_users.get(i);if(u1.name == u.name){u.sum++;}if(u1.ordernumber == u.ordernumber){u.ordernumber = random_ordernumber();}}} catch (Exception e) {e.printStackTrace();}System.out.printf("你的訂單號為"+u.ordernumber+"\n");pi.list_users.add(u);return pi.list_users; // 把對象plane加入文件里面}public List<User> change_user_info(String ordernumbers){User_info pi = new User_info();File file = new File("user");try {pi.list_users = ((LinkedList) ReadObj(file));for (int i = 0; i < pi.list_users.size(); i++) {User u = (User) pi.list_users.get(i);if(u.ordernumber.equals(ordernumbers)) {pi.list_users.remove(i);}}} catch (Exception e) {e.printStackTrace();}return pi.list_users;}public void show_user(){User_info pi = new User_info();File file = new File("user");try {pi.list_users = ((LinkedList) ReadObj(file));System.out.printf("用戶姓名 身份證號碼 訂單飛機號 訂 單 號 訂單數量 \n");for (int i = 0; i < pi.list_users.size(); i++) {User u = (User) pi.list_users.get(i);System.out.printf(" "+u.name+" "+u.idcard+" "+u.number_user+" "+u.ordernumber+" "+u.sum+"\n");}} catch (Exception e) {e.printStackTrace();}} }package object_plane;import java.io.Serializable;public class User implements Serializable {public String name;public String idcard;public int sum = 1;//訂票數量public String number_user;public String ordernumber; //訂單號 }package object_plane;import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.List;public class User_info {public List<User> list_users ;public static void WriteObj(Object obj, File file) throws Exception{FileOutputStream fo = null;ObjectOutputStream oos = null;fo = new FileOutputStream(file);oos = new ObjectOutputStream(fo);oos.writeObject(obj);oos.writeObject(null);oos.flush();oos.close();fo.close();}public static void info_user(Object obj){File file = new File("user");try {WriteObj(obj,file);} catch (Exception e) {e.printStackTrace();}} }import object_plane.*;import java.util.LinkedList; import java.util.List; import java.util.Scanner;public class main {public static void menu(){System.out.printf("歡迎來到飛機訂票系統\n");System.out.printf("*******************\n");System.out.printf("1.錄入航班情況\n");System.out.printf("2.查詢航線\n");System.out.printf("3.訂 票\n");System.out.printf("4.退 票\n");System.out.printf("5.修改航班信息\n");System.out.printf("6.顯示所以用戶信息\n");System.out.printf("0.退出\n");System.out.printf("*******************\n");}public static void menu_select(){System.out.printf("歡迎來到飛機查詢訂票系統\n");System.out.printf("*******************\n");System.out.printf("1.通過航班號查詢\n");System.out.printf("2.通過起降時間查詢\n");System.out.printf("3.通過起飛抵達城市查詢\n");System.out.printf("4.通過航班票價查詢\n");System.out.printf("5.通過是否滿倉查詢\n");System.out.printf("6.通過折扣查詢\n");System.out.printf("7.查詢所有的航班信息\n");System.out.printf("0.退出\n");System.out.printf("*******************\n");}public static void main(String[] args) {while (true){menu();PlaneSystem planeSystem =new PlaneSystem();Scanner in = new Scanner(System.in);System.out.printf("請輸入你要操作的數");int a = in.nextInt();if(a == 1){ // List<Plane> list_info = new LinkedList<>(); // plane_info.info_plane(list_info);Admin admin = new Admin();if(admin.check()==0){List l = (LinkedList)planeSystem.create_plane();plane_info.info_plane(l);}else{System.out.printf("管理員賬號密碼錯誤,請重試");}}else if(a == 2){menu_select();System.out.printf("請選擇你要的查詢方式");int b = in.nextInt();if(b == 1){System.out.printf("請輸入你要查詢的航班");String plane_numbers = in.next();planeSystem.plane_numbers_show(plane_numbers);}else if(b == 2){System.out.printf("請輸入你要查詢的起飛時間");String start_times= in.next();System.out.printf("請輸入你要查詢的降落時間");String end_times = in.next();planeSystem.plane_time_show(start_times, end_times);} else if(b == 3){System.out.printf("請輸入你要查詢的起始地點");String start_planes = in.next();System.out.printf("請輸入你要查詢的起始地點");String end_planes = in.next();planeSystem.plane_show(start_planes, end_planes);}else if(b == 4){System.out.printf("請輸入你要查詢的航班的票價");double prince = in.nextDouble();planeSystem.plane_prince_show(prince);} else if(b == 5){System.out.printf("請輸入你要查詢的航班的滿倉情況");String flag = in.next();planeSystem.plane_flag_show(flag);} else if(b == 6){System.out.printf("請輸入你要查詢的航班的折扣");double discount = in.nextDouble();planeSystem.plane_discount_show(discount);} else if(b==7)planeSystem.show();}else if(a==3){ // List<User> list_user_info = new LinkedList<>(); // User_info.info_user(list_user_info);planeSystem.show();List l = (LinkedList)planeSystem.create_user();User_info.info_user(l);System.out.printf("訂票成功!!\n");continue;}else if(a==4) {System.out.printf("請輸入你訂單號");String ordernumbers = in.next();List l = planeSystem.change_user_info(ordernumbers);User_info.info_user(l);System.out.printf("退票成功!!\n");} else if(a==5){ // System.out.printf("請輸入你要修改的航班所以信息");//創建基本信息System.out.printf("請輸入你要修改的航班號\n");String number = in.next();System.out.printf("請輸入你要修改的起點\n");String start_place = in.next();System.out.printf("請輸入你要修改的終點\n");String end_place = in.next();System.out.printf("請輸入你要修改的起飛時間\n");String start_time = in.next();System.out.printf("請輸入你要修改的降落時間\n");String end_time = in.next();System.out.printf("請輸入是否滿倉\n");String flag = in.next();System.out.printf("請輸入你要修改的價格\n");double price = in.nextDouble();System.out.printf("請輸入你要修改的折扣數\n");double discount = in.nextDouble();List l = (LinkedList)planeSystem.change_plane_info(number, start_place, end_place, start_time, end_time, price, discount, flag);plane_info.info_plane(l);}else if(a==6) {Admin admin = new Admin();if(admin.check()==0){planeSystem.show_user();}else{System.out.printf("管理員賬號密碼錯誤,請重試");}}else{return ;}}} }總結
- 上一篇: C语言 数组指针详解
- 下一篇: 【2019秋招】OPPO无线通信协议工程