OC-《购票系统》

时间:2023-03-09 13:10:34
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 流程分析

OC-《购票系统》

--2-- 原型展示

2.1 界面展示

-->欢迎界面

OC-《购票系统》

-->选择购买电影票

OC-《购票系统》

-->选择影片

OC-《购票系统》

-->选择座位号

OC-《购票系统》

-->购票

OC-《购票系统》

--3-- 系统设计

3.1 类设计

OC-《购票系统》

基础信息类:

类名: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 = ; i < ; i++){
MovieTicket *ticket = [[MovieTicket alloc] init]; ticket.name = [NSString stringWithFormat:@"《忍者神龟%d》", i + ];
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 = ; //时长 _tickets[i] = ticket;
}
}
return self;
} /**
* 开始购买电影票
*/
- (void)doBuyTicket{
printf("开始购票\n"); //显示正在上映的电影
[self doList];
} /**
* 选择座位排数
*/
- (void)doSelectRow{
[self doPrintSeat];
printf("请输入您选择的排数:\n"); scanf("%d", &num);
if (num > && num < ROW){
_tickets[_selectNO - ].rowNum = num; [self doSelectCol];
} else{
NSLog(@"非法输入");
return;
} } /**
* 选择座位号
*/
- (void)doSelectCol{
NSLog(@"您输入的排数是%d,请输入您要的座位号:\n", _tickets[_selectNO - ].rowNum); scanf("%d", &num);
if (num > && num < COL){
_tickets[_selectNO - ].colNum = num;
printf("您选择的座位是:%d排 %d号,是否确认? 1.确认 0.取消\n", _tickets[_selectNO - ].rowNum, _tickets[_selectNO - ].colNum);
scanf("%d", &num); if (num == ) {
[self doPay]; } else if (num == ){
NSLog(@"程序正在退出...");
} else{
NSLog(@"非法输入");
return;
}
} } /**
* 选择电影
*/
- (void)doSelectMovie{
printf("请您选择您要观看的影片编号:\n"); scanf("%d", &num); if (num > && num < LEN ) {
self.selectNO = num; NSLog(@"\n您选择的影片为:\n编号:%d, 影片名:%@", self.selectNO, _tickets[_selectNO - ].name);
[self doSelectRow]; //选择排数 } else{
printf("您输入的影片编号不存在");
printf("系统正在推出...");
return;
} } /**
* 影院正在上映的影片
*/
- (void)doList{
NSLog(@"%@影院正在上映的影片:", self.cinemaName);
for (int i = ; i < ; 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 - ].rowNum, _tickets[_selectNO - ].colNum); }else{
NSLog(@"\n当前影厅共有%d排 * %d列的座位", ROW, COL);
printf("您可以选择的座位:\n");
}
for (int i = -; i < ROW; i++){ //多打印一行和一列编号,所以从-1开始
for (int j = -; j < COL; j++) {
if (i == _tickets[_selectNO - ].rowNum - && j == _tickets[_selectNO - ].colNum - && flag) {
printf("%2c ", '@'); flag = false; //出票完后需将flag重置
} else{
if (j == -) {
printf("%02d ", i + );
} else if (i == -){
printf("%02d ", j + );
} else{
printf("%2c ", '+');
}
}
}
printf("\n");
} } /**
* 支付
*/
- (void)doPay{
NSLog(@"\n请确认要购买的商品信息:\n片名:%@,影院:%@, 观看时间:%@ \n金额:%.2f\n是否确认? 1.确认 0.取消\n", _tickets[_selectNO - ].name, _cinemaName, _tickets[_selectNO - ].startTime, _tickets[_selectNO - ].moviePrice);
scanf("%d", &num);
if (num == ) {
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 :
[[[Cinema alloc] initWithCinemaName:@"柯南"] doBuyTicket]; //开始购票
break;
case :
NSLog(@"演唱会门票同理实现~~");
break;
default:
NSLog(@"\n非法输入");
return ;
}
return ;
}
@end

6)调用程序

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

【写在结尾:】

『没有失败,只有放弃』