Java练习1--模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程

面向对象的一个小程序,觉着还不错,记录一下
练习要求:
实验要求:
(一)编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。
1. 电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。
2. 三个窗口同时出票,出票间隔采用随机控制。
3. 不能重复出售相同的电影票。
程序应具有良好的人机交互性能,即:程序应向用户提示功能说明,并可根据用户的功能选择,执行对应的功能,并给出带详细描述信息的最终执行结果。
(二)扩展以上程序, 模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程。

具体的过程注释都在代码中有标记。
小tips:
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。

下面是具体代码(可执行核心代码):
如果想要继续丰富界面,加上互动即可

/**
 * 1.为了使电影票顺序出票且不重复,使用了同步锁保证电影票的同时而且按顺序输出
 * 2.为了使出票间隔随机控制,我使用了随机函数,生成随机时间(范围是0到1秒)
 * @author QingBang.Wang
 * @DATE 2019/5/30
 */
public class Ticket{
    public static void main(String[] args) {
        /**
         * 实例化线程对象
         */
        Station station1 = new Station("窗口一");
        Station station2 = new Station("窗口二");
        Station station3 = new Station("窗口三");
        /**
         * 开始运行
         */
        station1.start();
        station2.start();
        station3.start();

    }
}

class Station extends Thread {
    //设置静态票数
    static int ticket = 50;
    //设置线程锁
    static Object ob = "ThisIsATicket";

    //给线程命名
    public Station(String name) {
        super(name);
    }

    //写run方法
    public void run() {
       sell();
    }

