基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成17年 春期 基本情報技術者 午後 問10
問10   C言語

次の C プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

関数 make_fare_table は,ある鉄道路線における始発駅から終着駅までの隣接駅間の 距離から,その鉄道路線上の全駅間の運賃を求め,運賃表を作成するプログラムである。

(1) 関数 make_fare_table の引数は,次のとおりである。

num  始発駅から終着駅までの駅数
dist_list  隣接駅間の距離(km)を格納した配列(図1参照)
cost_list  距離運賃体系表(構造体 COSTUNIT の配列)
fare_table  運賃表

fare_table[m][n](0 ≦ m ≦ num − 1,0 ≦ n ≦ num − 1
かつ m≠n)には,駅 m と駅 n の間の運賃を格納する。
fare_table[k][k](0 ≦ k ≦ num − 1)には,ゼロを格納する。

    図1 引数 num と dist_list の関係

(2) 距離から運賃を求めるために,関数 calc_fare を用いる。
関数 calc_fare の引数及び返却値は,次のとおりである。

dist  2駅間の距離(km)
cost_list  距離運賃体系表(構造体 COSTUNIT の配列)
返却値 運賃(円)

(3) 2駅間を幾つかの区間に分け,区間ごとに計算した運賃を合計したものを, 2 駅間の運賃とする。

(4) 各区間の運賃は,次の @ 〜 C のとおりである(図2参照)。

@ 最初の 20 km 以下の区間(区間[0])の運賃は,5 km 増えるごとに 100 円加算する。

A 20 km を超え 100 km 以下の区間(区間[1])の運賃は,10 km 増えるごとに 180 円加算する。

B 100 km を超え 500 km 以下の区間(区間[2])の運賃は,50 km 増えるごとに 850 円加算する。

C 500 km を超える区間(区間[3])の運賃は,100 km 増えるごとに 1,650 円加算する。

    図2 2駅間の距離と運賃の関係

(5) 例えば,距離が 385 km ある駅間の運賃の求め方は,次のとおりである。

@ 最初の 20 km 以下の区間(区間 [0])の運賃は,5 km 増えるごとに 100 円加算されるので,次の式で求められる。

   100 円×ceil(20 km÷5 km)=400 円

A 20 km を超え 100 km 以下の区間(区間 [1])の運賃は,10 km 増えるごとに 180 円加算されるので,次の式で求められる。

   180 円×ceil((100 km−20 km)÷10 km)=1,440 円

B 100 km を超え 385 km 以下の区間(区間 [2])の運賃は,50 km 増えるごとに 850 円加算されるので,次の式で求められる。

   850 円×ceil((385 km−100 km)÷50 km)=5,100 円

運賃は,@ 〜 B の合計で,6,940 円になる。 ここで,計算式中の ceil(X) は,X の小数点以下を切り上げた値を表す。

(6) 各区間の上限距離と単位距離は,距離運賃体系表で与える。 距離運賃体系表は,上限距離の小さい区間から順に各要素を格納する。 最後の要素の上限距離はゼロを格納し,距離の上限がないことを表す。

    表 距離運賃体系表

区間
  cost_list
上限距離(km)
  max_dist
単位距離(km)
  unit_dist
単位距離ごとの運賃(円)
  unit_cost
 [0] 20    5    100     
 [1] 100    10    180     
 [2] 500    50    850     
 [3] 0    100    1,650     

(7) 各区間の上限距離,単位距離及び単位距離ごとの運賃は,次に示す構造体 COSTUNIT で定義される。


typedef struct { int max_dist; /* 上限距離(km) */ int unit_dist; /* 単位距離(km) */ int unit_cost; /* 単位距離ごとの運賃(円) */ } C OS TUNIT;

〔プログラム〕

#include 

typedef struct { int max_dist;  /* 上限距離(km) */
                 int unit_dist; /* 単位距離(km) */
                 int unit_cost; /* 単位距離ごとの運賃(円) */
               } COSTUNIT;

void make_fare_table(int, double *, COSTUNIT *, int **);
int calc_fare(double, COSTUNIT *);

void make_fare_table(int num, double *dist_list,
                     COSTUNIT *cost_list, int **fare_table) {
    int    idx0, idx1;
    double dist;

    for (idx0 = 0; idx0 < num; idx0++) {
        fare_table[idx0][idx0] = 0;
        dist = 0.0;
        for (idx1 = idx0 + 1; idx1 < num; idx1++) {
    
        }
    }
}

int calc_fare(double dist, COSTUNIT *cost_list) {
    int fare = 0, idx = 0;
    int lower_limit;    /* 区間の下限(直前の区間の上限距離) */
    int upper_limit;    /* 区間の上限(現在の区間の上限距離) */
    lower_limit = 0;
    upper_limit = cost_list[0].max_dist;
    while (  ) {
        fare += ceil(  
                      / (double)cost_list[idx].unit_dist)
                * cost_list[idx].unit_cost;
        lower_limit = upper_limit;
        upper_limit = cost_list[ ].max_dist;
    }
    fare += ceil( 
                  / (double)cost_list[idx].unit_dist)
            * cost_list[idx].unit_cost;
    return fare;
}

設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア dist += dist_list[idx0]    イ dist += dist_list[idx0 - 1]

ウ dist += dist_list[idx1]    エ dist += dist_list[idx1 - 1]

オ dist = dist_list[idx0]    カ dist = dist_list[idx0 - 1]

キ dist = dist_list[idx1]    ク dist = dist_list[idx1 - 1]

b に関する解答群

ア upper_limit != 0 && dist > (double)lower_limit

イ upper_limit != 0 && dist > (double)upper_limit

ウ upper_limit != 0 || dist > (double)lower_limit

エ upper_limit != 0 || dist > (double)upper_limit

オ upper_limit == 0 && dist <= (double)lower_limit

カ upper_limit == 0 && dist <= (double)upper_limit

キ upper_limit == 0 || dist <= (double)lower_limit

ク upper_limit == 0 || dist <= (double)upper_limit

c,e に関する解答群

ア ((double)upper_limit - dist)

イ (dist - (double)lower_limit)

ウ (double)(upper_limit - lower_limit)

エ (double)lower_limit

オ (double)upper_limit

カ dist

d に関する解答群

ア ++idx    イ --idx     ウ idx    エ idx++

オ idx--    カ idx + 1    キ idx - 1

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます


設問2 次の記述中の に入れる正しい答えを,解答群の中から選べ。

鉄道路線の運営会社が,始発駅及び終着駅以外の途中駅を境に2社に分割され, 運賃の計算方法が次のように変更された。

(1) どちらか1社の鉄道路線だけを利用する場合は,従来どおりの方法で運賃を計算する。

(2) 2社の鉄道路線を乗り継いで利用する場合は,各社の利用部分の運賃を個別に計算し, それを合計する。

これに対応するためには,関数 make_fare_table の引数に,境となる駅の番号
term_no(1 ≦ term_no ≦ num−2)を追加し,プログラム中のαを次のように変更すればよい。


if (idx0 < term_no && idx1 > term_no)
    fare_table[idx0][idx1] = fare_table[idx1][idx0]
                           = calc_fare(dist, cost_list)
                             + fare_table[idx0][term_no];
else
    fare_table[idx0][idx1] = fare_table[idx1][idx0]
                           = calc_fare(dist, cost_list);
if ()
    dist = 0.0;

解答群

ア idx0 == term_no - 1    イ idx0 == term_no

ウ idx0 == term_no + 1    エ idx1 == term_no - 1

オ idx1 == term_no      カ idx1 == term_no + 1

解答 ←クリックすると正解が表示されます

[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]