C言語ケーススタディ 駐車料金の計算




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



今回は授業の課題らしき次の問題を解いてみることにします。
駐車料金を出すシステム
        駐車開始時刻を入力し
        終了時刻を入力すると
        料金が表示されるプログラムを作成
問題には開始時刻とありますが日をまたいでしまうと計算できなくなってしまうので、日付から入力することにします。

入力した日時は日時文字列からカレンダー時刻への変換のケーススタディで作成したget_caltime関数を使用してカレンダー時刻に変換します。 開始/終了日時の双方ともカレンダー時刻に変換しその差から経過秒数を計算します。 経過秒数を課金単位(30分としました)で割り課金単位を1秒でも越えていれば課金単位数を増やします(この辺の処理は0秒ちょうどを課金するかどうかで異なると思います)。 課金単位数に料金(300円としました)を掛ければ料金が算出されます。
#include <stdio.h>
#include <time.h>

#define UNIT    (30*60)
#define FEE     300

time_t  get_caltime(char *tstr);

main()
{
        time_t  cal_stime, cal_etime;
        char    buff[100];
        int     fee, unit;

        printf("駐車開始時間 YYYYMMDDHHMMSS : ");
        scanf("%s", buff);
        cal_stime = get_caltime(buff);
        if(cal_stime == -1){
                printf("変換失敗\n");
                return;
        }
        printf("駐車終了時間 YYYYMMDDHHMMSS : ");
        scanf("%s", buff);
        cal_etime = get_caltime(buff);
        if(cal_etime == -1){
                printf("変換失敗\n");
                return;
        }

        if(cal_etime <= cal_stime){
                printf("入力した日時が不適切です.\n");
                return;
        }
        printf("経過秒数 : %d\n", cal_etime - cal_stime);
        unit = (cal_etime - cal_stime) / UNIT;
        if((cal_etime - cal_stime) % UNIT != 0)
                unit++;
        fee = unit * FEE;
        printf("料金 : %d円\n", fee);
}


time_t  get_caltime(char *tstr)
{
        char    buf[20];
        time_t  cal_time;
        struct tm
                work_tm;

        if(strlen(tstr) != 14)
                return(-1);
        strncpy(buf, tstr, 4);
        buf[4] = '\0';
        work_tm.tm_year = atoi(buf) - 1900;
        strncpy(buf, tstr+4, 2);
        buf[2] = '\0';
        work_tm.tm_mon = atoi(buf) - 1;
        strncpy(buf, tstr+4+2, 2);
        work_tm.tm_mday = atoi(buf);
        strncpy(buf, tstr+4+2+2, 2);
        work_tm.tm_hour = atoi(buf);
        strncpy(buf, tstr+4+2+2+2, 2);
        work_tm.tm_min = atoi(buf);
        strncpy(buf, tstr+4+2+2+2+2, 2);
        work_tm.tm_sec = atoi(buf);
        work_tm.tm_isdst = -1;
        if((cal_time = mktime(&work_tm)) == -1){
                return(-1);
        }
        return(cal_time);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...