java小项目,影院管理系统
http://download.csdn.net/detail/github_32658299/9632276
下面是两个关键的类
1.这是电影院测试类,用来读取用户输入并进行出票
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 : schedule.getItemList()) {
if (scheduleItem.getMovie().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 : schedule.getItemList()) {
if (scheduleItem.getTime().equals(time) && scheduleItem.getMovie().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 = cinema.getSchedule();
//解析XML文件,显示电影场次集合
cs.paraeXML("NewFile.xml");
//**************************主界面循环**************************//
String condition = "y";
while ("y".equalsIgnoreCase(condition)) {
// 打印主界面,显示电影放映时间表
cs.printItemList();
System.out.println("请输入电影名称:");
String movieName;// 用户输入的电影名
// 循环,直到用户输入正确的电影名
while (true) {
boolean flag = false;// 判断用户输入的电影名是否在放映表中
movieName = scanner.next();
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 = scanner.next();
// 判断电影在用户输入的时间点是否放映,且放映的电影与用户之前选择的相匹配
flag = chooseTime(cs, time, movieName);
if (flag == true)
break;
else
System.out.println("时间输入有误,请重新时间:");
}
// 将用户选择的电影名的相应放映场次找出来
// 不能放在chooseName里找的原因:将scItem作为参数传进去的是一个引用的副本,
// 可以利用这个引用改变引用所指向对象的内存,但对引用本身赋值,函数返回后,副本被销毁,原指针仍为空
ScheduleItem scItem = null;// 电影名对应的场次信息
for (ScheduleItem scheduleItem : cs.getItemList()) {
if (scheduleItem.getMovie().getMovieName().equals(movieName)&&scheduleItem.getTime().equals(time)) {
scItem = scheduleItem;
}
}
System.out.println("请输入您要购买的票的类型:1.全价票 2.学生票 3.赠票");
int num=0;
// 循环,直到用户输入正确的数字
while (true) {
boolean flag = false;
try{
num = scanner.nextInt();
// 判断电影在用户输入的时间点是否放映,且放映的电影与用户之前选择的相匹配
flag = chooseType(num);
if (flag == true)
break;
else
System.out.println("数字输入有误,请选择购票类型:1.全价票 2.学生票 3.赠票");
}catch (InputMismatchException e) {
scanner.next(); // 增加这样一行,清空缓冲区
System.out.println("输入不匹配,请输入数字:1.全价票 2.学生票 3.赠票!");
}
}
//****************************普通票****************************//
switch(num){
case 1:
System.out.println("请输入您需要的座位号:以排-列的形式");
String seat;
// 循环,直到用户输入正确座位号
while (true) {
boolean flag = false;// 标记用户输入座位号是否合法
seat = scanner.next();
// 判断电影在用户输入的时间点是否放映,且放映的电影与用户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输入错误,请重新输入您需要的座位号:以排-列的形式");
}
Ticket ticket = new OriginalTicket(new Seat(seat), scItem.getMovie().getPrice(), scItem);
if(!cinema.checkTicket(ticket)){
//打印购票信息
ticket.buyTicket();
// 添加购买的票到集合中
cinema.getTicketList().add(ticket);
//序列化已购电影票
if(!cinema.getTicketList().isEmpty())
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新购票!");
break;
//****************************学生票****************************//
case 2:
System.out.println("请输入您所需要的折扣:1-9的整数");
int discount = scanner.nextInt();
System.out.println("请输入您需要的座位号:以排-列的形式");
// 循环,直到用户输入正确座位号
while (true) {
boolean flag = false;// 标记用户输入座位号是否合法
seat = scanner.next();
// 判断电影在用户输入的时间点是否放映,且放映的电影与用户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输入错误,请重新输入您需要的座位号:以排-列的形式");
}
// 创建学生票
Ticket studentTicket = new StudentTicket(new Seat(seat), scItem.getMovie().getPrice(), scItem,
discount);
//判断该票是否被购买
if(!cinema.checkTicket(studentTicket)){
//打印购票信息到文件中
studentTicket.buyTicket();
// 添加购买的票到集合中
cinema.getTicketList().add(studentTicket);
//序列化已购电影票
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新购买!");
break;
//****************************赠票****************************//
case 3:
System.out.println("请输入客户姓名:");
String customerName = scanner.next();
System.out.println("请输入您需要的座位号:以排-列的形式");
// 循环,直到用户输入正确座位号
while (true) {
boolean flag = false;// 标记用户输入座位号是否合法
seat = scanner.next();
// 判断电影在用户输入的时间点是否放映,且放映的电影与用户之前选择的相匹配
flag = chooseSeat(seat);
if (flag == true)
break;
else
System.out.println("输入错误,请重新输入您需要的座位号:以排-列的形式");
}
// 创建赠票
Ticket FreeTicket = new FreeTicket(new Seat(seat), scItem.getMovie().getPrice(), scItem, customerName);
if(!cinema.checkTicket(FreeTicket)){
//打印购票信息到文件中
FreeTicket.buyTicket();
// 添加购买的票到集合中
cinema.getTicketList().add(FreeTicket);
//序列化已购电影票
cinema.saveTicket();
break;
}
System.out.println("该票已被选购,请重新选票!");
break;
}
System.out.println("请选择继续购票(y)或退出系统(n):y/n");
//循环判断用户输入是否正确
while (true) {
condition = scanner.next();
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.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
* @return
*/
public Document getDocument(String fileName) {
// 读取对象
SAXReader reader = new SAXReader();
// 获得文档对象
Document document;
try {
document = reader.read(new File(fileName));
return document;
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
/**
* 2.解析文档 XML
* 将XML文件中的movie用来初始化Movie和Schedule类
* 并将Schedule添加到itemList列表中
*
* @param fileName
*/
public void paraeXML(String fileName) {
// 1.获得文档对象
Document document = getDocument(fileName);
// 2.获得根节点
Element root = document.getRootElement();
Element slElement = root.element("ShowList");
// 获得子节点列表
List<Element> list = slElement.elements();
//循环,初始化itemList集合
for (Element element : list) {
// 存放XML文件数据(Name、Poster、Director、Actor、Type、Price)
String movieName = element.elementText("Name");
String poster = element.elementText("Poster");
String director = element.elementText("Director");
String actor = element.elementText("Actor");
String type = element.elementText("Type");
String price = element.elementText("Price");
// 根据type选择相应的枚举类型成员
MovieType movieType = null;
switch (1) {
case 1:
if (type.equalsIgnoreCase("CARTOON")) {
movieType = MovieType.CARTOON;
break;
}
case 2:
if (type.equalsIgnoreCase("THRILLER")) {
movieType = MovieType.THRILLER;
break;
}
case 3:
if (type.equalsIgnoreCase("ROMANCE")) {
movieType = MovieType.ROMANCE;
break;
}
case 4:
if (type.equalsIgnoreCase("COMEDY")) {
movieType = MovieType.COMEDY;
break;
}
case 5:
if (type.equalsIgnoreCase("ACTION")) {
movieType = MovieType.ACTION;
break;
}
default:
movieType = MovieType.UNKNOW;
}
// 创建一个Movie对象
Movie movie = new Movie(movieName, poster, director, actor,
movieType, Double.parseDouble(price));
// 解析放映时间节点
Element scElement = element.element("Schedule");
List<Element> scList = scElement.elements();
// 解析放映时间结点并添加item到itemList集合中
for (Element element2 : scList) {
//获得element2元素的文本值
String time = element2.getText();
// 根据time以及之前的movie对象创建一个ScheduleItem对象
ScheduleItem item = new ScheduleItem(time, movie);
// 将此对象添加到列表中
itemList.add(item);
// System.out.println(stringBuffer2.toString());
}
}
}
}