HOME»基本情報技術者試験掲示板»平成30年秋問11(Java)設問2質問
投稿する
caseのバックスラバックスラに入って、仮にエならreader.readで現在地(バックスラの座標)の次の文字を読むわけで、次の文字がバッファに継ぎ足されて、defaultにフォールスルーして変数cの値がバッファに継ぎ足されるわけですよね。cの値ってreader.readで変わるんだっけ?と思いますが、実際にやってみましょう。
ひさびさにeclipseでやってみました。
test.txtには12345が書いてあります。
結果は
2
1
3
4
5
です。
つまり、初回のcは1で、tReader.read()で2が読まれて、元々のcの1が動いて、while((c = tReader.read()) >= 0){で読み直された段階の2回目のcは3になります。
ご回答いただきありがとうございます。
GinSanaさんのプログラム結果を見ると、設問2の解説「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」の動作はしなそうですね。
(もしかすると、環境によって異なる場合があるかもしれませんが)
平成30年秋問11(Java)設問2質問 [4285]
新人さん(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に「\」を追加?
設問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さん(No.3)
★FE シルバーマイスター
この投稿は投稿者により削除されました。(2022.05.22 23:03)
2022.05.22 23:03
GinSanaさん(No.4)
★FE シルバーマイスター
>設問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){
}
}
}
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