- ベストアンサー
プログラムの添削をお願いします。
一箇所わからないところがあるのと、エラーになってしまうので間違っている箇所とその訂正方法を教えてください。 import java.io.*; public class Suuji { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader ( new FileReader("kazu.txt")); int note, b1 = 0, b2 = 0, b3 = 0, b4 = 0; String input; while((input = br.readLine()) != null) { int note; note = Integer.parseInt('input')//読み込んだString型のデータinputをint型に変換してnoteに代入 if (note >= 80) {b1 = b1+1};//noteの値が80以上のときb1に1加える。以下70,60とそれ以外に対し同様 else if (note >= 70) {b2 = b2+1}; else if (note >= 60) {b3 = b3+1}; else {b4 = b4+1}; } bw.write("80以上");//bwに文字リテラル"80以上"を書き込む bw.write('\t');//bwにTAB記号を1文字書き込む bw.write();//bwにint型の変数b1の値の文字列表現を書き込む bw.write('\n');//bwに改行記号を書き込む。同様に"70以上80未満" "60以上70未満" "60未満"についてbwに必要な書き込みを行う bw.write("70以上");// bw.write('\t');// bw.write();// bw.write('\n');// bw.write("60以上");// bw.write('\t');// bw.write();// bw.write('\n');// bw.write("60未満");// bw.write('\t');// bw.write();// bw.write('\n');// bw.flush(); br.close(); bw.close(); } } わからないのはbwにint型の変数b1の値の文字列表現を書き込むというところです。int型変数を文字列表現にするのができません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
・bwの宣言がない BufferedWriter bw = new BufferedWriter(new FileWriter("OutPut.txt")); をwhileの前に入れる。 ・intを文字列変換するのはInteger.toString(b1) ・7、10行目 noteの宣言が2回ある。どちらか片方に。 ・11行目 引数に渡すのは変数。「'」は必要ない。 最後の;がない note = Integer.parseInt(input); ・12~15行目 else if の構文がおかしい。 構文は if (note >= 80) { b1 = b1 + 1; // ;はここ } else if (note >= 1) { // 中略 } else { b4 = b4 + 1; } なので、 if (note >= 80) {b1 = b1 + 1;} // ;は}の前 else if (note >= 1) {/* 中略 */} else {b4 = b4 + 1;} ・16行目 上の行で「else {処理};」として}を閉じているので、これは必要ない。 ・33行目の前に}でwhileを閉じる import java.io.*; public class Suuji { public static void main(String[] args) throws IOException { int note, b1 = 0, b2 = 0, b3 = 0, b4 = 0; String input; BufferedWriter bw = new BufferedWriter(new FileWriter("OutPut.txt")); BufferedReader br = new BufferedReader(new FileReader("kazu.txt")); while ((input = br.readLine()) != null) { note = Integer.parseInt(input); if (note >= 80) { b1++; } else if (note >= 70) { b2++; } else if (note >= 60) { b3++; } else { b4++; } bw.write("80以上"); bw.write('\t'); bw.write(Integer.toString(b1)); bw.write('\n'); bw.write("70以上"); bw.write('\t'); bw.write(Integer.toString(b2)); bw.write('\n'); bw.write("60以上"); bw.write('\t'); bw.write(Integer.toString(b3)); bw.write('\n'); bw.write("60未満"); bw.write('\t'); bw.write(Integer.toString(b4)); bw.write('\n'); } bw.flush(); br.close(); bw.close(); } }
その他の回答 (4)
- deadlock
- ベストアンサー率67% (59/87)
#3 です。 >33行目でなく16行目でwhileを閉じてはいけないのでしょうか? あ、すみません。 http://okweb.jp/kotaeru.php3?q=1175507 の質問の意味を勘違いしていました。 1行読み込む毎に集計の過程を出力していくんだと思ってました(^^; 結果ファイルには1行だけ出せばいいんですね。 16行目で閉じて大丈夫です。 BufferedWriter bw~も、whileを閉じた後に書いて大丈夫です。 おまけに… mainメソッドにthrows IOExceptionがあればtry-catchは書かないでもコンパイルは通りますが、きちんと書いたほうがいいです。 BufferedWriter bw = null; BUfferedReader br = null; try { bw = new ~ br = new ~ // 読み込み、書き込み } catch (IOException e) { // エラーメッセージなどを出力 } finally { // ここは、Exception発生時も正常時も通ります。 if (br != null) {br.close();} if (bw != null) {bw.close();} } close()の時のIOExceptionはどうするか? という疑問が出ると思いますが、以下のいずれかになります。 (1)finallyの中でさらにtry-catchし、ユーザーにメッセージを出して終了。 (2)RuntimeExceptionやErrorを投げるようする。 (3)close()のIOExceptionは処理せず、mainやメソッドの呼び出し元に任せる。
お礼
丁寧な説明をありがとうございました。 今後の勉強に役立てていきたいと思います。
- tachiwa
- ベストアンサー率34% (25/73)
/*(1)try~catch節が無いとコンパイルできないのではありませんか。 (2)ほかの方の説明に無かった文字列にする方法 bw.write(" " + b1); をつけておきます。 (3)\tは一つでは目立たなかったので二つにしました*/ import java.io.*; public class Suuji { public static void main(String[] args){ try{ BufferedReader br=new BufferedReader(new FileReader("kazu.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("output_kazu.txt")); int note, b1 = 0, b2 = 0, b3 = 0, b4 = 0; String input; while((input = br.readLine()) != null) { note = Integer.parseInt(input); if (note >= 80){ b1 = b1+1; bw.write("80以上"); bw.write("\t\t"); //bw.write(Integer.toString(b1)); bw.write(" "+b1); bw.write("\n"); }else if(note >= 70){ b2 = b2+1; bw.write("70以上"); bw.write("\t\t"); bw.write(" " + b2); bw.write("\n"); }else if (note >= 60) { b3 = b3+1; bw.write("60以上"); bw.write("\t\t"); bw.write(" "+ b3); bw.write("\n"); }else { b4 = b4+1; bw.write("60未満"); bw.write("\t\t"); bw.write(" " + b4); bw.write("\n"); } } br.close(); bw.close(); }catch(IOException e){ e.printStackTrace(); } } }
お礼
ありがとうございました。 参考にさせていただきます。
- osumitan
- ベストアンサー率33% (102/307)
bwという変数はどこから出てきたんでしょう? > int型変数を文字列表現にするのができません。 Integer#toString(int i) が使えるでしょう。 bw.write(Integer.toString(b1)); ってな感じで。
補足
すみません、途中に打ち間違いがありました。 4、5行目の間に BufferedWriter bw = new BufferedReader( new FileWriter("bunpu.txt")); が抜けていました。 このようにした場合はどうでしょうか?
- Bonjin
- ベストアンサー率43% (418/971)
間違っている箇所 >note = Integer.parseInt('input')//読み込んだString型のデータinputをint型に変換してnoteに代入 'input'はJavaの文法上ありえません。また、セミコロンで終了していないので文法エラーです。 >わからないのはbwにint型の変数b1の値の文字列表現を書き込むというところです。 bwがいきなり出てきているので、これもコンパイルエラーです。ちなみにbwが一体何のクラスなのかわからないので何とも言えません。 >int型変数を文字列表現にするのができません。 JavaDocでjava.lang.Stringかjava.lang.Integerを調べればわかります。
お礼
大変丁寧な説明をありがとうございます。 一つ質問させていただきます。 ・16行目 上の行で「else {処理};」として}を閉じているので、これは必要ない。 ・33行目の前に}でwhileを閉じる とのことですが、33行目でなく16行目でwhileを閉じてはいけないのでしょうか?