質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

16822閲覧

変数が初期化されていないというエラーが出て困っています

prog1717nm

総合スコア56

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/06/18 01:06

整数データが1行に1つ計500個書かれているテキストファイルdata_5_1000_500.txtのデータの最大値、最小値、平均値を求めるプログラムCalcFile.javaを書きたいです。ちなみに500個の整数は乱数です。
以下はプログラムです.
import java.util.Scanner;

public class CalcFile{
public static void main(String[] args) {

Scanner stdin = new Scanner(System.in); int max =Integer.MIN_VALUE,x; int min =Integer.MAX_VALUE; double ave; int numbers; int sum; int i; while(stdin.hasNext()) { x =stdin.nextInt(); if(x>max) max = x; if(x<min) min = x; } for(i=0;i<args.length;i++){ sum=+i; ave=sum/500;} System.out.printf("max=%d\n", max); System.out.printf("min=%d\n", min); System.out.printf("ave=%d\n", ave); }

}

コンパイルすると、エラー: 変数aveは初期化されていない可能性があります
となりました。
どこをどう直したらいいか分からなくて困っています。
aveは求めたい結果なのになぜこのエラーが出るのか分かりません。
プログラムの誤りを直して欲しいです....!
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

コードを整形した状態かつコンパイルエラーの発生しない状態にしたものが以下になります。

CalcFunc.java

1public class CalcFile { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 Scanner stdin = new Scanner(System.in); 8 int max = Integer.MIN_VALUE, x; 9 int min = Integer.MAX_VALUE; 10 double ave = 0.0d; 11 int numbers = 0; 12 int sum = 0; 13 int i = 0; 14 15 while (stdin.hasNext()) { 16 x = stdin.nextInt(); 17 if (x > max) 18 max = x; 19 if (x < min) 20 min = x; 21 } 22 23 for (i = 0; i < args.length; i++) { 24 sum = +i; 25 ave = sum / 500; 26 } 27 28 System.out.printf("max=%d\n", max); 29 System.out.printf("min=%d\n", min); 30 System.out.printf("ave=%d\n", ave); 31 } 32 33}

いくつか気になる点を。

  • Scanner stdinは処理が終了したら閉じなければなりません。
  • intやdoubleを宣言したあと、何らかの初期を入れておかずに分岐処理へ渡す場合は、コンパイルエラーになります。
  • 変数 numbers はどこにも使われていません。
  • for (i = 0; i < args.length; i++) { の部分で、argsを指定していますが、これはこのクラスのmainメソッド起動時に渡される引数です。
  • ave = sum / 500;と書かれていますが、現在のコードでは500個入力されているかをチェックするロジックはないため、すべて500で割り算してしまいます。入力のあった個数で割るのが正しいでしょう。
  • System.out.printf("ave=%d\n", ave);の行は、aveの値がdouble値のため、%dではフォーマットエラーになります。

なお、while (stdin.hasNext()) {で数値入力の終わらせ方は、CTRL+CないしはCTRL+Zです。

投稿2016/06/18 05:37

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ave への代入は for ループ中にあります。
for ループの中味は実行されない可能性があるので、このエラーが発生します。

そもそも、ave の計算が誤っています。
sum が決定してから、 sum を データ数で割ったものを ave にするのが正しいです。
プログラムを書きなおしてみました。

java

1import java.util.Scanner; 2 3public class CalcFileX { 4 public static void main(String[] args) { 5 6 Scanner stdin = new Scanner(System.in); 7 int max = Integer.MIN_VALUE; 8 int min = Integer.MAX_VALUE; 9 int sum = 0; 10 int count = 0; 11 double ave = 0.0; 12 13 while (stdin.hasNext()) { 14 int x = stdin.nextInt(); 15 min = Math.min(x, min); 16 max = Math.max(x, max); 17 sum += x; 18 count += 1; 19 }; 20 if (count == 0) { 21 System.out.printf("入力データがありません。\n"); 22 } else { 23 ave = 1.0 * sum / count; 24 System.out.printf("max=%d\n", max); 25 System.out.printf("min=%d\n", min); 26 System.out.printf("ave=%f\n", ave); 27 } 28 } 29}

最大、最小は Math.max, Math.min を使ってみました。

投稿2016/06/18 05:05

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

コードが間違っているように見えます。

iは読み込んだデータ数、sumは入力値の合計とします。

Java

1while(stdin.hasNext()) { 2 x =stdin.nextInt(); 3 if(x>max) max = x; 4 if(x<min) min = x; 5 sum += x; 6 i++; 7} 8 9ave=sum/i; 10

投稿2016/06/18 03:49

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

args.lengthが0の場合は、ave が初期化されません。
正攻法としてはargs.lengthが0の場合を分けるのがいいと思います。

例えば、
if (args.length == 0) {
// args.lengthが0である旨のメッセージを出力して、終了
}
else {
// 今と同じ処理
}
です。

投稿2016/06/18 02:02

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

値が入らない可能性のある変数aveを出力しようとしているからです。

for文の中でaveに値を入れているようですが、もしfor文の中に入らなかったらaveは空っぽですよね。

ということで単純に解決するのであればaveを初期化しましょう。
宣言の時に double ave = 0.0とでもしておけば、コンパイルエラーは消えるはずです。

投稿2016/06/18 01:14

kentei_syunrai

総合スコア946

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prog1717nm

2016/06/18 01:39

0を代入したらエラーは消えました。ありがとうございます。 でも平均値だけは出力されません。多分for文のところが間違っているんだと思います。 どこが間違っているか教えていただけないでしょうか?
kentei_syunrai

2016/06/18 01:49

少なくとも出力されないのは、printfの中身がおかしいからだと思います。 %dじゃなくて、%fでは? 
prog1717nm

2016/06/18 03:46

とりあえず出力はされました。 大変助かりました。ありがとうございました。
guest

0

初期化していない変数をプログラム内で使用することは危険なためコンパイルエラーになります。
これから求めるとかは関係ありません。0を代入するといいでしょう。

また、コードはコード専用の記述方法があるのでそちらを使用してください。

投稿2016/06/18 01:09

編集2016/06/18 01:09
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prog1717nm

2016/06/18 01:38

0を代入したらエラーは消えました。ありがとうございます。 でも平均値だけは出力されません。多分for文のところが間違っているんだと思います。 どこが間違っているか教えていただけないでしょうか?
yona

2016/06/18 01:41

argsの長さが0なんだと思います。 一つの投稿に複数の質問を乗せるのはよくないですよ。
prog1717nm

2016/06/18 03:45

すみません。今度から気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問