平成30年秋問11(Java)設問2質問

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
新人さん  
(No.1)
平成30年秋問11(Java)の設問2について質問です。

設問2の解説を読むと、「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」、と記載されています。

しかし、私の理解では「case文にbreakを書かないと、(省略)、defaultの部分が処理され、変数cに格納されている『\』をbuf に追加する」、と考えています。

私の理解でどこが間違えているのか教えていただきたいです。

例えば「\>」を処理する場合は、プログラム4のwhile文で変数cに「\」が代入されます。
そして、変数cはcase '\\'に該当するため、bufに\の次の文字(今回の場合「>」)を追加する。---(1)
ここまでは理解できます。

次は、case '\\'にbreakがないためdefaultに移り、変数cに格納されている「\」をbufに追加するのではないかと考えました。 ---(2)

case '\\' :
    buf.append((char) reader.read());      //   (1)「\」の次の文字をbufに追加、
                                                                                                                            //         breakがないためdefaultに移る
default :
    buf.append((char)c);                                                    //  (2)変数cには「\」代入されているためbufに「\」を追加?
2022.05.21 00:43
新人さん  
(No.2)
設問2では「オ」が正解だということは納得できています。
仮に選択肢「エ」を選んだ際の説明が理解できていないのです。
2022.05.21 01:06
GinSanaさん 
FE シルバーマイスター
(No.3)
この投稿は投稿者により削除されました。(2022.05.22 23:03)
2022.05.22 23:03
GinSanaさん 
FE シルバーマイスター
(No.4)
>設問2の解説を読むと、「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」、と記載されています。
>しかし、私の理解では「case文にbreakを書かないと、(省略)、defaultの部分が処理され、変数cに格納されている『\』をbuf に追加する」、と考えています。

caseのバックスラバックスラに入って、仮にエならreader.readで現在地(バックスラの座標)の次の文字を読むわけで、次の文字がバッファに継ぎ足されて、defaultにフォールスルーして変数cの値がバッファに継ぎ足されるわけですよね。cの値ってreader.readで変わるんだっけ?と思いますが、実際にやってみましょう。
ひさびさにeclipseでやってみました。
test.txtには12345が書いてあります。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
class streamTest1{
public static void main(String args[]){
try{
File file = new File("c:\\tmp\\test.txt");
FileReader filereader = new FileReader(file);
Reader tReader = filereader;
int c = 0;
while((c = tReader.read()) >= 0){
switch(c){
case '1':
System.out.print((char)tReader.read() + "\n");
default:
System.out.print((char)c + "\n");
break;
}
}
filereader.close();
}catch(FileNotFoundException Ignored){
}catch(IOException Ignored){
}
}
}

結果は
2
1
3
4
5
です。
つまり、初回のcは1で、tReader.read()で2が読まれて、元々のcの1が動いて、while((c = tReader.read()) >= 0){で読み直された段階の2回目のcは3になります。
2022.05.23 00:32
新人さん  
(No.5)
>GinSanaさん
ご回答いただきありがとうございます。

GinSanaさんのプログラム結果を見ると、設問2の解説「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」の動作はしなそうですね。
(もしかすると、環境によって異なる場合があるかもしれませんが)

2022.05.23 16:32

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop