• 締切済み

JAVAの演習問題

現在JAVAを独学中なのですが、以下の演習問題でつまずいております。 (解答がない演習問題なので、このサイトにて質問することにしました。) 実行例 1からnまでの和を求めます。 nの値:5 1から5までの和は15です。 (5はキーボードにて入力された値。15はその結果の値。) 自分の解答は以下になるのですが、実行例のように表示されません。 ご解答頂けると大変助かります。 import java.util.Scanner; class Ensyuu413 { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); for ( int i = 0, j = 0; i <= n; i++, j += i) System.out.println("1から"+n+"までの和は"+j+"です。"); } } 実行しますと、以下のように実行されてしまいます。 1からnまでの和を求めます。 nの値:5 1から5までの和は0です。 1から5までの和は1です。 1から5までの和は3です。 1から5までの和は6です。 1から5までの和は10です。 1から5までの和は15です。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

うまくいかないのは、変数の有効範囲(スコープ)を考えてないからです。 for(int i=0, j=0 ... のようにforの(の中で宣言された変数は、そのforの中だけえ有効です。 forから抜けた後で System.out.println("1から"+n+"までの和は"+j+"です。"); と jを使おうとしても、forの外ではjを宣言していないので未定義エラーになるのが当り前です。 この場合のiの様にループの中だけで有効なのが都合のいいものもありますし、もっと大きな範囲が必要なケースもあります。 変数やメソッド、クラスなど、あらゆるものの「名前」には有効な範囲があるので、常に意識する必要があります。

w531230
質問者

お礼

ご回答ありがとうございます。

回答No.4

私は、昔Javaの勉強をしておりました。Javaをマスターにするために通る所はまず、コンソールアプリケーションからですよね。 さて、本題に入りたいと思います。 1からnまでの和を求めます。 nの値:5 1から5までの和は0です。 1から5までの和は1です。 1から5までの和は3です。 1から5までの和は6です。 1から5までの和は10です。 1から5までの和は15です。 という結果表示を、 1からnまでの和を求めます。 nの値:5 1から5までの和は15です。 の3行にしたいわけですよね。まずはfor文のところから直していきます。 for ( int i = 0, j = 0; i <= n; i++, j += i) { System.out.println("1から"+n+"までの和は"+j+"です。"); } では今、n回分の表示がされてしまっていますね。そこでは、System.out.println("1から"+n+"までの和は"+j+"です。");の記述を消してください。ループが終わってからSystem.out.println("1から"+n+"までの和は"+j+"です。");を記述してください。もう一つ直したほうがいい点があります。1からnまでの合計を足して結果を出力しますよね。しかし実際は、forループのiの初期値が0のため、0~n回ループしていることになります。つまり、ループする回数が1回多いのです。iの初期値を0から1に変更するといいかもしれません。以下に、例を示します。 例) Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); for ( int i = 1, j = 0; i <= n; i++, j += i); System.out.println("1から"+n+"までの和は"+j+"です。"); これで上手くいくと思います。

w531230
質問者

お礼

ご解答のほど、ありがとうございます。 ただ、ご解答されたことをやってみましたが、うまいこといきませんでした。 なんとか自分で色々と試して見て、なんとか解決するこができました。以下が当方の解答になります。 import java.util.Scanner; class Ensyuu413 { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); int j = 0; for (int i = 0; i <= n; i++) {j += i;} System.out.println("1から"+n+"までの和は"+j+"です。"); } }

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

自分で修正できるようにするには、今発生している現象を客観的に分析するのが近道です。 ○表示したいのは > 1から5までの和は15です。 だけ、それなのに、 1から5までの和は0です。 ~ 1から5までの和は10です。 が表示される。 ○プログラムでなにををしなければ、勝手に出力されることはない。今出ているような文章を表示しているのはプログラム中にしか無いはず プログラム中で該当するのは > System.out.println("1から"+n+"までの和は"+j+"です。"); の1行だけ。 ○以上から、次のことがわかります 理想: System.out.printlnを1回だけ実行したい 現実:複数実行されている ○一つしか書いてないものが何度も実行される、ということは、ループが間違えているか、ループ内での処理んが間違えているか、が疑われます。プログラムを見ると forがあります。このループ処理をよく確認する必要があるようです。 「思い込み」は厳禁です。デバッガ等でちゃんと調べるのがよいでしょう。 ありがちなのが for(~) {処理} と for(~) {処理} の違い。わかりますか? 以上で目的通りに動作させることは可能です。 ただ、余談にはなりますが、このプログラムは正直、作りがよくないと思います。 > for ( int i = 0, j = 0; i <= n; i++, j += i) この中に、ループの制御に使うiと計算に使うjとを一緒に書かれています。 文法は間違いではないのですが、なにをしようとしているのかがわかりにくいです。 for(ループ制御){ 繰り返す処理 } と分けた方が、よいでしょう。 もし、質問にあるような書き方がメインの本を参考にしているのだったら、独学向きではありません。

w531230
質問者

お礼

ご解答のほど、ありがとうございます。 ただ、ご解答されたことをやってみましたが、うまいこといきませんでした。 なんとか自分で色々と試して見て、なんとか解決するこができました。以下が当方の解答になります。 import java.util.Scanner; class Ensyuu413 { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); int j = 0; for (int i = 0; i <= n; i++) {j += i;} System.out.println("1から"+n+"までの和は"+j+"です。"); } }

noname#146007
noname#146007
回答No.2

あ、忘れてた。変数定義はループの外でよろしく。

w531230
質問者

お礼

ありがとうございます。

noname#146007
noname#146007
回答No.1

こんばんは。 自分はJAVAの経験者ではありませんが、Cの経験はあります。 基本的な制御文は、違わないので、大丈夫だと思います。 for文の制御がまだ理解されていないようです。 for( 初回だけの前処理 ; 処理条件の制御式 ; 実行後の後処理 ) 指摘(1)一応変数 j にも型は指定しましょう。 指摘(2)初期値がで0、条件が0≦5、ということは、6回実行することになります。 指摘(3)問題の方の出力は1回だけですよね。     ループ1回毎に出力するのは、おかしいですよね。     まあ、確認の為にあえてそうしているのでしょうけど。 以上をふまえると、何パターンかあります。 "回答1:結果が合っていればいいといえばいいですが、 "    この場合、計算(ループ)回数が1回余分ですね。 for ( int i = 0 , int j = 0; i <= n; i++ ,j += i) { } System.out.println("1から"+n+"までの和は"+j+"です。"); "回答2:別に初期値が必ず0である必要はありません。 for ( int i = 1 , int j = 0; i <= n; i++ ) { j += i; } System.out.println("1から"+n+"までの和は"+j+"です。"); "回答3:無理にFor文の後処理で行うことはないです。 for ( int i = 0 , int j = 0; i < n; ) { i++; j += i; } System.out.println("1から"+n+"までの和は"+j+"です。"); あと問題は、For文でって書いてあるんですか? 時には、DOやWHILEを使った方が、楽な場合もあります。 いろいろ試して見て下さい。

w531230
質問者

お礼

ご解答のほど、ありがとうございます。 ただ、ご解答されたことをやってみましたが、うまいこといきませんでした。 なんとか自分で色々と試して見て、なんとか解決するこができました。以下が当方の解答になります。 あと、この問題はfor分で解答しなさいという、指示でした。 質問の詳細不足で申し訳ありませんでした。 import java.util.Scanner; class Ensyuu413 { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); int j = 0; for (int i = 0; i <= n; i++) {j += i;} System.out.println("1から"+n+"までの和は"+j+"です。"); } }

関連するQ&A