力試し3
力試し5
次のCプログラムの説明及びプログラムを読んで,設問に答えよ。 [プログラムの説明] 階層構造をもつファイルシステムにおいて,指定されたファイル又はディレ クトリについての情報の一覧を表示する関数flistがある。 (1)ファイルシステムの構造は,次のとおりである。 1.図1のようなディレクトリとファイルからなる階層をもつ。階層の深さ は最大32層である。 ───── │ │ ルートディレクトリ ──┬── ┌───────┬───┴───┬───────┐ ┌──┴──┐ ──┴── ┌──┴──┐ ──┴── │file1│ │sub1 │ │file2│ │sub2 │ └─────┘ ──┬── └─────┘ ───── ┌───┴───┐ ┌──┴──┐ ┌──┴──┐ │file3│ │file4│ └─────┘ └─────┘ ┌─────┐ │ │ ファイル └─────┘ ───── │ │ ディレクトリ ───── 図1 階層構造の例 2.ファイルシステム内では,ディレクトリごとに,そのディレクトリの 子のファイルと子のディレクトリをまとめて一つのファイルテーブルで 管理する。ファイルテーブルの要素をファイルエントリと呼ぶ。 ファイルエントリの内容を表に,ファイルテーブルの例を図2に示す。 表 ファイルエントリの内容 ┌───┬─────────────────────────────┐ │要 素│内 容 │ ├───┼─────────────────────────────┤ │タイプ│”F”:ファイル ”D”:ディレクトリ │ │ │”X”:未使用 ”E”:テーブル中の最後のエントリ │ ├───┼─────────────────────────────┤ │名前 │ファイル名又はディレクトリ名 │ │ │(同一階層内で一意な12文字以内の英数字列) │ ├───┼─────────────────────────────┤ │サイズ│タイプ=”F”のとき,ファイルの大きさ(単位:バイト) │ │ │タイプ=”D”のとき,値0 │ ├───┼─────────────────────────────┤ │リンク│タイプ=”F”のとき,ファイルへのポインタ │ │ │タイプ=”D”のとき,子のディレクトリのファイルテーブルへ│ │ │ のポインタ │ └───┴─────────────────────────────┘ ルートディレクトリの ファイルテーブル ┌───┬───────┬───┬┐ │”F”│”file1”│123││ ディレクトリsub1の ├───┼───────┼───┼┤ ファイルテーブル │”D”│”sub1” │ 0│→┌───┬───────┬───┬┐ ├───┼───────┼───┼┤│”F”│”file3”│923││ │”F”│”file1”│123││├───┼───────┼───┼┤ ├───┼───────┼───┼┤│”F”│”file4”│423││ │”X”│ │ ││├───┼───────┼───┼┤ ├───┴───────┴───┴┤│”E”│ │ ││ │ : │└───┴───────┴───┴┘ ├───┬───────┬───┬┤ │”X”│ │ ││ ディレクトリsub2の ├───┼───────┼───┼┤ ファイルテーブル │”D”│”sub2” │ 0│→┌───┬───────┬───┬┐ ├───┼───────┼───┼┤│”E”│ │ ││ │”E”│ │ ││└───┴───────┴───┴┘ └───┴───────┴───┴┘ 図2 ファイルテーブルの例(図1を表したもの) 3.パス名とは,ルートディレクトリから始まり,特定のファイルやディレ クトリにたどり着くための一意な経路を示す名前である。各階層は”/” で区切る。 例えば,図1のfile4のパス名は”/sub1/file4”, sub2のパス名は”/sub2”である。 (2)関数flistの引数は,ルートディレクトリのファイルテーブルへの ポインタrootと,パス名を格納した文字列へのポインタ path_nameである。path_nameの内容は,パス名の 書式としては正しいものとする。すなわち,”/”で始まり,ファイル 又はディレクトリ名は12文字以内の英数字列となっている。 (3)path_nameの内容に応じて,次のいずれかの処理を行う。 1.ファイルの場合は,ファイル名とファイルの大きさを表示する。 2.ディレクトリの場合は子の情報を表示する。子がファイルのときはファ イル名とファイルの大きさ,子がディレクトリのときはディレクトリ名 と文字列”Directory”を表示する。子がないときは何も表示 しない。 3.パス名に対応する経路が存在しない場合は,エラーメッセージを表示 する。 例:図1の構造を用いた例 パス名が ”/sub1/file4”の場合 パス名が”/”の場合 ┌───────────────┐ ┌───────────────┐ │file4 423 bytes│ │file1 123 bytes│ │ │ │sub1 Directory│ │ │ │file2 45 bytes │ │ │ │sub2 Directory│ └───────────────┘ └───────────────┘ [プログラム] #include <stdio.h> #include <string.h> #define F_FILE 2 #define F_DIRECTORY 1 #define F_UNMATCH 0 struct fentry { char type; char name[13]; long size; struct fentry *next; }; void flist(struct fentry *root, char *path_name) { struct fentry *fptr; char path[512], *name_tbl[32], *cptr; int idx, max, flag; strcpy(path, path_name); if (strcmp(path, "/") == 0) { flag = F_DIRECTORY; fptr = root; } else { /* パス名の分解 */ idx = 0; cptr = path; while (【 a 】) { if (*cptr == '/') { *cptr = '\0'; name_tbl[idx] = cptr + 1; idx++; } cptr++; } max = idx - 1; /* パス名の検索 */ fptr = root; for (【 b 】) { flag = F_UNMATCH; while (fptr->type != 'E') { if (fptr->type != 'X' && strcmp(fptr->name, name_tbl[idx]) == 0) { if (fptr->type == 'D') { /* ディレクトリ */ flag = F_DIRECTORY; fptr = fptr->next; break; } else if (idx == max) { /* ファイル */ flag = F_FILE; break; } else break; /* パス名の途中がファイルだった */ } fptr++; } if (flag == F_UNMATCH) break; } } /* ファイル・ディレクトリの表示 */ switch (flag) { case F_DIRECTORY: while (fptr->type != 'E') { if (fptr->type == 'D') printf("%s \tDirectory\n", fptr->name); else if (fptr->type == 'F') printf("%s \t%ld bytes\n", fptr->name, fptr->size); fptr++; } break; case F_FILE: printf("%s \t%ld bytes\n", fptr->name, fptr->size); break; default: printf("File or directory not found !!\n"); } } 設問 プログラム中の【 】に入れる正しい答えを,解答群の中から選べ。 aに関する解答群 ア *cptr == '\0' イ cptr != '\0' ウ *cptr != '\0' エ cptr == '\0' オ *cptr != '\n' bに関する解答群 ア idx = 1; idx <= max; idx++ イ idx = 0; idx <= max; idx++ ウ idx = 0; idx == max; idx++ エ idx = 1; idx < max; idx++
答
a ウ b イ
次のCプログラムの説明及びプログラムを読んで,設問に答えよ。 [プログラムの説明] 階層構造をもつファイルシステムにおいて,指定されたファイル又はディレ クトリについての情報の一覧を表示する関数flistがある。 (1)ファイルシステムの構造は,次のとおりである。 1.図1のようなディレクトリとファイルからなる階層をもつ。階層の深さ は最大32層である。 ───── │ │ ルートディレクトリ ──┬── ┌───────┬───┴───┬───────┐ ┌──┴──┐ ──┴── ┌──┴──┐ ──┴── │file1│ │sub1 │ │file2│ │sub2 │ └─────┘ ──┬── └─────┘ ───── ┌───┴───┐ ┌──┴──┐ ┌──┴──┐ │file3│ │file4│ └─────┘ └─────┘ ┌─────┐ │ │ ファイル └─────┘ ───── │ │ ディレクトリ ───── 図1 階層構造の例 2.ファイルシステム内では,ディレクトリごとに,そのディレクトリの 子のファイルと子のディレクトリをまとめて一つのファイルテーブルで 管理する。ファイルテーブルの要素をファイルエントリと呼ぶ。 ファイルエントリの内容を表に,ファイルテーブルの例を図2に示す。 表 ファイルエントリの内容 ┌───┬─────────────────────────────┐ │要 素│内 容 │ ├───┼─────────────────────────────┤ │タイプ│”F”:ファイル ”D”:ディレクトリ │ │ │”X”:未使用 ”E”:テーブル中の最後のエントリ │ ├───┼─────────────────────────────┤ │名前 │ファイル名又はディレクトリ名 │ │ │(同一階層内で一意な12文字以内の英数字列) │ ├───┼─────────────────────────────┤ │サイズ│タイプ=”F”のとき,ファイルの大きさ(単位:バイト) │ │ │タイプ=”D”のとき,値0 │ ├───┼─────────────────────────────┤ │リンク│タイプ=”F”のとき,ファイルへのポインタ │ │ │タイプ=”D”のとき,子のディレクトリのファイルテーブルへ│ │ │ のポインタ │ └───┴─────────────────────────────┘ ルートディレクトリの ファイルテーブル ┌───┬───────┬───┬┐ │”F”│”file1”│123││ ディレクトリsub1の ├───┼───────┼───┼┤ ファイルテーブル │”D”│”sub1” │ 0│→┌───┬───────┬───┬┐ ├───┼───────┼───┼┤│”F”│”file3”│923││ │”F”│”file1”│123││├───┼───────┼───┼┤ ├───┼───────┼───┼┤│”F”│”file4”│423││ │”X”│ │ ││├───┼───────┼───┼┤ ├───┴───────┴───┴┤│”E”│ │ ││ │ : │└───┴───────┴───┴┘ ├───┬───────┬───┬┤ │”X”│ │ ││ ディレクトリsub2の ├───┼───────┼───┼┤ ファイルテーブル │”D”│”sub2” │ 0│→┌───┬───────┬───┬┐ ├───┼───────┼───┼┤│”E”│ │ ││ │”E”│ │ ││└───┴───────┴───┴┘ └───┴───────┴───┴┘ 図2 ファイルテーブルの例(図1を表したもの) 3.パス名とは,ルートディレクトリから始まり,特定のファイルやディレ クトリにたどり着くための一意な経路を示す名前である。各階層は”/” で区切る。 例えば,図1のfile4のパス名は”/sub1/file4”, sub2のパス名は”/sub2”である。 (2)関数flistの引数は,ルートディレクトリのファイルテーブルへの ポインタrootと,パス名を格納した文字列へのポインタ path_nameである。path_nameの内容は,パス名の 書式としては正しいものとする。すなわち,”/”で始まり,ファイル 又はディレクトリ名は12文字以内の英数字列となっている。 (3)path_nameの内容に応じて,次のいずれかの処理を行う。 1.ファイルの場合は,ファイル名とファイルの大きさを表示する。 2.ディレクトリの場合は子の情報を表示する。子がファイルのときはファ イル名とファイルの大きさ,子がディレクトリのときはディレクトリ名 と文字列”Directory”を表示する。子がないときは何も表示 しない。 3.パス名に対応する経路が存在しない場合は,エラーメッセージを表示 する。 例:図1の構造を用いた例 パス名が ”/sub1/file4”の場合 パス名が”/”の場合 ┌───────────────┐ ┌───────────────┐ │file4 423 bytes│ │file1 123 bytes│ │ │ │sub1 Directory│ │ │ │file2 45 bytes │ │ │ │sub2 Directory│ └───────────────┘ └───────────────┘ [プログラム] #include <stdio.h> #include <string.h> #define F_FILE 2 #define F_DIRECTORY 1 #define F_UNMATCH 0 struct fentry { char type; char name[13]; long size; struct fentry *next; }; void flist(struct fentry *root, char *path_name) { struct fentry *fptr; char path[512], *name_tbl[32], *cptr; int idx, max, flag; strcpy(path, path_name); if (strcmp(path, "/") == 0) { flag = F_DIRECTORY; fptr = root; } else { /* パス名の分解 */ idx = 0; cptr = path; while (*cptr != '\0') { if (*cptr == '/') { *cptr = '\0'; name_tbl[idx] = cptr + 1; idx++; } cptr++; } max = idx - 1; /* パス名の検索 */ fptr = root; for (idx = 0; idx <= max; idx++) { flag = F_UNMATCH; while (fptr->type != 'E') { if (fptr->type != 'X' && strcmp(fptr->name, name_tbl[idx]) == 0) { if (fptr->type == 'D') { /* ディレクトリ */ flag = F_DIRECTORY; fptr = fptr->next; break; } else if (idx == max) { /* ファイル */ flag = F_FILE; break; } else break; /* パス名の途中がファイルだった */ } fptr++; } if (flag == F_UNMATCH) break; } } /* ファイル・ディレクトリの表示 */ switch (flag) { case F_DIRECTORY: while (fptr->type != 'E') { if (fptr->type == 'D') printf("%s \tDirectory\n", 【 a 】); else if (fptr->type == 'F') printf("%s \t%ld bytes\n", 【 a 】, 【 b 】); fptr++; } break; case F_FILE: printf("%s \t%ld bytes\n", 【 a 】, 【 b 】); break; default: printf("File or directory not found !!\n"); } } 設問 プログラム中の【 】に入れる正しい答えを,解答群の中から選べ。 aに関する解答群 ア fptr.name イ fptr=>name ウ fptr>name エ fptr->name bに関する解答群 ア fptr.size イ fptr=>size ウ fptr>size エ fptr->size
答
a エ b エ
次の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行目は【 a 】回実行される。そして, 22行目で求められたdistxの値は【 b 】になり,25行目は 【 c 】回実行される。その結果,運賃fareは【 d 】になる。 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
答
a オ b オ c オ d ウ
力試し3
力試し5