力試し3 力試し5
  1.  次の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++

  2.  次の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

  3. 次の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
  4. 力試し3 力試し5