Java学习案例:控制台实现电影院管理系统

前言

   最近学习把java SE的内容全部过了一遍,大致的内容和其他编程语言没有很大的区别,但在细节上确实有很多的关键点值得一提,比如java不支持多继承,但是可以通过内部类来实现相同效果。
   通过案例把这几天学的东西融会贯通一下,还是和上次一样先展示案例效果,源码的下载链接

 tip:这次代码量比上回稍微多了一些,源码我以上传并设置成免费的,大家可以下载下来 !

一、实现效果

1、登录界面以及注册功能演示

   如下图所示,当用户需要注册时会遇到一个验证码功能,此功能会随机生成包含大小写字母和数字的六位验证码,当用户输入正确后才能继续进行注册功能!(不区分大小写)
用户类型分为管理员和普通用户,注册管理员账户时需要输入管理员注册码666666才可以成功注册。
在这里插入图片描述

2、普通用户登录

普通用户登录后会显示五项功能:

1、热映影片:
  显示管理员已设置排片时间和影厅号的电影,用户可以通过此功能查看排片电影详情、购买电影票、申请退票。

2、即将上映
  显示系统中所有未排片的电影

3、个人信息
  显示用户的个人信息,用户也可以通过此功能修改这些信息

4、票夹
  显示用户购买的电影票(包括电影开场时间、影厅号)

5、退出系统
  返回上级操作界面

普通用户登录后欢迎界面如下图所示:
在这里插入图片描述

(1)热映影片

    效果如下图所示,用户可以通过此功能查看所有管理员已排片的电影信息、购买电影票。当用户输入1指令进入热映影片界面时,会简单列出当前的存在的排片信息。用户继续输入指令1时,会提示用户输入指定的电影名字来查看电影详情。
在这里插入图片描述

    用户在热映影片界面输入指令2,可以购买电影票并自由选择座位。被预定的座位会显示随机emoji表情,如果用户误选已被预选的座位,系统也会给出提示并让用户重新选择.
在这里插入图片描述
在这里插入图片描述

(2)即将上映

    效果如下,用户可以通过此功能查看所有管理员还未排片的电影简介。
在这里插入图片描述

(3)个人信息

    个人信息功能如下图所示,用户可以通过此功能查看并修改个人信息。
在这里插入图片描述
在这里插入图片描述
如下图所示,用户在修改信息后,系统相关设置会更新。
在这里插入图片描述

(4)票夹

    票夹功能如下图所示,用户可以通过此功能查看所有已购电影票。
在这里插入图片描述

3、管理员登录

   管理员登录后会显示四项功能:

1、电影管理:
  电影管理功能包含:
    1、浏览电影
      管理员可以通过此功能查看所有已上架的电影

    2、电影上架
      管理员可以使用此功能添加电影(上架电影,普通用户会在 <即将上映> 界面看到该电影的信息)

    3、电影下架
      管理员通过指定电影名字删除已上架电影的信息

    4、修改电影
      管理员通过此功能修改电影的信息,能修改电影名、电影导演、电影主演、电影简介等信息

    5、排片设置

      管理员可以通过此功能设置电影的排片信息,设置电影播放的影厅号、开始的时间、电影票售价等信息


2、用户管理
  显示系统中所有未排片的电影

3、个人信息
  显示管理员的个人信息,管理也可以通过此功能修改这些信息(包括登录名、密码、网名昵称等等)

4、退出
  返回上级操作界面

管理员登录后欢迎界面如下图所示:
在这里插入图片描述

(1)电影管理

    电影管理包含浏览电影、电影上架、电影下架、修改电影、排片设置等功能,管理员通过选择电影管理下的子功能设置相关电影信息。
在这里插入图片描述
在这里插入图片描述

(2)用户管理

    管理员可以用户管理设置用户相关信息。
在这里插入图片描述

(3)个人信息

    管理员个人信息展示界面和普通用户一样(调用的是同一个方法),图片略。

二、功能源码

1、接收用户的合法输入

   如下代码所示,当需用户重复输入指定指令时,可以采用死循环的方法。

public class Demo {
	//放在类中方法外,设置为成员变量,可以全局使用sc变量
    Scanner sc = new Scanner(System.in);
    public void fun(){
        //定义在死循环外,防止重复创建对象
        String choise;
        while (true){
            //变量赋值放在死循环中,以便重复接受用户的输入
            choise = sc.next();
            switch (choise){
                case "1":
                    showUserList();
                    break;
					......

                case "3":
                    System.out.println("已退出!");
                    //return;直接结束方法!
                    return;
                default:
                    //只要用户输入的不是需要的指令就提示输入不规范
                    System.out.println("您的输入不规范!");
                    break;
            }
        }
    }
}

2、控制台格式化输出

   如下代

//控制台格式化打印
System.out.printf("字符串", 形参列表...);  
//在IDEA中的快捷使用方法是 (返回值为String的方法).souf 或 (变量).souf
//或者直接输入souf回车

用法示例:
int a = 10;
System.out.printf("a的值是%d", number);  
控制台打印:
a的值是10


以上示例中字符串里的%d是占位符,类似的还有:

