pafuイーランスクール 学んでできる

メニューへ戻る

アルゴリズム基礎解説(平成18年春期問4)

問題の確認

解説
プログラムの説明文とFCT,FATの連結を理解できるかどうかである。
落ち着いてプログラムをトレースしていけば、そこまで難しくは無い問題。

設問1
FCTとFATの使用例を見てもらいたいのだが、まずファイル名「AAA」の場合、ファイルサイズは1500である。
クラスタの大きさは1024であることから、2つのクラスタが必要であることがわかる。
また説明文より、
「複数のクラスタを使用するファイルは ~ 必ずしも連続するクラスタを使用するとは限らない」とある。

ファイル「AAA」の場合は、FCTの先頭クラスタ番号は1であり
FATの配列要素番号1には、次の要素番号2があり、
要素番号2の配列には末尾を示すー1が格納されている。

同じようにファイル「CCC」をみてもらえれば
4 ⇒ 6 ⇒ 7(末尾)のクラスタを使用している。
プログラムはファイルサイズより、必要クラスタ数を求め
現在有効であるクラスタの要素番号に格納していくことがわかる。

[a]について
[a]は、変数ClstNumの初期値を決定している部分である。
この変数は何かわからない。ということで迷う人もいるかもしれないが実は簡単であ
る。
先に解答を見てもらえばわかると思うが
ファイルサイズをどうにかしたらクラスタの番号が決定される。というものだ。
クラスタの番号については、説明文の通り
クラスタのサイズである1024バイトで割り、あまりが出たら商に+1をすればよいのだが
+1はあくまでも商についてであり、ファイルサイズに+1ではない

一つ一つ値を入れてみて確かめてみるといい。
ここで、+1と-1があるので
ファイルサイズを1024の場合と、1025の場合に分けて算出し
クラスタ数が計算されるかどうかを確かめる。
1024ではクラスタ数1、1025ではクラスタ数2になるものを探そう。
計算式は簡単なので省略する。
答えは「オ (FileSize + CSIZE - 1) ÷ CSIZE 」であることがわかると思う。

[b]について
プログラムをトレースするのだが、最初の条件で何をしているかをすぐに理解できるかで
問題を早く解けるかどうかが決まってくる

Idx ≦ AMAX And FAT[Idx] ≠ 0
   Idx ← Idx + 1

の2行は、FATの未使用の要素番号を探している。
これはすぐにわかって欲しい。

Wk ← Idx は未使用のクラスタの番号を退避している。

ClstNum > 0 and ErrFlg = false はクラスタが単数か複数かを聞いている
そして条件の中に入るということは、複数であるということ。
Idx が1加算された状態でまた未使用のクラスタ番号を探している。
これは、必要なクラスタが複数なのであるから、
入りきらなかった残りを格納するクラスタ番号を探しているのである
当然クラスタを2つ必要とする場合、
未使用が1つ目しかなければエラーとなるのは当然のことだ。

もう一つの未使用のクラスタ番号が決まったら[b]の処理を実行する。
つまり、最初に見つかった未使用のクラスタ番号に次のクラスタ番号を格納する。
ということは、Wkに退避させていたクラスタ番号に、
次の未使用クラスタ番号Idxを格納する。
よって正解は「エ FAT[Wk] ← Idx」 である。

[c]について
[c]に入るということは、クラスタが単数である。
または複数であったときに最後のクラスタであるということ。
ということは、クラスタに末尾である(-1)を格納しなければならない
ここで迷ってしまうのはWkなのかIdxなのか。であるのだが答えは簡単である。
Wkはクラスタが複数である場合にしか処理が実行されないことを考えると
単数であれば、Wkに値を入れる処理には入らない。よってWkとは無縁である。
よって「ウ FAT[Idx] ← -1 」となる。

[d]について
エラーハンドリングについてである。
エラーがおきた場合、何をしなければならないか。
答えは最初に確保したクラスタの「初期化」である。
複数クラスタを使用する場合、未使用のクラスタに、
次の未使用クラスタの番号を入れていったので
クラスタを辿りながら0を入れていけばいい。
それがわかっていれば答えは簡単に出てくるだろう。

繰返し処理の最初にFAT[Idx](次のクラスタ番号)をWkに退避させた
退避させたあとのクラスタには0を入れを初期化している。
初期化が終われば、次のクラスタ番号を初期化するのだから
答えは「ケ Idx ← Wk 」であることがわかる。

設問2
ファイルを削除する処理のプログラム。
削除対象のファイル名に空文字列を格納することで削除している。
空欄[e][f]を埋める問題だが、落ち着いて考えれば答えは簡単に出てくる。

[e]について
[e]の条件の間、Idxを加算していることから
ファイル名があるかないかを探していることがわかる。
ぱっと見、「ア Idx ≦ CMAX 」かと思うかもしれないがそれは違う。
削除対象のファイル名が、CMAXよりも始めのようにあった場合
全てを探すのは処理としておかしい。
対象となるファイル名が存在するまでか、またはCMAXまでかである。
という書き方をすると
「エ Idx ≦ CMAX or FCT[Idx].Name ≠ FileName 」と思うかもしれないが
よく考えて欲しい。
Orの場合にファイル名があったとしても、Idx ≦ CMAX の条件がOrであるのだから
どっちみちあろうとなかろうとCMAXまでカウントしてしまうのである。
つまり答えは「ウ Idx ≦ CMAX and FCT[Idx].Name ≠ FileName 」のほうである。

落ち着いて考えればひっかけには、はまらないだろう。

[f]について
この条件も簡単である。
[f]の条件が正であれば、削除し正常終了、負であればエラーとしている
[e]を見れば、ファイル名が存在すればIdxの値はCMAX以下であり
存在しなかったときはCMAXより大きいのである。

よって答えの条件式は「ア Idx ≦ CMAX」となる。

まっち~様 ご投稿

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる