轉載請注明出處:明桑Android
這是幫我同學寫的一個C++作業,說實話好久沒寫過C++都有些生疏了。但他們好像還沒學面向對象編程,所以只能是簡單的結構體和輸入輸出的邏輯。
題目要求:
編寫一個航空訂票程序:
假設一等艙5個座位,編號為1~5,經濟艙20個座位,編號為1~20
具體要求如下:
當程序開始時,提示輸入乘客姓名,一個名字只能訂一個座位,如果該名字已經訂過座位了,則提示該乘客座位已定及座位號,否則提示輸入艙位類型;
當輸入艙位類型後,如果該艙位已全部訂出,則提示此艙全部訂完,重新選擇艙位類型;否則顯示可以選擇的座位號,注意已經被訂出的座位號不能出現,提示輸入座位號;
艙位類型:只能輸入”F”或”E”,一等艙為F,經濟艙為E,如果輸入其它字符則提示輸入無效。
座位號:只能輸入前面列出可以選擇的座位號,若輸入其它則提示輸入無效。
程序可以為多個乘客訂票,直到輸入名字為”.”;
最後程序按照艙位類型與座位號排序打印出所有訂票信息(座位號及對應乘客姓名)
最終實現效果:
不過既然提到了結構體用來存儲票的信息(其實這就是面向對象思想的早期)。聯系實際,一個結構體代表一個事物,結構體中的字段代表這個事物的屬性;這樣的話,我們可以提取出兩個結構體:座位Seat
和票Ticket
,由於題目給定總共25個座位,意味著25張票,則將它們聲明成全局變量。
//座位,那麼座位有3個基本屬性:座位類型(F/E),座位編號,座位預定狀態(是否已經被預定)
struct Seat{
char type;
int number;
bool isReservation;
}seats[25];
//票,票有兩個屬性,即票需要表明:誰預定了哪個座位,第一個Seat就是我們前面定義的那個結構體。
struct Ticket{
Seat seat;
string passenger_name;
}tickets[25];
我們需要將一些輸出輸入的操作提取成函數,簡化我們的代碼,這裡之所以將輸入提取成input()函數,是因為我們需要不斷輸入,即使出錯,所以為了便於遞歸調用就封裝成函數;
bool check(string name);//檢測是否已購票
void input();//用於執行輸入
void printSeat(char seatType);//顯示剩余座位
void reservation(string name,int seatNumber,char seatType);//購票
void printTickets(string name);//顯示已購票信息
void printError();//顯示輸入不合法
main函數非常簡單,首先需要將座位和票信息初始化,即將它們編號,預定狀態全為“未預定”,然後執行輸入,一個while循環,如果不符合條件就直接跳出while,執行printTickets()打印出所有的訂票信息;
int main()
{
//初始化艙位和票
for(int i=0;i<25;i++){
if(i<5){
seats[i].type='F';
seats[i].number=i+1;
}else{
seats[i].type='E';
seats[i].number=i+1-5;
}
seats[i].isReservation=false;
tickets[i].seat=seats[i];
tickets[i].passenger_name= ;
}
cout<<=================================================<>name){
if(name==.)break;
if(surplusF+surplusE==0){
cout<<
很遺憾所有票已購完!
;
break;
}
if(check(name)){
cout<<
您已購票,購票信息:
<
4,具體函數實現
具體的函數實現邏輯我就不講了,就看代碼吧~
5,完整代碼:
main.cpp
#include
using namespace std;
//定義全局變量,艙位,票,各類型艙位剩余數,便於其它函數全局訪問
int surplusF=5;
int surplusE=20;
int flag=0;
char seat_type;
int seatNumber;
string name;
//座位
struct Seat{
char type;
int number;
bool isReservation;
}seats[25];
//票
struct Ticket{
Seat seat;
string passenger_name;
}tickets[25];
bool check(string name);//檢測是否已購票
void input();//用於執行輸入
void printSeat(char seatType);//顯示剩余座位
void reservation(string name,int seatNumber,char seatType);//購票
void printTickets(string name);//顯示已購票信息
void printError();//顯示輸入不合法
int main()
{
//初始化艙位和票
for(int i=0;i<25;i++){
if(i<5){
seats[i].type='F';
seats[i].number=i+1;
}else{
seats[i].type='E';
seats[i].number=i+1-5;
}
seats[i].isReservation=false;
tickets[i].seat=seats[i];
tickets[i].passenger_name= ;
}
cout<<=================================================<>name){
if(name==.)break;
if(surplusF+surplusE==0){
cout<<
很遺憾所有票已購完!
;
break;
}
if(check(name)){
cout<<
您已購票,購票信息:
<>seat_type;
cin.get();
switch(seat_type){
case 'F':
if(surplusF>0)
cout<<
可選座位號:;
printSeat('F');
if(flag!=0)break;
cin>>seatNumber;
cin.get();
reservation(name,seatNumber,'F');
break;
case 'E':
if(surplusE>0)
cout<<
可選座位號:;
printSeat('E');
if(flag!=0)break;
cin>>seatNumber;
cin.get();
reservation(name,seatNumber,'E');
break;
default:
printError();
input();
break;
}
}
//輸出可選的座位號
void printSeat(char seatType)
{
int full=0;
for(int i=0;i<25;i++){
if(seats[i].isReservation==false){
if(seatType=='F'){
if(surplusF==0){
cout<<
此艙位全部訂完,請重新選擇艙位類型:
;
full++;
break;
}
cout<4){
cout<20){
printError();
}
else{
switch(seatType){
case 'F':
if(seatNumber>0&&seatNumber<6){
if(seats[seatNumber-1].isReservation==false){
seats[seatNumber-1].isReservation=true;
tickets[seatNumber-1].seat=seats[seatNumber-1];
tickets[seatNumber-1].passenger_name=name;
surplusF--;
cout<<
恭喜 +name+ 訂票成功!<0&&seatNumber<=20){
if(seats[seatNumber+4].isReservation==false){
seats[seatNumber+4].isReservation=true;
tickets[seatNumber+4].seat=seats[seatNumber+4];
tickets[seatNumber+4].passenger_name=name;
surplusE--;
cout<<
恭喜 +name+ 訂票成功!<
Tips:
如果某些偷懶的家伙正好是做這個課程大作業搜到這兒了,希望你能在看懂的基礎上自己多改改,畢竟這是我替同學寫的,要是你們都一樣,豈不要尴尬了,O(∩_∩)O哈哈~