1%s:字符串占位符,用于插入字符串类型的值。它可以用来替换任何类型的对象,
	  包括字符串、数字等,因为所有对象都可以调用toString()方法转换为字符串。

2%d:整数占位符,用于插入整数类型的值。适用于intlong等整数类型。

3%f:浮点占位符,用于插入浮点类型的值。适用于floatdouble等浮点数类型。

4%b:布尔值占位符,用于插入布尔值类型的值。

常用的就%s、%d、%f三种,只记这三种就行。网上还搜到%tY表示四位数的年份、
%tB表示英文月份等不常用的。

===============================================================================
控制台格式化打印的进阶技巧:

double pi = 3.141592653589793;  
System.out.printf("浮点数(保留两位小数):%.2f%n", pi);  
输出:浮点数(保留两位小数):3.14
[ps:这里的%n不是占位符,这里表示换行的意思,printf默认不加换行。你也可以输入转义字符\r\n]
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数  
System.out.printf("宽度为10,右对齐,保留两位小数:%10.2f%n", pi);  
输出:宽度为10,右对齐,保留两位小数:      3.14  
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数,用0填充  
System.out.printf("宽度为10,右对齐,0填充,保留两位小数:%010.2f%n", pi);  
输出:宽度为10,右对齐,0填充,保留两位小数:0000003.14	
-------------------------------------------------------------------------------
总结:%[index$][标识]*[最小宽度][.精度]转换符

   更多占位符相关知识,请查看博主旷野历程的这篇文章:JAVA字符串占位符使用
   java中涉及到使用占位符的,还有String.format()方法、PrintStream类与PrintWriter类中的printf()方法、MessageFormat类等方法

3、创建工具类

   专门创建工具类来存放一些功能,可以在书写功能类时避免混淆、减少重复代码。工具类一般使用Utils或Tools后缀。

//防止继承,设置为final
public final class movieUtils {
    //禁止用户通过new实例来调用,将无参构造器标记为private
    private movieUtils(){}
    
    //打印分割线
    public static void printPartingLineLite() {
        System.out.println("\r\n-------------------------------------------------------------------");
    }
    //方法重载,打印不同类型的分割线
    public static void printPartingLineLite(String serviceName) {
        System.out.printf("\r\n------------------------------%s------------------------------\r\n", serviceName);
    }

    public static void printPartingLine() {
        System.out.println("\r\n============================================================");
    }

    public static void printPartingLine(String serviceName) {
        System.out.printf("\r\n============================%s=============================\r\n", serviceName);
    }

    //设置电影简介的打印格式,到一定长度就换行
    public static String printDesc(String Desc) {
        StringBuilder str = new StringBuilder(Desc);
        for (int i = 0; i < str.length(); i++) {
            if (i == 0) continue;
            if ((i % 42) == 0)
                str.insert(i, "\r\n\t ");
        }

        return str.toString();
    }

	//创建随机六位字母数字组成的验证码
    private static boolean verificationCode() {
        Random rd = new Random();
        String str = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
        StringBuilder st = new StringBuilder();
        int temp;
        for (int i = 0; i < 6; i++) {
            temp = rd.nextInt(str.length());
            st.append(str.toCharArray()[temp]);
        }
        System.out.println("验证码:" + st.toString());
        System.out.println("请输入验证码:");
        String code = sc.next();
        if ((st.toString()).equalsIgnoreCase(code)) {
            return false;
        }
        System.out.println("验证码输入错误");
        return true;
    }

    private static void verification() {
        boolean check = true;
        while (check) {
            check = verificationCode();
        }
    }
    ....

4、多个类之间数据传递

   在构建整个系统时,数据传递无疑是一个核心环节。本文采用了类的构造函数来传递参数,这种方式确保了在Java中执行非静态类的方法时,类的构造函数能够被适时调用,从而初始化对象并传递必要的数据。


    public class A {
        public static void main(String[] args) {
    //        main方法程序的入口
    //        运行欢迎程序,打印系统初始界面
            new B().hello();
        }
    }
    
    class B {
        ArrayList<Student> list;
    
        B() {
            SystemData data = new SystemData();
            this.list = data.list;
        }
    
        void hello() {
        	//这里的this就是B类的地址值,将其作为实参传递给C类
            new C(this);
        }
    }
    
    class C {
        ArrayList<Student> list;
    
        public C(B b) {
			//通过B类地址值获取B类的成员变量list,并将其赋给C类中的成员变量list
            this.list = b.list;
        }
    }
    
    class SystemData {
        //    数据初始化类(存储所有数据、整个管理系统运行时赋予系统初始数据)
        ArrayList<Student> list;
    
        public SystemData() {
            this.list = new ArrayList<>();
            list.add(new Student());
        }
    }
    
    class Student {
        //    JavaBean类
        private String name;
        private int age;
        //get、set、构造器略
    }

三、总结

   实现这种控制台的简易系统并不困难,但是就是繁琐、大量的死循环、重复的功能的调用。但通过上手练习,能够有效的贯通这段时间学习的基础语法知识,实现一些看似复杂但很简单的功能。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值