您好,登錄后才能下訂單哦!
這是幫我同學寫的一個C++作業,說實話好久沒寫過C++都有些生疏了。但他們好像還沒學面向對象編程,所以只能是簡單的結構體和輸入輸出的邏輯。
題目要求:
編寫一個航空訂票程序:
假設一等艙5個座位,編號為1~5,經濟艙20個座位,編號為1~20
具體要求如下:
當程序開始時,提示輸入乘客姓名,一個名字只能訂一個座位,如果該名字已經訂過座位了,則提示該乘客座位已定及座位號,否則提示輸入艙位類型;
當輸入艙位類型后,如果該艙位已全部訂出,則提示此艙全部訂完,重新選擇艙位類型;否則顯示可以選擇的座位號,注意已經被訂出的座位號不能出現,提示輸入座位號;
艙位類型:只能輸入”F”或”E”,一等艙為F,經濟艙為E,如果輸入其它字符則提示輸入無效。
座位號:只能輸入前面列出可以選擇的座位號,若輸入其它則提示輸入無效。
程序可以為多個乘客訂票,直到輸入名字為”.”;
最后程序按照艙位類型與座位號排序打印出所有訂票信息(座位號及對應乘客姓名)
最終實現效果:
1、變量
不過既然提到了結構體用來存儲票的信息(其實這就是面向對象思想的早期)。聯系實際,一個結構體代表一個事物,結構體中的字段代表這個事物的屬性;這樣的話,我們可以提取出兩個結構體:座位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];
2、函數
我們需要將一些輸出輸入的操作提取成函數,簡化我們的代碼,這里之所以將輸入提取成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();//顯示輸入不合法
3、主體邏輯
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<<"================================================="<<endl; cout<<" 歡迎使用CT票務系統 "<<endl; cout<<"================================================="<<endl; cout<<"乘客姓名:"; while(cin>>name){ if(name==".")break; if(surplusF+surplusE==0){ cout<<"\n很遺憾所有票已購完!\n"; break; } if(check(name)){ cout<<"\n您已購票,購票信息:\n"<<endl; printTickets(name); }else{ cout<<"\n艙位類型 F:一等艙 E:經濟艙\n"; input(); } cout<<"\n乘客姓名:"; } printTickets(""); return 0; }
4、具體函數實現
具體的函數實現邏輯我就不講了,就看代碼吧~
5、完整代碼:
main.cpp
#include<iostream> 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<<"================================================="<<endl; cout<<" 歡迎使用CT票務系統 "<<endl; cout<<"================================================="<<endl; cout<<"乘客姓名:"; while(cin>>name){ if(name==".")break; if(surplusF+surplusE==0){ cout<<"\n很遺憾所有票已購完!\n"; break; } if(check(name)){ cout<<"\n您已購票,購票信息:\n"<<endl; printTickets(name); }else{ cout<<"\n艙位類型 F:一等艙 E:經濟艙\n"; input(); } cout<<"\n乘客姓名:"; } printTickets(""); return 0; } bool check(string name) { for(int i=0;i<25;i++){ if(name==tickets[i].passenger_name) return true; } return false; } //負責輸入,之所以單獨寫成函數,是因為非法輸入的時候需要遞歸調用 void input() { flag=0; cout<<"\n艙位類型(F/E):"; cin>>seat_type; cin.get(); switch(seat_type){ case 'F': if(surplusF>0) cout<<"\n可選座位號:"; printSeat('F'); if(flag!=0)break; cin>>seatNumber; cin.get(); reservation(name,seatNumber,'F'); break; case 'E': if(surplusE>0) cout<<"\n可選座位號:"; 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<<"\n此艙位全部訂完,請重新選擇艙位類型:\n"; full++; break; } cout<<seats[i].number<<" "; if(i==4) break; } if(seatType=='E'){ if(surplusE==0){ cout<<"\n此艙位全部訂完,請重新選擇艙位類型:\n"; full++; break; } if(i>4){ cout<<seats[i].number<<" "; } } } } if(full==0){ cout<<"\n"; cout<<"\n座位號:"; }else{ input(); flag++; } } //輸入無效 void printError() { cout<<"\n輸入無效!"<<endl; } //購票,即改變seats tickets 屬性值 void reservation(string name,int seatNumber,char seatType) { if(seatNumber<1&&seatNumber>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<<"\n 恭喜 "+name+" 訂票成功!"<<endl; break; }else{ printError(); //input(); } }else printError(); break; case 'E': if(seatNumber>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<<"\n 恭喜 "+name+" 訂票成功!"<<endl; break; }else{ printError(); } }else printError(); break; } } } void printTickets(string name) { cout<<"================================================="<<endl; cout<<" 訂 票 信 息 "<<endl; cout<<"================================================="<<endl; cout<<" 艙位類型 座位號 乘客姓名 "<<endl; cout<<"\n"; for(int i=0;i<25;i++){ if(name==tickets[i].passenger_name){ switch(tickets[i].seat.type){ case 'F': cout<<" 頭等艙 "; break; case 'E': cout<<" 經濟艙 "; break; } cout<<tickets[i].seat.number<<" "<<tickets[i].passenger_name<<endl; cout<<"\n"; break; } else if(name==""){ if(tickets[i].seat.isReservation==true){ switch(tickets[i].seat.type){ case 'F': cout<<" 頭等艙 "; break; case 'E': cout<<" 經濟艙 "; break; } cout<<tickets[i].seat.number<<" "<<tickets[i].passenger_name<<endl; cout<<"\n"; } } } cout<<"================================================="<<endl; }
Tips:
如果某些偷懶的家伙正好是做這個課程大作業搜到這兒了,希望你能在看懂的基礎上自己多改改,畢竟這是我替同學寫的,要是你們都一樣,豈不要尷尬了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。