    //售卖方法
    public void sell() {
        while (ticket > 0) {
            synchronized (ob) {					//ob相当于一个钥匙
                /**
                 * 使用同步锁控制票
                 */
                if (ticket > 0) {
                    //窗口三有二分之一的可能是退票
                    if (getName().equals("窗口三") && Math.random() > 0.5 && ticket < 50) {
                        ticket++;
                        System.out.println("退票第" + ticket + "张票");
                    } else {
                        System.out.println(getName() + "卖了第" + ticket + "张票");
                        ticket--;
                    }

                } else {
                    System.out.println("很抱歉,票卖完了");
                }
            }
            /**
             * 让线程休眠时间随机
             */
            try {

                sleep((long) (1000 * Math.random()));
            } //休息一秒
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

下面是运行结果:
在这里插入图片描述

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的系统,需要分步骤进行设计和实现。以下是一个简单的电影院选票系统的实现思路,仅供参考。 1.定义结构体 首先定义电影票的结构体,包括电影编号、电影名称、放映时间、价格、选座情况等信息。 ``` struct Movie { int movie_id; //电影编号 char movie_name[30]; //电影名称 char show_time[20]; //放映时间 float price; //票价 int seat[5][10]; //座位情况,0表示空位,1表示已售出 }; ``` 2.主菜单 编写主菜单函数,包括选票、退票、查询座位情况等选项。 ``` void main_menu() { printf("===================================\n"); printf("| 电影院选票管理系统 |\n"); printf("===================================\n"); printf("| 1. 选票 |\n"); printf("| 2. 退票 |\n"); printf("| 3. 查询座位情况 |\n"); printf("| 4. 退出系统 |\n"); printf("===================================\n"); } ``` 3.选票功能 编写选票函数,包括显示可选电影列表、选择电影、选择座位等步骤。 ``` void ticket_menu() { printf("===================================\n"); printf("| 电影列表 |\n"); printf("===================================\n"); printf("| 电影编号 | 电影名称 | 放映时间 |\n"); printf("===================================\n"); //显示电影列表 for(int i=0; i<MOVIE_NUM; i++) { printf("| %d | %s | %s |\n", movie[i].movie_id, movie[i].movie_name, movie[i].show_time); } printf("===================================\n"); //选择电影 printf("请输入您要选择的电影编号:"); scanf("%d", &movie_id); //选择座位 printf("请选择您要选择的座位:"); scanf("%d%d", &row, &col); if(movie[movie_id-1].seat[row-1][col-1] == 1) { printf("该座位已被占用,请重新选择!\n"); ticket_menu(); } else { movie[movie_id-1].seat[row-1][col-1] = 1; printf("选票成功!\n"); } } ``` 4.退票功能 编写退票函数,根据输入的电影编号和座位号来退票。 ``` void refund_ticket() { printf("请输入您要退票的电影编号和座位号:"); scanf("%d%d%d", &movie_id, &row, &col); if(movie[movie_id-1].seat[row-1][col-1] == 0) { printf("该座位未被占用!\n"); } else { movie[movie_id-1].seat[row-1][col-1] = 0; printf("退票成功!\n"); } } ``` 5.查询座位情况 编写查询座位情况函数,显示每个电影的座位情况。 ``` void seat_status() { printf("===================================\n"); printf("| 座位情况 |\n"); printf("===================================\n"); printf("| 电影编号 | 电影名称 | 放映时间 |\n"); printf("===================================\n"); //显示每个电影的座位情况 for(int i=0; i<MOVIE_NUM; i++) { printf("| %d | %s | %s |\n", movie[i].movie_id, movie[i].movie_name, movie[i].show_time); printf("|---------------------------------|\n"); printf("| 座位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10|\n"); printf("|---------------------------------|\n"); for(int j=0; j<5; j++) { printf("| 第%d排 |", j+1); for(int k=0; k<10; k++) { printf(" %d |", movie[i].seat[j][k]); } printf("\n"); } printf("===================================\n"); } } ``` 6.完整代码 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MOVIE_NUM 3 struct Movie { int movie_id; //电影编号 char movie_name[30]; //电影名称 char show_time[20]; //放映时间 float price; //票价 int seat[5][10]; //座位情况,0表示空位,1表示已售出 }; struct Movie movie[MOVIE_NUM] = { {1, "复仇者联盟4", "2020-01-01 08:00", 50, {0}}, {2, "海绵宝宝", "2020-01-01 10:00", 30, {0}}, {3, "阿凡达", "2020-01-01 12:00", 40, {0}} }; void main_menu() { printf("===================================\n"); printf("| 电影院选票管理系统 |\n"); printf("===================================\n"); printf("| 1. 选票 |\n"); printf("| 2. 退票 |\n"); printf("| 3. 查询座位情况 |\n"); printf("| 4. 退出系统 |\n"); printf("===================================\n"); } void ticket_menu() { int movie_id, row, col; printf("===================================\n"); printf("| 电影列表 |\n"); printf("===================================\n"); printf("| 电影编号 | 电影名称 | 放映时间 |\n"); printf("===================================\n"); //显示电影列表 for(int i=0; i<MOVIE_NUM; i++) { printf("| %d | %s | %s |\n", movie[i].movie_id, movie[i].movie_name, movie[i].show_time); } printf("===================================\n"); //选择电影 printf("请输入您要选择的电影编号:"); scanf("%d", &movie_id); //选择座位 printf("请选择您要选择的座位:"); scanf("%d%d", &row, &col); if(movie[movie_id-1].seat[row-1][col-1] == 1) { printf("该座位已被占用,请重新选择!\n"); ticket_menu(); } else { movie[movie_id-1].seat[row-1][col-1] = 1; printf("选票成功!\n"); } } void refund_ticket() { int movie_id, row, col; printf("请输入您要退票的电影编号和座位号:"); scanf("%d%d%d", &movie_id, &row, &col); if(movie[movie_id-1].seat[row-1][col-1] == 0) { printf("该座位未被占用!\n"); } else { movie[movie_id-1].seat[row-1][col-1] = 0; printf("退票成功!\n"); } } void seat_status() { printf("===================================\n"); printf("| 座位情况 |\n"); printf("===================================\n"); printf("| 电影编号 | 电影名称 | 放映时间 |\n"); printf("===================================\n"); //显示每个电影的座位情况 for(int i=0; i<MOVIE_NUM; i++) { printf("| %d | %s | %s |\n", movie[i].movie_id, movie[i].movie_name, movie[i].show_time); printf("|---------------------------------|\n"); printf("| 座位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10|\n"); printf("|---------------------------------|\n"); for(int j=0; j<5; j++) { printf("| 第%d排 |", j+1); for(int k=0; k<10; k++) { printf(" %d |", movie[i].seat[j][k]); } printf("\n"); } printf("===================================\n"); } } int main() { int choice; while(1) { main_menu(); printf("请输入您的选择:"); scanf("%d", &choice); switch(choice) { case 1: ticket_menu(); break; case 2: refund_ticket(); break; case 3: seat_status(); break; case 4: exit(0); break; default: printf("请输入正确的选项!\n"); break; } } return 0; } ``` 以上是一个简单的电影院选票系统的实现思路,你可以根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值