平成21年春期試験午後問題 問11
問11 ソフトウェア開発(Java)
次のJava プログラムの説明及びプログラムを読んで,設問に答えよ。
(Javaプログラムで使用するAPIの説明は,こちらを参照してください。
〔プログラムの説明〕
ギャップバッファを利用した簡易テキストエディタである。
ギャップバッファとは,編集対象となる文字列の編集箇所に空き領域を作り,そこに文字を挿入する機構をもつバッファのことである。一般に,テキストの編集時には,文字の挿入,削除などの変更は局所的に集中することが多く,編集箇所にあらかじめ空き領域を作っておくと効率よく変更を行うことができるという利点がある。ギャップバッファ内の空き領域をギャップといい,ギャップバッファ内の文字列をテキストという。ここで,ギャップは,ギャップバッファ内に一つしか存在しない。ただし,文字の挿入によって,ギャップがない状態になる場合がある。
テキストの表示イメージとギャップバッファを図1に示す(網掛けの部分がギャップである)。 クラス GapBuffer はギャップバッファの機能を実現する。このクラスの使用者は,テキストを仮想的に連続する文字列として扱うことができ,ギャップの位置やサイズを意識せずに文字の挿入や削除の処理を行う。このとき,図1①のように各文字はオフセット値(offset)で指定し,テキストの最初の文字はオフセット値0,テキストの最後の文字はオフセット値"テキストの文字数-1"で指定する。
図1②は,配列 buffer 内におけるテキストの物理的な表現の例である。 フィールド gapOffSet と gapSize は,それぞれギャップの先頭位置とギャップのサイズを表す。
図1②の状態から"プログラム"と"説明"の間に"の"を挿入する手順を図2に示す。 まず,"プロ"の直後に"グラム"を移動することで,ギャップを"プログラム"と"説明"の間に移動する(図2②)。ギャップの先頭に"の"を格納する(図2③)。この操作によって,ギャップのサイズは1文字分小さくなり,ギャップの先頭位置は1文字分後ろへずれる。
次に,図2③の状態から"プログラムの"の"グ"を削除する手順を図3に示す。 まず,"ラムの"を"説明"の直前に移動することで,ギャップを"プログ"と"ラムの説明"の間に移動する(図3②)。ギャップの先頭位置を1文字分前にずらし,ギャップのサイズを1文字分増やす(図3③)。
クラス GapBuffer は,次のコンストラクタ及びメソッドをもつ。
クラス Editor は,GapBuffer を利用して,簡易テキストエディタを実現する。メソッドmainに与えられた最初の引数をテキストの初期値とする。カーソルは,文字の間にあり,カーソルの位置はオフセット値で表し,フィールド cursor に保持される。例えば,図4のようにカーソルが "プロ"と"グラム"の間にあるとき,cursor の値は2である。カーソルがテキストの未尾にあるとき,cursor の値はテキストの文字数と同じであり,テキストがないとき,cursorの値は0である。 文字の入力は,外部で与えられるクラス CharReader で行う。メソッドgetは,ターミナルから1文字ずつ読み込む。CharReader には,次の制御文字が定義されている。制御文字以外の文字が入力されたときは,カーソルの位置に文字を挿入し,カーソルを1文字分進める。
(Javaプログラムで使用するAPIの説明は,こちらを参照してください。
〔プログラムの説明〕
ギャップバッファを利用した簡易テキストエディタである。
ギャップバッファとは,編集対象となる文字列の編集箇所に空き領域を作り,そこに文字を挿入する機構をもつバッファのことである。一般に,テキストの編集時には,文字の挿入,削除などの変更は局所的に集中することが多く,編集箇所にあらかじめ空き領域を作っておくと効率よく変更を行うことができるという利点がある。ギャップバッファ内の空き領域をギャップといい,ギャップバッファ内の文字列をテキストという。ここで,ギャップは,ギャップバッファ内に一つしか存在しない。ただし,文字の挿入によって,ギャップがない状態になる場合がある。
テキストの表示イメージとギャップバッファを図1に示す(網掛けの部分がギャップである)。 クラス GapBuffer はギャップバッファの機能を実現する。このクラスの使用者は,テキストを仮想的に連続する文字列として扱うことができ,ギャップの位置やサイズを意識せずに文字の挿入や削除の処理を行う。このとき,図1①のように各文字はオフセット値(offset)で指定し,テキストの最初の文字はオフセット値0,テキストの最後の文字はオフセット値"テキストの文字数-1"で指定する。
図1②は,配列 buffer 内におけるテキストの物理的な表現の例である。 フィールド gapOffSet と gapSize は,それぞれギャップの先頭位置とギャップのサイズを表す。
図1②の状態から"プログラム"と"説明"の間に"の"を挿入する手順を図2に示す。 まず,"プロ"の直後に"グラム"を移動することで,ギャップを"プログラム"と"説明"の間に移動する(図2②)。ギャップの先頭に"の"を格納する(図2③)。この操作によって,ギャップのサイズは1文字分小さくなり,ギャップの先頭位置は1文字分後ろへずれる。
次に,図2③の状態から"プログラムの"の"グ"を削除する手順を図3に示す。 まず,"ラムの"を"説明"の直前に移動することで,ギャップを"プログ"と"ラムの説明"の間に移動する(図3②)。ギャップの先頭位置を1文字分前にずらし,ギャップのサイズを1文字分増やす(図3③)。
クラス GapBuffer は,次のコンストラクタ及びメソッドをもつ。
- コンストラクタは引数initialTextで指定された文字列をテキストの初期値としてギャップバッファを生成する。ギャップは,テキストの前に作られる。
- メソッド insert は,メソッド confirmGap を呼んで引数 offset の位置にギャップを 移動した上で,引数 offset で指定された位置に,引数 ch で指定された文字を挿入する。
- メソッド delete は,引数 offset で指定された位置にある文字を削除する。テキストがない場合は,何もしない。
- メソッド charAt は,引数 offset で指定された位置の文字を返す。
- メソッド length は,テキストの文字数を返す。
- メソッド confirmGap は,配列 buffer において引数 newGapOffset で与えられた位置に1文字以上のギャップがあるようにする。必要であればギャップを指定された位置に移動し,ギャップがない場合は,新たにギャップを作る。
クラス Editor は,GapBuffer を利用して,簡易テキストエディタを実現する。メソッドmainに与えられた最初の引数をテキストの初期値とする。カーソルは,文字の間にあり,カーソルの位置はオフセット値で表し,フィールド cursor に保持される。例えば,図4のようにカーソルが "プロ"と"グラム"の間にあるとき,cursor の値は2である。カーソルがテキストの未尾にあるとき,cursor の値はテキストの文字数と同じであり,テキストがないとき,cursorの値は0である。 文字の入力は,外部で与えられるクラス CharReader で行う。メソッドgetは,ターミナルから1文字ずつ読み込む。CharReader には,次の制御文字が定義されている。制御文字以外の文字が入力されたときは,カーソルの位置に文字を挿入し,カーソルを1文字分進める。
- CharReader.MOVE_FORWARD
カーソルを1文字分進める。カーソルがテキストの末尾にあるときは,無視する。 - CharReader.MOVE_BACKWARD
カーソルを1文字分戻す。カーソルがテキストの先頭にあるときは,無視する。 - CharReader.DELETE
カーソルの直後の1文字を削除する。カーソルがテキストの末尾にあるときは,無視する。 - CharReader.EOF
エディタを終了する。
広告
設問
プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
- gapSize--
- gapSize++
- gapSize - 1
- gapSize + 1
b に関する解答群
- buffer.length
- gapOffset
- gapSize
- length()
c に関する解答群
- buffer.length
- buffer.length - gapOffset
- buffer.length - gapSize
- buffer.length - INITIAL_GAP_SIZE
d に関する解答群
- CharReader
- Display
- Editor
- GapBuffer
- Object
- StringBuffer
e,f に関する解答群
- --cursor
- ++cursor
- cursor
- cursor--
- cursor++
解答選択欄
- a:
- b:
- c:
- d:
- e:
- f:
- a=ア
- b=ウ
- c=ウ
- d=エ
- e=ウ
- f=オ
解説
この設問の解説はまだありません。広告