問11 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
乗車駅から降車駅までの運賃を計算し,結果を返却値として返すプログラムである。
(1) 乗車駅,降車駅の名前は,引数 from,to に入れてプログラムに渡す。
(2) 運賃の計算には,運賃距離を用いる。運賃距離は,駅間ごとに決まっている重みを 用いて,実距離×重みで計算する。
(3) 乗車駅から降車駅までの運賃距離は,関数 ceil を用いて,小数点以下を切り上げる。
(4) 距離運賃表(構造体 FARE の配列)及び重み表は,それぞれグローバル変数 dist_fare,weight に格納されている。
(5) 構造体 FARE の構造は,次のとおりである。
typedef struct { int dist; /*運賃距離を適用する上限(km)*/ int cost; /*1km 単位の運賃*/ } FARE;
cost は,最初の要素を除いて,直前の要素の dist の値を超える距離に対して 適用される。
(6) 駅間の実距離及び重みは,駅名表(構造体 STATION の配列)として引数 line に 入れてプログラムに渡す。
(7) 構造体 STATION の構造は,次のとおりである。
typedef struct { char *name; /*駅名*/ int dist; /*隣駅との実距離(km)*/ int rank; /*重み表の添え字の値*/ } STATION;
dist には,最後の要素を除いて,直後の要素(駅)との距離が格納される。最後の 要素には,0 が格納される。
(8) from と to は一致しない。また,駅名表の並びで,from は to より前にある。
(9) 運賃距離は,100km を超えることはない。
〔プログラム〕 (行番号) 01 #include <math.h> 02 #include <string.h> 03 #define MAX_DIST 100 04 typedef struct { char *name; int dist; int rank; } STATION; 05 typedef struct { int dist; int cost; } FARE; 06 static FARE dist_fare[] = {{0, 100}, {5, 50}, {20, 40}, 07 {40, 30}, {70, 20}, {MAX_DIST, 10}}; 08 static double weight[] = {1.0, 1.1, 1.2, 1.5, 2.0}; 09 int CalculateFare(char *from, char *to, STATION line[]) 10 { 11 int dif, distx, farex, i; 12 double distf; 13 i = 0; 14 while(strcmp(from, line[i].name) != 0) 15 i++; 16 distf = line[i].dist * weight[line[i].rank]; 17 i++; 18 while(strcmp(to, line[i].name) != 0){ 19 distf += line[i].dist * weight[line[i].rank]; 20 i++; 21 } 22 distx = ceil(distf); 23 farex = dist_fare[0].cost; 24 for(i = 1; distx > dist_fare[i - 1].dist; i++) { 25 if(distx <= dist_fare[i].dist) 26 dif = distx; 27 else 28 dif = dist_fare[i].dist; 29 farex += (dif - dist_fare[i - 1].dist) * dist_fare[i].cost; 30 } 31 return farex; 32 }
設問 次の記述中の に入れる正しい答えを,解答群の中から選べ。
static STATION linea[] = {{"a", 5, 0}, {"b", 6, 2}, {"c", 11, 1}, {"d", 8, 4}, {"e", 7, 3}, {"f", 0, 0}}; main() { int fare; fare = CalculateFare("a", "f", linea); }
このプログラムを実行した場合, 19 行目は 回実行される。そして, 22 行目で求められた distx の値は になり,25 行目は 回実行される。その結果, 運賃 fare は になる。
a,c に関する解答群
ア 0 イ 1 ウ 2 エ 3 オ 4
カ 5 キ 6
b に関する解答群
ア 25 イ 29 ウ 37 エ 48 オ 51
d に関する解答群
ア 1,120 イ 1,630 ウ 1,770 エ 2,140 オ 2,650