来个命令行的购票系统

 

–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("开始购票\n");
        
    //显示正在上映的电影
    [self doList];
}


/**
 * 选择座位排数
 */
- (void)doSelectRow{
    [self doPrintSeat];
    printf("请输入您选择的排数:\n");
    
    scanf("%d", &num);
    if (num > 0 && num < ROW){
        _tickets[_selectNO - 1].rowNum = num;
        
        [self doSelectCol];
    } else{
        NSLog(@"非法输入");
        return;
    }

}

/**
 * 选择座位号
 */
- (void)doSelectCol{
    NSLog(@"您输入的排数是%d,请输入您要的座位号:\n", _tickets[_selectNO - 1].rowNum);

    scanf("%d", &num);
    if (num > 0 && num < COL){
        _tickets[_selectNO - 1].colNum = num;
        printf("您选择的座位是:%d排 %d号,是否确认? 1.确认  0.取消\n", _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("请您选择您要观看的影片编号:\n");

    scanf("%d", &num);
    
    if (num > 0 && num < LEN ) {
        self.selectNO = num;
        
        NSLog(@"\n您选择的影片为:\n编号:%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(@"\n编号:%d\n影片名:%@,  时长%d, 主演:%@\n上映时间:%@, 开场时间:%@, 票价:%.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号:\n",_tickets[_selectNO - 1].rowNum, _tickets[_selectNO - 1].colNum);
        
    }else{
        NSLog(@"\n当前影厅共有%d排 * %d列的座位", ROW, COL);
        printf("您可以选择的座位:\n");
    }
    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("\n");
    }

}


/**
 *  支付
 */
- (void)doPay{
    NSLog(@"\n请确认要购买的商品信息:\n片名:%@,影院:%@, 观看时间:%@ \n金额:%.2f\n是否确认? 1.确认  0.取消\n", _tickets[_selectNO - 1].name, _cinemaName, _tickets[_selectNO - 1].startTime, _tickets[_selectNO - 1].moviePrice);
    scanf("%d", &num);
    if (num == 1) {
        printf("正在支付,请稍后...");
        printf("支付成功!\n");
        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("********欢迎您使用购票系统********\n");
    printf("您可以使用本系统购买: 1.电影票  2.演唱会票\n请您输入要购买的编号:\n");
}

/**
 *  程序开关
 */
+ (int) startProgram{
    [self startView];
    
    //接收键盘输入
    int num;
    scanf("%d", &num);
    
    switch (num) {
        case 1:
            [[[Cinema alloc] initWithCinemaName:@"柯南"] doBuyTicket]; //开始购票
            break;
        case 2:
            NSLog(@"演唱会门票同理实现~~");
            break;
        default:
            NSLog(@"\n非法输入");
            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;
}

 

 

【写在结尾:】

『没有失败,只有放弃』

版权声明:本文为wang-biao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wang-biao/p/5664556.html