2015年6月4日 星期四

d460:山六九之旅 (14)

d460: 山六九之旅 (14)

更新時間:2016/12/20
內容
  小華每年都會到「山六九」主題樂園去玩,但是隨著年齡的增加,每年要買的門票也不太一樣。給你小華的年齡,請你告訴我他今年的門票多少錢?
  「山六九」主題樂園的票價表如下:
    0 ~ 5 歲兒童免票
    兒童票 (6 ~ 11 歲):590 元
    青少年票 (12 ~ 17 歲):790 元
    成人票 (18 ~ 59 歲):890 元
    敬老票 (60歲以上):399 元
輸入說明
  輸入只有一行,內含一個整數 a (0≤a≤2147483647) 代表小華的年齡。
輸出說明
  依「山六九」的票價表,輸出一個整數,代表小華今年的門票價格。
範例輸入
  15
範例輸出
  750
提示
背景知識
  算術及關係運算子
  你可以只用算術及關係運算子,而不用 if、switch、或 ? : 來寫出這題嗎? (這是「挑戰」而不是「限制」,因為出題者不是系統管理員,不能限制你用這些指令。)



想一想,再看解答~


我的解題想法
  分層判斷年齡。使用邏輯判斷式if。

♠使用判斷式if-else的解法
程式碼
#include <stdio.h>
int main(void){
    int a;
    scanf("%d",&a);
    if(a>=0 && a<=5){
        printf("%d",0);
    }else if(a>=6 && a<=11){
        printf("%d",590);
    }else if(a>=12 && a<=17){
        printf("%d",790);
    }else if(a>=18 && a<=59){
        printf("%d",890);
    }else{
        printf("%d",399);
    }
    return 0;
}
程式碼解析
#1:引入標準輸入/輸出串流。
#2:主程式開始,回傳引數int,沒有參數。
#3:宣告1個整數(int)變數「a」,範圍–2,147,483,648 到 2,147,483,647。
#4:從標準輸入讀取格式化數據。讀取1個整數(%d),指定值給「a」。
#5:邏輯判斷式 if 開始。判斷年齡是否介於0~5歲之間「a>=0 && a<=5」。
#6:將格式化數據顯示到標準輸出。輸出1個整數(%d)「0」。
#7:第二個邏輯判斷式 else if。判斷年齡是否介於6~11歲之間「a>=6 && a<=11」。
#8:將格式化數據顯示到標準輸出。輸出1個整數(%d)「590」。
#9:第三個邏輯判斷式 else if。判斷年齡是否介於12~17歲之間「a>=12 && a<=17」。
#10:將格式化數據顯示到標準輸出。輸出1個整數(%d)「790」。
#11:第四個邏輯判斷式 else if。判斷年齡是否介於18~59歲之間「a>=18 && a<=59」。
#12:將格式化數據顯示到標準輸出。輸出1個整數(%d)「890」。
#13:邏輯判斷式 else。
#14:將格式化數據顯示到標準輸出。輸出1個整數(%d)「399」。
#15:邏輯判斷 if 結束。
#16:主程式回傳整數「0」。
#17:主程式結束。





進階想法:
  延續題目(13)的觀念,關係運算子為「真」時,輸出1;為「假」時,輸出0。運用此觀念,來處理數字的問題。
年齡 票價 與前一年齡票價差
0 ~ 5 0 0
6 ~ 11 590 590
12 ~ 17 790 200
18 ~ 59 890 100
60 ~   399 -491
♠只用算術及關係運算子的解法
程式碼
#include <stdio.h>
int main(void){
    int a;
    scanf("%d",&a);
    printf("%d",(a>=0)*0 + (a>=6)*590 + (a>=12)*200 + (a>=18)*100 + (a>=60)*(-491) );
    return 0;
}
程式碼解析
#1:引入標準輸入/輸出串流。
#2:主程式開始,回傳引數int,沒有參數。
#3:宣告1個整數(int)變數「a」,範圍–2,147,483,648 到 2,147,483,647。
#4:從標準輸入讀取格式化數據。讀取1個整數(%d),指定值給「a」。
#5:將格式化數據顯示到標準輸出。輸出1個整數(%d)「(a>=0)*0 + (a>=6)*590 + (a>=12)*200 + (a>=18)*100 + (a>=60)*(-491)」。
#6:主程式回傳整數「0」。
#7:主程式結束。