• 締切済み

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です。

  • Java
  • 回答数5
  • ありがとう数5

みんなの回答

  • 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

  • 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+"です。"); } }

  • フローチャートについて

    import java.util.Scanner; class Test{ 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 sum=0; int i=1; while(i<=n){ sum +=i; i++; } System.out.println("1から"+n+"までの和は"+sum+"です。"); } } 1からnまでの和を求めるプログラムで、この画像はそのフローチャートなのですが、 参考書にはsum+i→iと書かれています。 これってsum+i→sumの間違いですか? また、初期化や代入のフローチャートは 代入したい値を左に書いて右矢印にして右に変数を書くのが一般的なのでしょうか?

    • ベストアンサー
    • Java
  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • 要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

    JAVAの練習問題でわからなくて困っています 以下は線形探索のプログラムで、このプログラムを改良して、 要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。 以下のような簡単なプログラムでできる方法で行いたいです。 どなたか答えまたはヒントを下さい、お願いします。 ------------------------------------------------------------ import java.util.Random; import java.util.Scanner; public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); final int n = 10; //要素数 int[] a = new int[n]; //配列を宣言 for (int j = 0; j < n;) a[j] = rand.nextInt(10); System.out.print("配列aの全要素の値\n{ "); for (int j = 0; j < n; j++) System.out.print(a[j] + " "); System.out.println("}"); System.out.print("探す数値 : "); int key = stdIn.nextInt(); int i; for (i = 0; i < n; i++) if (a[i] == key) break; if (i < n) //探索成功 System.out.println("それはa[" + i + "]にあります。"); else //探索失敗 System.out.println("それはありません。"); } }

  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java
  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("整数値:");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print(\"整数値:\");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • JAVAのfor文で困っています。

    JAVAの勉強をしていますが、本の練習問題でわからなくて困っています。for文で以下の処理を行いたいです(do,whileはなしです)が、 *を5個ごとに改行したいのですが、改行してくれません。 問題の部分↓ if (n % 5 == 0) System.out.println(); 何か良い方法はありませんか?お願いします。 ------------------------------------------------- //(数を読み込んで)だ個数だけ * を5個ごと改行しながら表示 int n = 0; for (int i = n; n <= 0;){ System.out.print("何個*を表示しますか : "); n = stdIn.nextInt(); } for (int i = 1; i <= n; i++){ System.out.print("*"); if (n % 5 == 0) System.out.println(); } ------------------------------------------------

    • ベストアンサー
    • Java
  • javaの問題

    import java.util.Scanner; class test6{ static void printArray(int[] a) { for(int i=0;i<a.length;i++) System.out.print(String.format("%1$6s", (a[i]+" "))); System.out.println(); } static void printArray(int[][] a) { for(int[] i:a) { for(int j:i) System.out.print(String.format("%1$6s",(j+"\t"))); System.out.println(); } } public static void main(String[] args) { int[] a = {12,536,-8,7}; int[][] c = {{32,-1,32,45,67}, {535,99999,2}, {2,5,-123,9}}; printArray(a); printArray(c); } } このプログラムを表示するとこのようになるのですが、 12 536 -8 7 32 -1 32 45 67 535 99999 2 2 5 -123 9 これに一工夫加えて見やすくしたいです。 このような形にするのはどのようにすればよいのでしょうか + + | 32 -1 45 67 | | 535 99999 2 | | 2 5 -123 9 | + +

  • 対数表のプログラミング java

    どうもです。 以下のプログラミングをjavaで作成したいのですが、どうすればよいでしょうか? x = 1.00, 1.01, 1.02,・・・, 5.47, 5.48, 5.49に対して、log(10)xを示す対数表を作成しなさい 書式指定無し ちなみに自分で書いてみたらこうなりました import java.until.Scanner; class Taisuu { public static void main(String[] args) { final int N = 10; final int N = 100; System.out.println("+0.00%1d", j); System.out.println(); double base = 1; for (int i=0; i<M; ++i) { double x = base + 0.01*i; System.out.printf("%4.2f", x); for (int j=0; j<N; ++j) { double dx = 0.001*j; int log10x = (int)(1000000*Math.log10(x+dx)); System.out.printf("%06d", log10x); } System.out.println(); } } }