java⼩项⽬影院系统
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* 测试cinema类
* 模拟电影院的出票系统
* 解析XML⽂件⽤于初始化Cinema的Schedule类,其保存电影院所放映电影所有场次信息
* 要求:
* 1.打印⽤户的购票信息
* 2.利⽤序列化保存⽤户购票信息
* 3.利⽤反序列化加载⽤户的购票历史记录
* 4.同⼀张票只能卖出⼀次(电影名、座位号、放映时间相同则为同⼀张票)
* 5.对⽤户输⼊进⾏判断,给出错误提⽰
*
* @author cxp
* @data 2016-9-13
* @modify
*/
public class TestCinema {
/**
*  判断电影名是否输⼊正确
* @param schedule
* @param movieName
* @return
*/
public static boolean chooseName(Schedule schedule, String movieName) {
// 判断放映表是否存在⽤户输⼊的电影名
for (ScheduleItem scheduleItem : ItemList()) {
if (Movie().getMovieName().equals(movieName)) {
return true;
}
}
return false;
}
/**
*  判断⽤户输⼊时间是否正确
* @param schedule
* @param time
* @param movieName
* @return
*/
public static boolean chooseTime(Schedule schedule, String time, String movieName) {
for (ScheduleItem scheduleItem : ItemList()) {
if (Time().equals(time) && Movie().getMovieName().equals(movieName)) return true;
}
return false;
}
/**
* 判断⽤户输⼊票的类别是否正确
* @param num
* @return
*/
public static boolean chooseType(int num) {
if (num == 1 || num == 2 || num == 3)
return true;
else
return false;
}
/**
*  利⽤正则表达式判断输⼊的座位号是否合法
* @param seat
* @return
*/
public static boolean chooseSeat(String seat) {
//[1-5]表⽰匹配数字的范围是1~5,问号(?)表⽰此数字只能出现⼀次[-]表⽰要完全匹配-号
if (seat.matches("[1-5]?+[-]+[1-7]?"))
return true;
else
return false;
}
/**
* 主程序
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 新建电影院类
Cinema cinema = new Cinema();
//获取schedule
Schedule cs = Schedule();
//解析XML⽂件,显⽰电影场次集合
cs.paraeXML("l");
//**************************主界⾯循环**************************//
String condition = "y";
while ("y".equalsIgnoreCase(condition)) {
// 打印主界⾯,显⽰电影放映时间表
cs.printItemList();
System.out.println("请输⼊电影名称:");
String movieName;// ⽤户输⼊的电影名
// 循环,直到⽤户输⼊正确的电影名
while (true) {
boolean flag = false;// 判断⽤户输⼊的电影名是否在放映表中
movieName = ();
使用dom4j解析xml文件flag = chooseName(cs, movieName);
if (flag == true)
break;
else
System.out.println("电影名称有误,请重新输⼊电影名称:");
}
System.out.println("请输⼊电影播放时间:以xx:xx的格式");
String time;
// 循环,直到⽤户输⼊正确的时间
while (true) {
boolean flag = false;
time = ();
// 判断电影在⽤户输⼊的时间点是否放映,且放映的电影与⽤户之前选择的相匹配
flag = chooseTime(cs, time, movieName);
if (flag == true)
break;
else
System.out.println("时间输⼊有误,请重新时间:");
}
// 将⽤户选择的电影名的相应放映场次出来
// 不能放在chooseName⾥的原因:将scItem作为参数传进去的是⼀个引⽤的副本,
// 可以利⽤这个引⽤改变引⽤所指向对象的内存,但对引⽤本⾝赋值,函数返回后,副本被销毁,原指针仍为空            ScheduleItem scItem = null;// 电影名对应的场次信息
for (ScheduleItem scheduleItem : cs.getItemList()) {
if (Movie().getMovieName().equals(movieName)&&Time().equals(time)) {                    scItem = scheduleItem;
}
}
System.out.println("请输⼊您要购买的票的类型:1.全价票 2.学⽣票 3.赠票");
int num=0;
// 循环,直到⽤户输⼊正确的数字
while (true) {
boolean flag = false;
try{
num = Int();
// 判断电影在⽤户输⼊的时间点是否放映,且放映的电影与⽤户之前选择的相匹配
flag = chooseType(num);
if (flag == true)
break;
else
System.out.println("数字输⼊有误,请选择购票类型:1.全价票 2.学⽣票 3.赠票");
}catch (InputMismatchException  e) {
<(); // 增加这样⼀⾏,清空缓冲区
System.out.println("输⼊不匹配,请输⼊数字:1.全价票 2.学⽣票 3.赠票!");
}
}
//****************************普通票****************************//
switch(num){
case1:
System.out.println("请输⼊您需要的座位号:以排-列的形式");
String seat;
// 循环,直到⽤户输⼊正确座位号
while (true) {
boolean flag = false;// 标记⽤户输⼊座位号是否合法
seat = ();
// 判断电影在⽤户输⼊的时间点是否放映,且放映的电影与⽤户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输⼊错误,请重新输⼊您需要的座位号:以排-列的形式");
}
Ticket ticket = new OriginalTicket(new Seat(seat), Movie().getPrice(), scItem);
if(!cinema.checkTicket(ticket)){
//打印购票信息
ticket.buyTicket();
// 添加购买的票到集合中
//序列化已购电影票
if(!TicketList().isEmpty())
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新购票!");
break;
//****************************学⽣票****************************//
case2:
System.out.println("请输⼊您所需要的折扣:1-9的整数");
int discount = Int();
System.out.println("请输⼊您需要的座位号:以排-列的形式");
// 循环,直到⽤户输⼊正确座位号
while (true) {
boolean flag = false;// 标记⽤户输⼊座位号是否合法
seat = ();
// 判断电影在⽤户输⼊的时间点是否放映,且放映的电影与⽤户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输⼊错误,请重新输⼊您需要的座位号:以排-列的形式");
}
// 创建学⽣票
Ticket studentTicket = new StudentTicket(new Seat(seat), Movie().getPrice(), scItem,
discount);
/
/判断该票是否被购买
if(!cinema.checkTicket(studentTicket)){
//打印购票信息到⽂件中
studentTicket.buyTicket();
// 添加购买的票到集合中
//序列化已购电影票
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新购买!");
break;
//****************************赠票****************************//
case3:
System.out.println("请输⼊客户姓名:");
String customerName = ();
System.out.println("请输⼊您需要的座位号:以排-列的形式");
// 循环,直到⽤户输⼊正确座位号
while (true) {
boolean flag = false;// 标记⽤户输⼊座位号是否合法
seat = ();
// 判断电影在⽤户输⼊的时间点是否放映,且放映的电影与⽤户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输⼊错误,请重新输⼊您需要的座位号:以排-列的形式");
}
// 创建赠票
Ticket FreeTicket = new FreeTicket(new Seat(seat), Movie().getPrice(), scItem, customerName);
if(!cinema.checkTicket(FreeTicket)){
//打印购票信息到⽂件中
FreeTicket.buyTicket();
// 添加购买的票到集合中
//序列化已购电影票
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新选票!");
break;
}
System.out.println("请选择继续购票(y)或退出系统(n):y/n");
//循环判断⽤户输⼊是否正确
while (true) {
condition = ();
if ("y".equalsIgnoreCase(condition) || "n".equalsIgnoreCase(condition))
break;
else
System.out.println("输⼊错误!请重新选择继续购票(y)或退出系统(n):y/n");
}
}
}
}
2.这是放映⽇程类,该类解析xml⽂件并使⽤xml⽂件初始化电影信息集合 List
import java.io.File;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 放映⽇程类 Schedule;包含:
* 电影信息集合 List<ScheduleItem>
*
* @author cxp
* @data 2016-9-13
* @modify
* */
public class Schedule {
// 存储电影信息的集合
private List<ScheduleItem> itemList = new ArrayList<ScheduleItem>();
/**
* ⽆参构造函数
*/
public Schedule() {
super();
}
/**
*  打印电影场次信息及座位表
*/
public void printItemList() {
System.out.println("序号\t电影名称\t英⽂名称\t导演\t演员\t电影类型\t价格\t时间 ");
int k=1;//打印序号
//打印电影场次信息
for (ScheduleItem scheduleItem : itemList) {
System.out.println(k+"\t"+scheduleItem);
k++;
}
//打印影院座位图
System.out.println("下⾯为影院的座位结构图:");
System.out.println("\t\t\t屏幕");
for (int i = 1; i <=5; i++) {
for (int j = 1; j <= 7; j++) {
System.out.print(i+"-"+j+"\t");
}
System.out.println();
}
}
/**
*  getter和setter⽅法
* @return
*/
public List<ScheduleItem> getItemList() {
return itemList;
}
public void setItemList(List<ScheduleItem> itemList) {
this.itemList = itemList;
}
/**
* 1.获得⽂档对象
*
* @param fileName