来个命令行的购票系统

--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 = ; 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 ;
}

【写在结尾:】

『没有失败,只有放弃』

OC-《购票系统》的更多相关文章

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  3. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  4. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  5. WebViewJavascriptBridge源码探究--看OC和JS交互过程

    今天把实现OC代码和JS代码交互的第三方库WebViewJavascriptBridge源码看了下,oc调用js方法我们是知道的,系统提供了stringByEvaluatingJavaScriptFr ...

  6. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  7. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  8. JS 与OC 交互篇

    完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...

  9. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  10. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

随机推荐

  1. java classpath getResource getResourceAsStream

    1.classpath 用于指定java运行时,jvm寻找class文件以及jar文件的存储目录.jvm依据classpath中出现的jar文件以及目录,依次寻找,直到找到指定class文件. 例:j ...

  2. angular $scope对象

    $scope是一个pojo对象 $scope提供了一些工具方法.例如:$watch() $apply(),一般不会手工去调用 $scope是表达式的执行环境也叫作用域 $scope是一个树形结构,与D ...

  3. solr 设置时区

    问题 solr5.2: 发现打印log时间和真实时间对不上,服务器时间设置没有问题,后来发现,solr需要设置时区 解决方法: 直接修改bin/solr.in.sh 文件 #SOLR_TIMEZONE ...

  4. jQuery 实时监听<input>输入值的变化

    这方法比 on('keydown') 更实时 <input type='text' id='input1'/>$(document).ready(function(){ $('#input ...

  5. Source Insight 3.X 插件新loader发布

    [前言] 大约一年多没更新SI插件了,主要原因是我从SI换到了sublime,使用SI少了,插件也就停止更新了.不过看到园子里这么多网友的留言,觉得还是有必要更新一下,算是给还在用SI的朋友们一个交代 ...

  6. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  7. http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/index.html

    http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/index.html

  8. 编写bat(批处理文件)的优势

    以前编写java小程序打成jar包运行的时候非常麻烦,在dos环境先cd进入那个文件夹,再运行java -jar *.jar,自从看了bat以后,发现.bat真的是dos下面运行的好帮手. @echo ...

  9. MYSQL相关完整笔记

    useradd mysql -s /sbin/nologin cat/etc/passwd | grep mysqlcat /etc/group | grep mysql 源目录 cd /usr/sr ...

  10. 给div加上背景图片

    <div class="panel-body" style="background:url('pages/upload/brief/img/bg.jpg');bac ...