# C習題6-21
###### tags: `C習題`
## 題目:
>航空公司訂位, 一個班機10個座位分兩種等級(頭等艙&經濟艙)各一半, 使用一個一維陣列儲存座位狀態, 設計一個訂位系統, 包含:艙等選擇, 印出登機證(包含艙等&座位號碼),若其一艙等客滿可詢問更換艙等功能.
## 流程圖:
START -->輸入訂位艙等-->確認座位是否可用(回傳頭等/經濟艙客滿狀態)
-->條件狀態:
| 狀態 | | | | |
|:----------------------------- |:--- |:--- |:--- |:--- |
| 頭等艙狀態(0=客滿,1=還有空位) | 1 | 0 | 1 | 0 |
| 經濟艙狀態(0=客滿,1=還有空位) | 0 | 1 | 1 | 0 |
| 輸入頭等艙=1 | A | E | A | X |
| 輸入經濟艙=2 | E | A | A | X |
-->**狀態A**:印出登機證-->END
-->**狀態E**:詢問更換艙等
---->Y, 印出登機證(狀態A)-->END
---->N, 客滿,印出下一班機資訊(狀態X)-->END
-->**狀態X**:客滿,印出下一班機資訊-->END
## code:
```c=
#include <stdio.h>
#define SEAT 10 /* there are 10 seats in a flight*/
#define FCLS 4 /*0-4, 5 seats*/
#define ECO 9 /*5-9, 5 seats*/
/*Function Prototype*/
int initialArray(int s[SEAT], int a);
int checkSpaceFCLS(int s[SEAT], int i);
int checkSpaceECO(int s[SEAT], int i);
int printArray(int s[SEAT], int a);
int printBoardingPass(int class, int s[SEAT], int i);
int exprintBoardingPass(int class, int s[SEAT], int i);
int main()
{
int class,FCLSstatus,ECOstatus;
int s[SEAT]; /*= {0,0,0,0,0,1,1,1,1,1};*/
int change;
initialArray(s,SEAT); /* initial array before while loop*/
/*printArray(s,SEAT); */ /*check array be initial*/
printf("\n");
printf("Please type 1 for First class:\n");
printf("Please type 2 for Economy:\n");
printf("key in -1 to cancel:\n");
scanf("%d",&class);
while(class!= -1) {
printArray(s,SEAT);
printf("\n");
FCLSstatus = checkSpaceFCLS(s,SEAT);
ECOstatus = checkSpaceECO(s,SEAT);
/*printf("\nclass = %d",class);
printf("\nFCLSstatus = %d\n",FCLSstatus);
printf("ECOstatus = %d\n",ECOstatus);*/
if((class == 1 && FCLSstatus == 1 && ECOstatus == 0) || (class == 2 && FCLSstatus == 0 && ECOstatus == 1) || (class == 1 && FCLSstatus == 1 && ECOstatus == 1) || (class == 2 && FCLSstatus == 1 && ECOstatus == 1))
{
/*printf("\nclass = %d",class);*/
printBoardingPass(class,s,SEAT);
}
if((class == 1 && FCLSstatus == 0 && ECOstatus == 0) || (class == 2 && FCLSstatus == 0 && ECOstatus == 0))
{
/*printf("\nclass = %d",class);*/
printf("Seats are not avaliable now, Your next flight will arrived tomorror\n");
}
if((class == 1 && FCLSstatus == 0 && ECOstatus == 1) || (class == 2 && FCLSstatus == 1 && ECOstatus == 0) )
{
/*printf("\nclass = %d",class);*/
printf("Selected class in not avaliable, would you like to change class?(9/0)\n");
/*printf("\nclass = %d",class);*/
scanf("%d",&change);
printf("\nclass = %d",class);
switch(change){
case 9:
/*case 9:*/
exprintBoardingPass(class,s,SEAT);
break;
case 0:
/*case 0:*/
printf("Seats are not avaliable now, Your next flight will arrived tomorror\n");
break;
}
}
printf("\n\n\n");
printf("Please type 1 for First class:\n");
printf("Please type 2 for Economy:\n");
printf("key in -1 to cancel:\n");
scanf("%d",&class);
}
printf("*************************\n");
printf("Thank you for your visit!\n");
printf("*************************\n");
return 0;
}
int printArray(int s[SEAT], int a)
{
int i;/*counter*/
printf("Array Status:\n");
for(i=0;i<a;i++) {
printf("%d\t",s[i]);
}
return 0;
}
int initialArray(int s[SEAT], int a)
{
int i;/*counter*/
for(i=0;i<a;i++) {
s[i] = 1;
}
return s[SEAT];
}
int checkSpaceFCLS(int s[SEAT], int i) /*check array status, return FCLSstatus, ECOstatus;value = 1 means avaliable, value = 0 means not avaliable*/
{
int FCLSstatus,sumFCLS;
for(i=0;i<=FCLS;i++) {
sumFCLS += s[i];
}
if(sumFCLS == 0) {
FCLSstatus = 0;
/*return FCLSstatus;*/
} else {
FCLSstatus = 1;
/*return FCLSstatus;*/
}
}
int checkSpaceECO(int s[SEAT], int i)
{
int ECOstatus,sumECO;
for(i=5;i<=ECO;i++) {
sumECO += s[i];
}
if(sumECO == 0) {
ECOstatus = 0;
/*return ECOstatus;*/
} else {
ECOstatus = 1;
/*return ECOstatus;*/
}
}
int printBoardingPass(int class, int s[SEAT], int i)
{
int c, FCLSseat, ECOseat;
printf("Welcome Aboard\n");
switch(class) {
case 1:
for(c=0;c<=4;c++)
{
if(s[c] == 0)
{
continue;
}
if(s[c] != 0)
{
s[c] = 0;
FCLSseat = c + 1;
}
break;
}
printf("YOUR SEAT\nFirst Class\nNo.%d\n",FCLSseat);
break;
case 2:
for(c=5;c<=9;c++)
{
if(s[c] == 0)
{
continue;
}
if(s[c] != 0)
{
s[c] = 0;
ECOseat = c + 1;
}
break;
}
printf("YOUR SEAT\nEco Class\nNo.%d\n",ECOseat);
break;
}
}
int exprintBoardingPass(int class, int s[SEAT], int i)
{
int c, FCLSseat, ECOseat;
printf("Welcome Aboard\n");
/*printf("class = %d\n",class);*/
switch(class)
{
case 1:
for(c=5;c<=9;c++)
{
if(s[c] == 0)
{
continue;
}
if(s[c] != 0)
{
s[c] = 0;
ECOseat = c + 1;
}
break;
}
printf("YOUR SEAT\nEco Class\nNo.%d\n",ECOseat);
break;
case 2:
for(c=0;c<=4;c++)
{
if(s[c] == 0)
{
continue;
}
if(s[c] != 0)
{
s[c] = 0;
FCLSseat = c + 1;
}
break;
}
printf("YOUR SEAT\nFirst Class\nNo.%d\n",FCLSseat);
break;
}
}
```
## 心得
* 想流程圖花了很多時間
* 因為現在函式都用return傳值, 所以只能回傳1個值, 讓叫用函式後回傳值指定到變數裡面儲存狀態.以後應該要找看看有沒有引數丟進去可以回傳多個值的方法。
* 兩個if會沒動作-->這應該是scanf造成變數被修改, 需要用switch多重選擇式
* Printbordingpass沒有傳結果值回來...有執行print但是中間的switch壞掉 . scanf 一個字元後, class值被清0?(Why?)-->最後確認在scanf之後, class被清空,只好把確認對話框改成數字判斷
拼拼湊湊出來的程式碼, 一開始先把I/O做出來, 初始化陣列(檢查功能時用指定陣列數字), 然後scanf一個值(艙等)作為最初的狀態判斷, 再進到while迴圈,檢查陣列狀態後回傳個別艙等的狀態值, 再依照艙等狀態、艙等狀態做switch判斷式, 跑3個case(A&E&X).印出登機證的功能把陣列更新寫進去, 更換艙等其實是把印出登機證的程式改成反向, 結構都一樣。
原本在檢查陣列時想用一個函式解決, 途中發現一條函式好像只能回傳一個值, 所以先拆成兩個函式寫。checkSpaceFCLS & checkSpaceECO.
不解的是不知道為何scanf 字符進變數change會改到變數class裡面的值(變成0),難道這兩個變數儲存記憶體位置剛好相鄰, 字符進去溢位('\0')跑去其他位置?