問5 括弧の対応をチェックするプログラムに関する次の記述を読んで,設問1〜3に答えよ。 

 テキストファイル中の括弧の対応をチェックするプログラムのアルゴリズムを考える。対応する括弧が見つからなかった場合は,その括弧の位置を表示する。対応する括弧は同一行になくてもよい。
対応する括弧が見つからない場合には,次の二つのケースがある。
ケース1:  対応する開き括弧が存在しない閉じ括弧が見つかった。対応する開き括弧が見つからないというメッセージと問題が発生した閉じ括弧の位置を表示する。 まだ未処理のテキストが残っていれば,残りの部分に対して括弧の対応のチェックを続ける。
ケース2: すべてを調べ終わった時点で,対応する閉じ括弧が見つからない開き括弧が残った。残っている開き括弧は一つとは限らないので,対応する閉じ括弧が見つからないというメッセージの後に,問題のある開き括弧の位置をすべて表示する。
 
 図1のテキストファイルに対して,図2のように表示する。
 

 (1+2)
 abc)
 (def)gx ))
 ((h)
 ij)(k
 (1ml)
 
対応する開き括弧がありません。
 2行目4文字目
 対応する開き括弧がありません。
 3行目10文字日
 対応する閉じ括弧がありません。
 5行目4文字目
 4行目1文字目
 
図1 テキストファイルの内容   図2 表示結果
 
ここでは括弧の位置を覚えておくために,整数のスタックを用いる。スタック操作には,Push,POPとスタックが空かどうかを調べるempty及びスタックの一番上のデータの値を返すpeekが使えるものとする。
スタック操作以外に,関数nextch,kindを使うことができる。nextchはファイルから次の1文字を読み込む関数で,入力文字を1文字読み込んで返すと同時に,読み込んだ文字が何行目の何文字目かを,変数lineとposに設定する。ただし,ファイルの終わりでは変数EOFを“真”に設定し,空白を返す。変数EOFの初期値は“偽”である。また,kindは1引数の関数で,文字を引数で受け取り,文字が括弧かどうかを整数値で返す。その関数値は,次のとおりである。
kind(c)= 0 cが括弧以外の文字
1 cが開き括弧
2 cが閉じ括弧
 この考察に基づいて書いたアルゴリズムは次のようになった。
〔アルゴリズム1]
スタックを空に初期化
ch←nextch( )
While(not EOF)
    k←kind(ch)
if(
     
elseif(
)                 
 if(
  
dummy←POP( )
dummy←POP( )
 else
メッセージを表示 (A)
何行目(line)と何文字目(pos)を表示
endif
endif
ch←nextch( )
endwhile
if(not empty( ) )
    メッセージを表示 (B)
    While(not empty( ))
        dummy←POP( )
        L←POP( )
        P←POP( )
        何行目(L)と何文字目(P)を表示
    endwhile
endif
  
 括弧が2種類以上あるときには,括弧の種類ごとに対応を調べる必要がある。括弧は(・・・[・・・](・・・))のように完全な入れ子構造になっていることが要求されており,
(・・・[・・・)]のようなものは許されない。
 ここでは,3種類の括弧() {} [] を対象とするようにアルゴリズム1を修正した。
この場合はスタックに括弧の種類,行番号及び文字位置の三つのデータを積む必要がある。まず,括弧の種類を識別するために,括弧を表のとおりにコード化する。
 kindは,括弧の場合には表のコードを,括弧以外の文字の場合には0を関数値として返すように修正した。
   
表 括弧のコード
(  ) {  }  [  ]
  
閉じ括弧が出てきた場合に,異なる種類の開き括弧がスタックの一番上にあったときは,この閉じ括弧に対応する開き括弧がないというメッセージとこの閉じ括弧の位置を表示して,スタック上の開き括弧はそのままにして処理を続けることにする。
これに従うと,アルゴリズムは次のようになる。
 
〔アルゴリズム2〕
スタックを空に初期化
ch←nextch( )
While(not EOF)
    k←kind(ch)
    if(k>0)
      if(
       スタックに情報を積む
     elseif(
and
            dummy←POP( )
            dummy←POP( )
            dummy←POP( )
        else
            メッセージを表示 (A)
            何行目(line)と何文字目(pos)を表示
        endif
    endif
    ch←nextch( )
endwhile
if(not empty( ))
    メッセージを表示 (B)
    while(not empty( ))
        dummy←POP( )
        L←POP( )
        P←POP( )
        何行目(L)と何文字目(p)を表示
    endwhile
endif
  
設問1
アルゴリズム1の
に入れる適切な字句を答えよ。
設問2 アルゴリズム1,2の(A),(B)の位置で表示するメッセージを答えよ。
設問3
アルゴリズム2の
で行う処理内容を解答群から選び,記号で答えよ。また,その処理内容を具体的な式で示せ。
必要なら余りを求める演算には“%"を使うこと。条件式は左から順に評価を行い,途中で値が確定した場合は,残りの評価は行わないものとする。
 
解答群
(a) kが括弧以外のコードか
(b) kが開き括弧のコードか
(c) kが閉じ括弧のコードか
(d) スタックの一番上のデータがkに対応する開き括弧か
(e) スタックの一番上のデータがkに対応する閉じ括弧か
(f) スタックが空か
(g) スタックが空でないか
 
設問1
設問2
設問3