• OC-《购票系统》


    来个命令行的购票系统

    --1-- 需求分析
    1.1 分析
    1.2 功能分析
    1.3 流程分析
    --2-- 原型展示
    2.1 界面原型
    --3-- 系统设计
    3.1 类设计
    3.2 框架模块设计
    --4-- 实现
    4.1 代码实现

    ------------------------- 

    【写在开头:】

    『如今使用移动设备购物、买票都已经是一种基本的生活方式了,使用手机方便了我们日常的生活。没有使用UI框架,所以还是采用命令行交互的方式,完成这个购票系统,用以巩固OC的知识』

     

     

    --1-- 需求分析

    1.1 分析

    进入电影院我们首先看到的是各种影讯,然后根据影讯选择我们要观看的电影,选择观看时间,选座位,付款,之后会收到一张票,票上面标明了影片名称,影片放映时间等信息

    • 要有影讯信息
    • 选择要看的电影
    • 选择座位
    • 打印票据信息

    1.2 功能分析

      1、选择购票种类

      思路:

      1)定义变量保存用户选择的结果

      2)提示信息,让用户选择

      3)分别定义两个函数,购买电影票和演唱会票

      4)在函数中创建电影院对象,调用购票方法

     

      2显示最新上映的影片信息

      思路:

      1)重写电影院类的构造方法

      2)初始化影片的数组

      3)通过for循环遍历数组,显示所有影片信息

     

      3选择影片

      思路:
      1)选择影片编号

      2)保存选择的影片信息

     

      4、《购票系统》选择座位信息

      思路:

      1)初始化座位信息

      2)显示座位信息

      3)选择排数

      4)选择座位数

      5)购票再次确认

     

      5、打印电影票

      思路:

      1)提示购票成功

      2)打印购票信息

      3)显示座位信息

    1.3 流程分析

    --2-- 原型展示

    2.1 界面展示

    -->欢迎界面

    -->选择购买电影票

    -->选择影片

    -->选择座位号

    -->购票

    --3-- 系统设计

    3.1 类设计

    基础信息类:

    类名:Common(公有类)

    属性:名称、时长、主演、导演、上映时间、编号

    票类:

    类名:Ticket

    属性:座位排数、座位号、开始时间、地点

    方法:打印票信息

     

    电影票类:

    类名:MovieTicket

    属性:票价、影票编号 

    电影院类:

    类名:Cinema

    属性:名称、影厅、电影票集合

    方法:

    查看所有的电影信息

    选择一部电影

    选择多少排

    选择座位数

    出票

    3.2 框架模块

    系统的框架大概分为:

    1. 提示信息输出模块
    2. 影院影片输出模块
    3. 购买电影票模块
    4. 选择座位号(行、列)模块
    5. 出票(输出座位号,支付等)模块

    --4-- 实现

    4.1 代码实现

    1)基础信息类

    #import <Foundation/Foundation.h>
    
    /**
     *  基础信息类
         属性:名称、时长、主演、导演、上映时间、编号
     */
    @interface Common : NSObject
    
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, assign) int longTime; //时长
    @property (nonatomic, strong) NSString *actor; //主演
    @property (nonatomic, strong) NSString *director; //导演
    @property (nonatomic, strong) NSString *viewTime; //上映时间
    @property (nonatomic, assign)int cNO; //编号
    @end

    为提高程序效率,@property参数使用nonatomic多线程

    2)票类

    #import "Common.h"
    
    /**
     *  票类 继承自公有类
        其特有属性是:地点、开场时间、座位排数、座位号
     */
    @interface Ticket : Common
    
    @property (strong, nonatomic) NSString *place; //地址
    @property (strong, nonatomic) NSString *startTime; //开场时间
    @property (assign, nonatomic) int rowNum; //
    @property (assign, nonatomic) int colNum; //座位号
    @end

    3)电影票类

    #import "Ticket.h"
    
    /**
     *  电影票类 继承自票类
        其特有属性是:票价、影票编号
     */
    @interface MovieTicket : Ticket
    
    @property (nonatomic, assign) float moviePrice; //票价
    @property (nonatomic, assign) int movieNO; //电影票编号
    @end

    4)电影院类

    Cinema.h

    #import <Foundation/Foundation.h>
    
    //*******宏
    #define LEN 5 //电影票数组长度
    #define  ROW  5 //
    #define  COL  10 //
    
    @class MovieTicket;
    
    /**
     *  电影院类
        属性:电影院名称、票的集合
        方法:选择排、选择座位号、选择电影、打印票
     */
    @interface Cinema : NSObject
    
    //声明一个集合属性,存储电影票对象
    {
        //存储电影票对象
        MovieTicket *_tickets[LEN]; //电影票的集合
    }
    
    @property (nonatomic, strong) NSString *cinemaName; //电影院名称
    @property (nonatomic, assign) int selectNO; //用户选择的电影编号
    
    //自定义构造方法
    - (instancetype)initWithCinemaName:(NSString *)name;
    
    - (void)doBuyTicket; //购买票
    - (void)doSelectRow; //选择座位排数
    - (void)doSelectCol; //选择座位号
    - (void)doSelectMovie; //选择电影
    - (void)doList; //列出放映影片
    - (void)doPrintSeat; //打印座位图
    - (void)doPay; //支付
    @end

    Cinema.m

    #import "Cinema.h"
    #import "MovieTicket.h"
    
    //*******外部变量
    BOOL flag = false; //flag用来控制是否购票成功的座位和输出显示
    int num; //存储键盘输入
    //*************
    
    @implementation Cinema
    
    /**
     *  初始化电影院信息
     *
     *  @param name 初始化电影院名称
     *
     *  @return 电影院类型
     */
    - (instancetype)initWithCinemaName:(NSString *)name{
        if (self = [super init]){ //初始化父类空间
            _cinemaName = name;
            
            //初始化电影票
            for (int i = 0; i < 5; i++){
                MovieTicket *ticket = [[MovieTicket alloc] init];
                
                ticket.name = [NSString stringWithFormat:@"《忍者神龟%d》", i + 1 ];
                ticket.place = @"高新区";
                ticket.movieNO++; //电影票编号
                
                
                ticket.viewTime = [NSString stringWithFormat:@"20%02d - 11 - 11", i]; //上映时间
                ticket.startTime =[NSString stringWithFormat:@"1%d:00", i]; //开场时间
                ticket.actor = [NSString stringWithFormat:@"柯南/超人"];
                ticket.director = @"小乔";
                ticket.moviePrice = 12.5f; //票价
                ticket.longTime = 120; //时长
                
                _tickets[i] = ticket;
            }
        }
        return self;
    }
    
    
    /**
     * 开始购买电影票
     */
    - (void)doBuyTicket{
        printf("开始购票
    ");
            
        //显示正在上映的电影
        [self doList];
    }
    
    
    /**
     * 选择座位排数
     */
    - (void)doSelectRow{
        [self doPrintSeat];
        printf("请输入您选择的排数:
    ");
        
        scanf("%d", &num);
        if (num > 0 && num < ROW){
            _tickets[_selectNO - 1].rowNum = num;
            
            [self doSelectCol];
        } else{
            NSLog(@"非法输入");
            return;
        }
    
    }
    
    /**
     * 选择座位号
     */
    - (void)doSelectCol{
        NSLog(@"您输入的排数是%d,请输入您要的座位号:
    ", _tickets[_selectNO - 1].rowNum);
    
        scanf("%d", &num);
        if (num > 0 && num < COL){
            _tickets[_selectNO - 1].colNum = num;
            printf("您选择的座位是:%d排 %d号,是否确认? 1.确认  0.取消
    ", _tickets[_selectNO - 1].rowNum, _tickets[_selectNO - 1].colNum);
            scanf("%d", &num);
            
            if (num == 1) {
                [self doPay];
                
            } else if (num == 0){
                NSLog(@"程序正在退出...");
            } else{
                NSLog(@"非法输入");
                return;
            }
        }
        
    }
    
    /**
     * 选择电影
     */
    - (void)doSelectMovie{
        printf("请您选择您要观看的影片编号:
    ");
    
        scanf("%d", &num);
        
        if (num > 0 && num < LEN ) {
            self.selectNO = num;
            
            NSLog(@"
    您选择的影片为:
    编号:%d, 影片名:%@", self.selectNO, _tickets[_selectNO - 1].name);
            [self doSelectRow]; //选择排数
            
        } else{
            printf("您输入的影片编号不存在");
            printf("系统正在推出...");
            return;
        }
    
    }
        
    /**
     *  影院正在上映的影片
     */
    - (void)doList{
        NSLog(@"%@影院正在上映的影片:", self.cinemaName);
        for (int i = 0; i < 5; i++) {
            NSLog(@"
    编号:%d
    影片名:%@,  时长%d, 主演:%@
    上映时间:%@, 开场时间:%@, 票价:%.2f", _tickets[i].movieNO, _tickets[i].name, _tickets[i].longTime, _tickets[i].actor, _tickets[i].viewTime, _tickets[i].startTime, _tickets[i].moviePrice);
        }
        
        [self doSelectMovie]; //选择电影
    }
    
    /**
     *  打印座位图
     */
    - (void)doPrintSeat{
        if (flag) {
            printf("购票成功,您的座号是%d排%d号:
    ",_tickets[_selectNO - 1].rowNum, _tickets[_selectNO - 1].colNum);
            
        }else{
            NSLog(@"
    当前影厅共有%d排 * %d列的座位", ROW, COL);
            printf("您可以选择的座位:
    ");
        }
        for (int i = -1; i < ROW; i++){ //多打印一行和一列编号,所以从-1开始
            for (int j = -1; j < COL; j++) {
                if (i == _tickets[_selectNO - 1].rowNum - 1 && j == _tickets[_selectNO - 1].colNum - 1 && flag) {
                    printf("%2c ", '@');
                    
                    flag = false; //出票完后需将flag重置
                } else{
                    if (j == -1) {
                        printf("%02d ", i + 1);
                    } else if (i == -1){
                        printf("%02d ", j + 1);
                    } else{
                        printf("%2c ", '+');
                    }
                }
            }
            printf("
    ");
        }
    
    }
    
    
    /**
     *  支付
     */
    - (void)doPay{
        NSLog(@"
    请确认要购买的商品信息:
    片名:%@,影院:%@, 观看时间:%@ 
    金额:%.2f
    是否确认? 1.确认  0.取消
    ", _tickets[_selectNO - 1].name, _cinemaName, _tickets[_selectNO - 1].startTime, _tickets[_selectNO - 1].moviePrice);
        scanf("%d", &num);
        if (num == 1) {
            printf("正在支付,请稍后...");
            printf("支付成功!
    ");
            flag = true;
            [self doPrintSeat];
        }
    }
    
    @end

    5)程序开关

    ProgramSwitch.h

    /**
     *  购票系统开关
     */
    @interface ProgramSwitch : NSObject
    
    + (int) startProgram; //开启程序
    @end

    ProgramSwitch.m

    #import "ProgramSwitch.h"
    #import "Cinema.h"
    
    @implementation ProgramSwitch
    
    /**
     *  启动界面
     */
    + (void) startView{
        printf("********欢迎您使用购票系统********
    ");
        printf("您可以使用本系统购买: 1.电影票  2.演唱会票
    请您输入要购买的编号:
    ");
    }
    
    /**
     *  程序开关
     */
    + (int) startProgram{
        [self startView];
        
        //接收键盘输入
        int num;
        scanf("%d", &num);
        
        switch (num) {
            case 1:
                [[[Cinema alloc] initWithCinemaName:@"柯南"] doBuyTicket]; //开始购票
                break;
            case 2:
                NSLog(@"演唱会门票同理实现~~");
                break;
            default:
                NSLog(@"
    非法输入");
                return 1;
        }
        return 0;
    }
    @end

    6)调用程序

    #import <Foundation/Foundation.h>
    #import "ProgramSwitch.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            [ProgramSwitch startProgram]; //开启程序
        }
        return 0;
    }

    【写在结尾:】

    『没有失败,只有放弃』

    ☂业精于勤,荒于嬉;行成于思,毁于随。☂
  • 相关阅读:
    js-事件委托
    compass的使用
    Ruby与sass 与compass安装
    JavaScript对象属性 constructor
    JQuery中常用的 属性选择器
    css3新增的背景属性
    js操作符
    Python04---重要函数
    Python03---内置模块
    Python02---整数,字符串,元组,列表,集合,字典
  • 原文地址:https://www.cnblogs.com/wang-biao/p/5664556.html
Copyright © 2020-2023  润新知