平成9年度 春期 第二種 午後 問11

                        [更新日]1997.05.30
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 次の問11から問14までの問については、この中から1問を選択し、答案用紙の┃ ┃選択欄の選をマークして解答してください。               ┃ ┃ なお、2問以上選択した場合には、はじめの1問について採点します。     ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 問11 次のCプログラムの説明及びプログラムを読んで,設問1〜3に答えよ。 〔プログラムの説明〕 階層構造をもつファイルシステムを操作するための関数recnam,recren及 びrecgenである。 (1)ここで扱うファイルシステム及びその構造は次のとおりである(図1の構 造例を参照)。 1.ディレクトリとファイルで構成される。 2.ディレクトリは,ディレクトリ又はファイルを下位の構成要素としてもつこと ができる。例えば,図1の矢印の元(以後,上位と呼ぶ)のディレクトリは,矢 印の先(以後,直下と呼ぶ)のディレクトリ又はファイルを含んでいる。 3.ディレクトリ及びファイルの名前は,8文字以内の英数字列であり,ファイル システム全体で一意とする。 4.最上位のディレクトリをルートディレクトリと呼び,名前をrootとする。
図1 ファイルシステムの構造例
(2)これらの関数は,ファイル管理表(構造体配列lsttbl)を用いて,ディ レクトリ及びファイルの操作を行う。 (3)ファイル管理表のレコード様式は,図2に示すとおりであり,一つのディ レクトリ又はファイルに対して,一つのレコードを割り当てる。 ┌────┬───────┬───────┬───────┬──────┐ │ 種別 │ ポインタ1 │ ポインタ2 │ ポインタ3 │ 名前 │ └────┴───────┴───────┴───────┴──────┘ 図2 ファイル管理表のレコード様式 1.種別は,そのレコードをディレクトリに割り当てたとき1,ファイルに割り当 てたとき2,未使用のとき0とする。 2.ポインタ1は,上位のディレクトリへのポインタであり,上位のディレクトリ がない場合には,値NULLが格納されている。 3.ポインタ2は,レコードの種別がディレクトリの場合には,そのディレクトリ の直下にある最初に登録されたディレクトリ又はファイルへのポインタである。 そのディレクトリが直下にディレクトリ又はファイルを含まない場合には,値 NULLが格納されている。レコードの種別がファイルの場合にも,値NULLが格納 されている。 4.ポインタ3は,同じディレクトリに含まれるディレクトリ及びファイルを登録 順につないでいるポインタである。最後に登録されたレコードには,値NULLが 格納されている。 5.名前は,デイレクトリ名又はファイル名である。 6.ディレクトリ及びファイルの総数は128個以下とする。 図1を例にとると,ファイル管理表は図3のようになる。
〔プログラム〕 (行番号) 01 #include <stdio.h> 02 #include <string.h> 03 #define DMAX 128 04 struct DIRLST { int dtype; struct DIRLST *eptr1, *eptr2, *eptr3; char name[9]; }; 05 struct DIRLST *recnam( char* ); 06 struct DIRLST *recren( char*, char* ); 07 struct DIRLST *recgen( int, char*, char* ); 08 static struct DIRLST lsttbl[DMAX]; 09 struct DIRLST *recnam( char *name ) 10 { 11 int i; 12 for( i = 0; i < DMAX; i++ ) 13 if ( lsttbl[i].dtype !=0 ) 14 if ( strcmp( lsttbl[i].name, name ) == 0 ) return &lsttbl[i]; 15 return NULL; 16 } 17 struct DIRLST *recren( char *name1, char *name2 ) 18 { 19 struct DIRLST *cp; 20 cp = recnam( name1 ); 21 if ( cp == NULL ) return NULL; 22 if ( recnam( name2 ) != NULL ) return NULL; 23 strcpy( cp->name, name2 ); 24 return cp; 25 } 26 struct DIRLST *recgen( int dtype, char *name1, char *name2 ) 27 { 28 struct DIRLST *cp; 29 int i; 30 cp = recnam( name2 ); 31 if ( cp == NULL ) return NULL; 32 if ( ( cp-> dtype == 2 ) || ( recnam(namel) != NULL )) return NULL; 33 for ( i = 0; i < DMAX; i++ ) { 34 if ( lsttbl[i].dtype == 0 ) { 35 lsttbl[i].dtype = dtype; 36 lsttbl[i].eptr1 = cp; 37 lsttbl[i].eptr2 = lsttbl[i].eptr3 = NULL; 38 strcpy( lsttbl[i].name, namel ); 39 if ( cp->eptr2 == NULL ) cp->eptr2 = &lsttbl[i]; 40 else { 41 cp = cp->eptr2; 42 while( cp->eptr3 ! = NULL ) cp = cp->eptr3; 43 cp->eptr3 = &lsttbl[i]; 44 } 45 return cp; 46 } 47 } 48 return NULL; 49 } 設問1 ファイル管理表が図3の状態で,次の関数呼出しを行った場合,行番号14の関 数strcmpは何回呼ばれるか,正しい値を解答群の中から選ベ。 recren( "dir2","dir3" ); 解答群 ア 7 イ 8 ウ 10 エ 11 オ 14 カ 16 設問2 プログラム中の関数の機能として適切なものを,解答群の中から選ベ。 (a) 関数recnam (b) 関数recren (c) 関数recgen 解答群 ア 種別をキーとするディレクトリ又はファイルの検索 イ 名前をキーとするディレクトリ又はファイルの検索 ウ ディレクトリ又はファイルの削除 エ ディレクトリ又はファイルの生成 オ ディレクトリ又はファイルの種別変更 カ ディレクトリ又はファイルの名前変更 キ ディレクトリ又はファイルの複写 設問3 ファイル管理表(lsttbl)のメンバ(dtype,eptr1,eptr2及びeptr3) に関する記述として正しいものを,解答群の中から二つ選べ。 解答群 ア eptr1には,上位ディレクトリの情報をもつレコードの配列要素番号(lsttbl の先頭レコードを0とする)を格納している。 イ 行番号42でeptr3を参照している。これは同一ディレクトリを上位とするディ レクトリ及びファイルのポインタをさかのぼって検索し,先頭のディレクトリ又は ファイルを検出するためである。 ウ ディレクトリの直下に一つのディレクトリ(d1とする)だけがあり,しかもディ レクトリd1の直下には何もない場合,ディレクトリd1に割り当てられたレコード 内のeptr2とeptr3の値はともにNULLである。 エ ファイルにはディレクトリ又はファイルを含まないので,ファイルを削除する場 合には,削除対象レコードのdtypeを0に設定するだけで十分である。 オ 未使用レコードを除いて,eptr1の値がNULLとなるのは,ルートディレクトリ の場合だけである。

戻る  前頁:問10  次頁:問12