java小项目影院系统

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());
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值