アットウィキロゴ

5.9

  1. #include<stdio.h>
  2.  
  3. float calculateCharge(float);
  4.  
  5. main(){
  6. float totalTime = 0;
  7. float totalCharge = 0;
  8. float time, charge;
  9.  
  10. printf("%-8s%10s%10s\n", "クルマ", "駐車時間", "駐車料金");
  11.  
  12. // クルマ1
  13. time = 1.5;
  14. charge = calculateCharge(time);
  15. totalTime += time;
  16. totalCharge += charge;
  17. printf("%-8d%10.1f%10.2f\n", 1, time, charge);
  18.  
  19. // クルマ2
  20. time = 4.0;
  21. charge = calculateCharge(time);
  22. totalTime += time;
  23. totalCharge += charge;
  24. printf("%-8d%10.1f%10.2f\n", 2, time, charge);
  25.  
  26. // クルマ3
  27. time = 24.0;
  28. charge = calculateCharge(time);
  29. totalTime += time;
  30. totalCharge += charge;
  31. printf("%-8d%10.1f%10.2f\n", 3, time, charge);
  32.  
  33. // 合計
  34. printf("%-8s%10.1f%10.2f\n", "合計", totalTime, totalCharge);
  35. return 0;
  36. }
  37.  
  38. float calculateCharge(float time){
  39. // 駐車料金(初期値として、基本料金2ドルを含む)
  40. float charge = 2.0;
  41.  
  42. // 駐車時間が3時間以上のとき、
  43. // 1時間につき、0.5ドルの追加料金を加算する
  44. if(time > 3){
  45. charge += (int)(time - 3) * 0.5;
  46. }
  47.  
  48. // 徴収は最大10ドルまで
  49. if(charge > 10){
  50. charge = 10;
  51. }
  52.  
  53. return charge;
  54. }
  55.  
  56.  

クルマ    駐車時間  駐車料金
1            1.5     2.00
2            4.0     2.50
3           24.0    10.00
合計         29.5    14.50


  • 問題文の仕様と出力例との間に矛盾があるので、
    出力例に合わせて作った。

    問題文の仕様通りだと、
    ・クルマ1の駐車料金は2.5ドル
    ・クルマ2の駐車料金は4.0ドル
    になるはず。 -- pissyard (2009-12-28 01:28:23)
  • 最初に、関数calculateChargeの引数の値が24.0以上かを
    チェックすると無駄な計算をしなくて済む。


    if ( time >= 24 ) {


    }
    -- 名無しさん (2010-06-12 12:26:16)
  • おもしろそうなので続けてください。
    私もお勉強します。
    気がついた点をメモしました。参考にしてください。
    2010-06-12


    関数 calculateChargeについて
    ----------------------------


    L44 - 45では、駐車料金計算結果が10.0以上で判断しているが、
    最初に、引数の値 time が24.0以上か調べたほうが無駄な計算が
    省けます。


    if ( time >= 24 ) {
    charge = 10.0;
    } else {
    // その他
    }


    L44: time > 3 では意味がわからないので定数を設けたほうがわかり易いし
    変更があった場合、訂正が一箇所で済みます。


    例:
    L40. float charge = 2.0;
    L41. int BASE_TIME = 3;


    L44. if ( time > BASE_TIME ) {
    ......
    }


    この参考書は古いので最新版ではこうなっています。
    int main(void)



    以上
    -- gtk (2010-06-12 12:42:54)
  • 訂正
    ---------


    if ( time >= 24 ) {
    return 10.0
    } else {
    // その他
    }


    main
    -----


    int main(void)

    -- gtk (2010-06-12 12:51:24)
名前:
コメント:
最終更新:2010年06月12日 12:51