標籤:objective-c 購票系統 系統需求分析
電影院買票系統/演唱會買票系統
需求分析:
首先我們進入系統,然後會選擇買電影票還是買演唱會票,所以這牽扯兩個系統的合成。但是我們知道都是買票系統,所以我們可以先建立一個類,屬於購買電影票和演唱會的票的共同點,我們可以建立一個Ticket,讓電影票MovieTicket和演唱會票ConcertTicket都去繼承Ticket,然後再在MovieTicket和Concert中寫他們各自特有的方法。所以這就牽扯到了三個類。再去想,我們在main函數中調用買電影票buyMovieTicket的方法和買演唱會票buyConcertTicket的方法,嚴格的講,我們應該把他們定義成函數,因為我們在這裡不知道用什麼類/執行個體對象去調用這兩個買票的方法,所以我們不如將他們定義成無參方法,然後讓使用者去選擇到底是調用buyMovieTicket還是調用buyConcertTicket方法。
那麼下一步,我們就應該進入這兩個買票的函數了。
(1)思路分析
首先我們先進入buyMovieTicket函數。在這個函數裡我們要調用許許多多的方法,包括買票、顯示正在上映的電影、選擇電影、選擇排數、選擇座位號、支付、出票。那麼想要調用這些方法,我們必然要建立執行個體對象進行調用,那麼我們應該用哪個類去建立對象呢?首先不能用Ticket,因為這個Ticket是一個假象類,並不是實際存在的,那麼用MovieTicket類呢?顯然用MovieTicket類執行個體化一個對象我們應該稱之為是“一張電影票”,然後在這這個電影票的執行個體對象上有很多執行個體變數資訊。顯然電影票是不能調用買票這個方法的(因為我們在得到票之前就要調用買票的方法了)。那麼我們顯然要再建立一個類,既然我們平時都去電影院去看電影,那麼我們何不建立一個Cinema類,寓意到了電影院看到電影院提供的資訊,然後進行買票。這樣就合理了許多。那麼Cinema類應該具備哪些執行個體變數還有方法呢?顯然一個電影院應該有一個名字,我們可以設定為_cinemaName,另外進入電影院我們可以看到展示在大螢幕上滾動的電影放映資訊,比如說今天要放5部電影,我們可以建立一個數組,然後去存放這五部電影,然後供使用者選擇。那麼這五部放映的電影應該具備怎樣的屬性(執行個體變數)呢?顯然,電影資訊和電影票資訊相仿,我們可以執行個體化一個MoiveTicket的執行個體數組ticket[5]去儲存這五部電影資訊,然後這個數組中的每一個數群組成員都是一部可能要被使用者觀看的電影資訊,而數群組成員因為是MovieTicket類型的,所以可以繼承MovieTicket中的一些屬性,這樣我們在初始化Cinema執行個體對象的時候就可以重寫構造方法,在建立執行個體對象的同時完成對五部上映影片的資訊數組建立,然後在buyMovieTicket函數中調用第一個對象方法buyTicket,當然buyTicket這個行為是在電影院中產生的,所以buyTicket方法屬於Cinema類。
我們完成了非常重要的一步,也就是重寫構造方法,然後進入buyTicket這個對象方法,然後去調用,進而我們需要完成:顯示正在上映的電影(-(void)list;),選擇電影(-(void)selectMovie;),選擇排數(-(void)selectRow;),選擇座位號(-(void)selectCol;),開始支付(-(void)pay;),出票(-(void)printTicket;)等一系列的方法操作。★而每一個方法結束時都會在方法內部調用第二個方法。直到最後購買完電影票為使用者列印票的資訊。★
具體的步驟就是這樣,具體實現起來大致有這麼兩個難題:第一,我們應該清楚怎麼在合適的位置定義這些屬性(執行個體變數);第二,我們應該知道這些方法具體應該怎麼實現。
好了到現在,buyMovieTicket 這個函數需要進行的操作乃至後面的一系列操作我們已經考慮到了,在思路分析這一個環節我們做這麼多就夠了,接下來就是寫代碼部分。
(2)代碼部分
時間原因我們唯寫了購買電影票的流程,我們沒有寫演唱會票的購買流程。
整個代碼我們分為了兩個檔案夾和一個main函數:(每個檔案夾中獨立出來了各個類的.h和.m檔案)
①Cinema檔案夾
——————————————————Cinema.h——————————————————
#import <Foundation/Foundation.h>
#import "MovieTicket.h"
@interface Cinema : NSObject
{
//電影院的名字
NSString * _cinemaName;
//電影院正在上映的五部影片,都是MovieTicket類型,那麼不妨我們將這些影片對象存在一個MovieTicket類型的數組中
MovieTicket *tickets[5];
}
//當然我覺得我們有必要定義一個新的構造方法
-(instancetype)initWithCinemaName:(NSString *)cinemaName;
//開始購票
-(void)buyTickets;
//顯示正在上映的電影
-(void)listMovies;
//選擇電影
-(void)selectMovies;
//選擇排數
-(void)selectRow;
//選擇座位號
-(void)selectCol;
//開始支付
-(void)payTickets;
//出票(列印票的資訊)
-(void)printTickets;
@end
——————————————————Cinema.h——————————————————
——————————————————Cinema.m——————————————————
#import "Cinema.h"
//定義一個全域變數來記錄電影編號
int selectNo;
//宏定義電影院影廳的行數和列數
#define ROW 8
#define COL 15
@implementation Cinema
//重寫構造方法
-(instancetype)initWithCinemaName:(NSString *)cinemaName
{
if (self=[super init]) {
// 讓_cinemaName等於我們傳進來的cinemaName
_cinemaName=cinemaName;
// 接下來我們要初始化Cinema中的第二個執行個體變數,也就是MovieTicket類型的數組
// 自然我們要用到for迴圈來進行初始化(這個地方注意,雖然是初始化數組中的所有元素,但是我們也是只能保證裡面的個別資訊不同,也就是能迴圈起來值的地方可以做到不同,而一些文字部分,暫時無法做到初始化不一樣的值)
for (int i=0; i<5; i++) {
// for迴圈中每次都執行一次建立一個新的MovieTicket的執行個體對象(共建立5個),然後為其執行個體變數賦值
MovieTicket *mvTicket=[MovieTicket new];
// 電影名稱
mvTicket.name=[NSString stringWithFormat:@"碟中諜 %02d",i+1];
// 導演
[email protected]"王中堯";
// 主演
[email protected]"馬星澤,張桐,鄭二安";
// 影廳資訊
mvTicket.place=[NSString stringWithFormat:@"%02d 廳",i+1];
// 首映時間
mvTicket.showTime=[NSString stringWithFormat:@"200%d-12-31",i];
// 開始時間
mvTicket.startTime=[NSString stringWithFormat:@"1%d:15",i];
// 電影編號
mvTicket.no=i+1;
// 時間長度
mvTicket.lengthTime=120;
// 票價
mvTicket.movieTicketPrice=35;
// 最後把我們初始化完畢的執行個體對象賦給MovieTicket類型的數組
tickets[i]=mvTicket;
}
}
return self;
}
//開始購票
-(void)buyTickets
{
NSLog(@"開始購票!");
// 這裡沒有什麼多餘的實現過程,購票就直接進入下一個方法:顯示正在上映的電影
[self listMovies];
}
//顯示正在上映的電影
/*
思路:
1)利用已有的tickets數組,列印數組資訊
2)遍曆數組
格式:
編號 名稱
導演 主演
開始時間 時間長度
首映時間 影廳資訊
執行票價
*/
//顯示正在上映的電影
-(void)listMovies
{
for (int i=0; i<5 ; i++) {
NSLog(@"\n\n編號:%d 名稱:%@\n導演:%@ 主演:%@\n開始時間:%@ 時間長度:%d\n首映時間:%@ 影廳資訊:%@\n執行票價:%.2f\n\n",tickets[i].no,tickets[i].name,tickets[i].director,tickets[i].actor,tickets[i].startTime,tickets[i].lengthTime,tickets[i].showTime,tickets[i].place,tickets[i].movieTicketPrice);
}
// 選擇電影,進行下一方法
[self selectMovies];
}
//選擇電影
-(void)selectMovies
{
NSLog(@"請選擇你要購買的電影編號並輸入:\n\n");
// 由使用者輸入編號,然後判斷編號是否正確,如果正確,將值賦給建立好的全域變數selectNo
int num;
scanf("%d",&num);
if (num>0||num<=5) {
selectNo=num;
}
else
// 如果輸入錯誤,直接跳出程式
return;
//如果輸入成功,提示選擇的電影
NSLog(@"\n您選擇了%d號電影,名稱為%@\n\n",selectNo,tickets[selectNo-1].name);
// 選擇排數,進行下一方法
[self selectRow];
}
//選擇排數
/*
思路:
1)把電影院的座位資訊都打出來看一下
2)提示,當前影廳有多少排,每排有多少個座位
3)提示讓使用者選擇排數
4) 儲存排數資訊
*/
//選擇排數
-(void)selectRow
{
NSLog(@"\n選擇排數");
NSLog(@"\n下面是該場次的座位資訊:\n\n");
// 先列印電影院位置資訊讓使用者看一下
for (int i=-1; i<ROW; i++) {
for (int j=-1; j<COL; j++) {
if (i==-1) {
printf("%02d ",j+1);
}
else if(j==-1)
{
printf("%02d",i+1);
}
else
printf(" +");
}
printf("\n");
}
// 提示該廳有多少排,每排有幾個座位
printf("\n該廳有%d排,每排有%d個座位\n\n",ROW,COL);
printf("請選擇排數:\n\n");
// 讓顧客選擇排數,輸入排數的時候,最好將顧客輸入的值判斷一下
int num;
scanf("%d",&num);
// 判斷條件:排數必須是1~8之間的數字
if (num>0||num<=8) {
// 將合理的排數賦給rowNum
// 這裡解釋一下selectNo-1,首先上一步驟已經確定了影片的編號,然後影片的實際編號是0~4,所以要在輸入編號的基礎上減一才能用
tickets[selectNo-1].rowNum=num;
}
// 選擇座位,進入下一方法
[self selectCol];
}
//選擇座位號
-(void)selectCol
{
NSLog(@"\n選擇座位號");
int num;
scanf("%d",&num);
if (num>0||num<=15) {
// 將合理的排數賦給rowNum
tickets[selectNo-1].colNum=num;
}
//將使用者選擇的票資訊列印出來讓使用者查看,然後讓使用者確認
//格式:
//您選擇 xxx 影片
//開始時間: 電影時間長度:
//第 xx 排 第 xx 座
//價格:
NSLog(@"\n\n 您選擇的是影片: %@ \n 開始時間: %@ 電影時間長度: %d\n 第 %d 排 第 %d 座位\n 您所支付的票價為: %.2f\n\n",tickets[selectNo-1].name,tickets[selectNo-1].startTime,tickets[selectNo-1].lengthTime,tickets[selectNo-1].rowNum,tickets[selectNo-1].colNum,tickets[selectNo-1].movieTicketPrice);
NSLog(@"\n請確認您的購票資訊:(1.確認 0.取消)\n");
int flag;
scanf("%d",&flag);
if (flag) {
// 支付,進入下一方法
[self payTickets];
}
else
NSLog(@"退出系統!");
}
//開始支付
-(void)payTickets
{
NSLog(@"\n開始支付...........");
NSLog(@"\n請等待!");
NSLog(@"\n支付成功!!!");
[self printTickets];
}
//出票(列印票的資訊)
-(void)printTickets
{
NSLog(@"\n出票");
NSLog(@"\n 您選擇的是影片: %@ \n 開始時間: %@ 電影時間長度: %d\n 第 %d 排 第 %d 座位\n 您所支付的票價為: %.2f\n 影廳:%@\n\n",tickets[selectNo-1].name,tickets[selectNo-1].startTime,tickets[selectNo-1].lengthTime,tickets[selectNo-1].rowNum,tickets[selectNo-1].colNum,tickets[selectNo-1].movieTicketPrice,tickets[selectNo-1].place);
//列印座位資訊表!
for(int i=-1;i<ROW;i++)
{
for (int j=-1; j<COL; j++) {
if((i==tickets[selectNo-1].rowNum-1)&&(j==tickets[selectNo-1].colNum-1))
{
printf(" @ ");
}
else
{
//else裡面的代碼直接可以複製上面
if(i==-1)
//i為0時,表示第1行,這時要將第-1行的位置寫上列標
{
printf("%02d ",j+1);
}
else if(j==-1)
//j為0時,表示第1列,這時要將第-1列的位置寫上行標
{
printf("%02d",i+1);
}
else
printf(" + ");
}
}
printf("\n");
}
}
@end
——————————————————Cinema.m——————————————————
②allTicket檔案夾
——————————————————Ticket.h——————————————————
#import <Foundation/Foundation.h>
@interface Ticket : NSObject
//地點
@property NSString * place;
//首映時間
@property NSString * showTime;
//放映開始時間
@property NSString *startTime;
//時間長度
@property int lengthTime;
//名稱
@property NSString * name;
//導演
@property NSString * director;
//主演
@property NSString * actor;
//排數
@property int rowNum;
//座位號
@property int colNum;
//編號
@property int no;
@end
——————————————————Ticket.h——————————————————
——————————————————Ticket.m——————————————————
#import "Ticket.h"
@implementation Ticket
@end
——————————————————Ticket.m——————————————————
——————————————————MovieTicket.h——————————————————
#import "Ticket.h"
@interface MovieTicket : Ticket
//票價
@property float movieTicketPrice;
//電影票的編號(流水號)
@property int movieTicketNum;
@end
——————————————————MovieTicket.h——————————————————
——————————————————MovieTicket.m——————————————————
#import "MovieTicket.h"
@implementation MovieTicket
@end
——————————————————MovieTicket.m——————————————————
★整個項目就是這麼簡單,總得來說鍛煉我們的不是基礎知識,而是怎麼構建這麼一個架構的頭腦,方方面面都要俱到。我們應該鍛煉這種能力,讓自己具備項目頭腦。
It‘s all !
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C 【完整OC項目-購票系統-系統分析-代碼實現】