以下はコマンドライン引数で任意の数の整数を受け取って、合計・平均・最大・最小を求めようとしたソースです。
しかし、実行したら最大値と最小値が正しく出ませんでした。
if文が間違っているのかもしれないと思ったのですが、はっきりと『ここが間違っている』という場所が分かりません。
どうかご指摘お願いします。

class Choco
{
public static void main (String[] args)
{
int i;
int sum = 0;
int max;
int min;

for ( i=0; i<args.length; i++)
sum += Integer.parseInt(args[i]);
double ave = sum/args.length;

max = args.length;
min = args.length;
if (args.length>max){
max = args.length;
}
if (args.length<min){
min = args.length;
}
System.out.println("合計は" + sum + "です。");
System.out.println("平均は" + ave + "です。");
System.out.println("最大値は" + max + "です。");
System.out.println("最小値は" + min + "です。");

}
}

このQ&Aに関連する最新のQ&A

A 回答 (1件)

添削してみました。


・args.length は、引数の数ですから最大値や最小値と比べるのは意味がありません。
・int / intは結果がint になってしまうので、doubleで計算させないとdoubleに代入する意味がありません。 
------------------------------------------------------------------
class Choco{
public static void main (String[] args) {
int i, v;
int sum = 0;
int max=Integer.MIN_VALUE;
int min=Integer.MAX_VALUE;

for ( i=0; i<args.length; i++){
v= Integer.parseInt(args[i]);
sum += v;
if(v>max)
max=v;
if(v<min)
min=v;
}

double ave = (double)sum/args.length;

System.out.println("合計は" + sum + "です。");
System.out.println("平均は" + ave + "です。");
System.out.println("最大値は" + max + "です。");
System.out.println("最小値は" + min + "です。");

}
}
    • good
    • 0
この回答へのお礼

添削ありがとうございます。
また、間違いの箇所の指摘があったのでどう間違っていたのかがよく分かりました。

お礼日時:2005/08/20 19:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小

入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小値のプログラムを下記に作成してみたら最小値が0になりました。そして、もう一つ繰り返し文を作ってみたら、最大値・最小値がうまく表示されました。この違いはどうしてですか?教えてください。

import java.io.*;

class Hairetu1
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("データはいくつですか?");
String str = br.readLine();
int num = Integer.parseInt(str);

int a[]=new int[num];
int i;

int max=0; int min=a[0];

for(i=0; i<a.length; i++){
System.out.print((i+1)+"番目は?");
str = br.readLine();
int tmp = Integer.parseInt(str);
a[i] = tmp;

if(max<tmp){
max=tmp;
}
if(min>tmp){
min=tmp;
}
}
System.out.println("入力した値は"+test.length);
System.out.println("最大は"+max);
System.out.println("最小は"+min);
}
}

入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小値のプログラムを下記に作成してみたら最小値が0になりました。そして、もう一つ繰り返し文を作ってみたら、最大値・最小値がうまく表示されました。この違いはどうしてですか?教えてください。

import java.io.*;

class Hairetu1
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("データはいくつですか?");
String str...続きを読む

Aベストアンサー

> int max=0; int min=a[0];

この時点でa[0]は配列を用意しただけで中身は初期値のままです。
よって、minにはintの初期値である0が入ります。
その後の入力で負の値が入力されない限り、minは0のままです。

>もう一つ繰り返し文を作ってみたら

というのが意味がわかりませんが、aを初期化せずに

max=0; min=a[0];
for(i=0; i<a.length; i++){
...

としたのなら、この場合は、前回のa[0]の値がminになるので、入力した値にa[0]以下の数値が含まれているときは正しい値になります。入力した値がすべてa[0]より大きかったら、正しい値になりません。



このような場合方法は次のどれかを使うのが常套手段です。

・入力値の範囲がある程度決っている場合(例:成人男性の身長(cm) 0以下や1000以上は有り得ない)
maxには有り得ないほど小さな数値、minには有り得ない程大きな数値を初期値として入れておく
→身長の例なら max=-10 ; min = 9999 ;等

・同じく、入力値に制限がある場合
入力値の範囲外の特定の数値を「初期値」として、max/minが初期値だったら判定無しに入力値をmax,minとする
→同じく、 max = min = 9999 ;
...
if(max==9999){ max=tmp;min=tmp;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

・制限無く使える方法
最初の入力時に判定無しで入力値をmax,minとする。
最初かどうかは、booleanで判定フラグを用意したり、今回のような場合には添字==0かどうかで判定する。
添字での判定例
if(i==0){ max=tmp;min=tmp;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

フラグでの判定例
boolean isFirst = true ;
...
if( isFirst ){ max=tmp;min=tmp;isFirst=false;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

・入力値はすべて記録してあって、かつ、入力した順番を入れ替えてもよい場合
ソートして、先頭と最終の要素を使う

> int max=0; int min=a[0];

この時点でa[0]は配列を用意しただけで中身は初期値のままです。
よって、minにはintの初期値である0が入ります。
その後の入力で負の値が入力されない限り、minは0のままです。

>もう一つ繰り返し文を作ってみたら

というのが意味がわかりませんが、aを初期化せずに

max=0; min=a[0];
for(i=0; i<a.length; i++){
...

としたのなら、この場合は、前回のa[0]の値がminになるので、入力した値にa[0]以下の数値が含まれているときは正しい値になります。入力した値がすべてa[0]より...続きを読む

Q【初心者です】javaで平均値を求めたいのですが...

import java.io.*;

public class ex31a {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader

(System.in));
double sum = 0.0;
while(true) {
System.out.print("double> ");
double x = (new Double(in.readLine())).doubleValue();
if(x == 0.0) { break; }
sum = sum + x;
}
System.out.println("avarage = " + (sum % n));
}
}


基本形はこのままで、最後の部分のSystem.out.printlnの部分を直したらいいんでしょうか。

import java.io.*;

public class ex31a {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader

(System.in));
double sum = 0.0;
while(true) {
System.out.print("double> ");
double x = (new Double(in.readLine())).doubleValue();
if(x == 0.0) { break; }
sum = sum + x;
}
System.out.println("avarage = " + (sum % n));
}
}


基本形はこのままで、最後の部分のSys...続きを読む

Aベストアンサー

import java.io.*;

public class ex31a {
public static void main(String[] args) throws Exception {
int n = 0; /* 個数を示すnをきちんと変数として宣言 */
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
double sum = 0.0;
while(true) {
System.out.print("double> ");
double x = (new Double(in.readLine())).doubleValue();
if(x == 0.0) { break; }
sum = sum + x;
n = n + 1;/* 個数を計算 */
}
/*
System.out.println("sum = " + sum );
System.out.println("n = " + n);
*/
/* %は余りを求めるものである。平均は/で割らないと*/

/* double/ intがどうなるのかを考えたことはないけどw */
System.out.println("avarage = " + (sum / n));
}
}

import java.io.*;

public class ex31a {
public static void main(String[] args) throws Exception {
int n = 0; /* 個数を示すnをきちんと変数として宣言 */
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
double sum = 0.0;
while(true) {
System.out.print("double> ");
double x = (new Double(in.readLine())).doubleValue();
if(x == 0.0) { break; }
sum = sum + x;
n = n + 1;/* 個数を計算 */
}
/*
System.out.println("sum = " + sum );
System.out.p...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q整数の桁数が取得できません

Javaで整数の桁数を取得するには、以下の方法しかないのでしょうか?

int num = 123;
// の桁数3を取得するには
int keta = Integer.toString(num).length;

Aベストアンサー

No.1の方の回答で取得できます。
ただlogを使うと重くなる(処理が遅くなる)との声もあるようです。(参考URL参照)
ちなみにこんな方法でも取得できます。

while(0<num){
num /= 10;
keta++;
}

ただこの方法ですとループが終わった(桁数が取得できた)後、
numの値が0になっていますので、numの値は必ず別の変数に
保持しておいてください。

ちなみに私はいつもmatchoriさんの方法で桁数取得しています。
それでは!

参考URL:http://www.vc-net.ne.jp/~ytp/bbs/java/bbs6333.html

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q配列で最大・最小値を求める

import java.io.*;
class Prog10_2
{
public static void main(String args[])throws IOException
{
System.out.println("10個の整数を入力してください。");

BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

int num[] = new int[10];
for(int i=0; i<num.length; i++){
String str = br.readLine();
int tmp = Integer.parseInt(str);
num[i] = tmp;
}

int max = 0;
int min = 0;

for(int i=0; i<num.length; i++){
if(max < num[i]){
max = num[i];
}

if(min > num[i]){
min = num[i];
}
}
System.out.println("最大値は"+max+"で、最小値は"+min+"です。");
}
}
 
というコマンドを実行すると、最大値はちゃんと表示されるのですが、
最小値はいつも"0"しか表示されません。どこを修正すればいいのでしょうか?
どなたか分かる方いらっしゃいましたら、よろしくお願いします。

import java.io.*;
class Prog10_2
{
public static void main(String args[])throws IOException
{
System.out.println("10個の整数を入力してください。");

BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

int num[] = new int[10];
for(int i=0; i<num.length; i++){
String str = br.readLine();
int tmp = Integer.parseInt(str);
num[i] = tmp;
}

int max = 0;
int min = 0;

for(int i=0; i<num....続きを読む

Aベストアンサー

>int min = 0;

int min=num[0];
にするか
int min=Integer.MAX_VALUE;
にする

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

Q要素数が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の練習問題でわからなくて困っています

以下は線形探索のプログラムで、このプログラムを改良して、
要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

以下のような簡単なプログラムでできる方法で行いたいです。
どなたか答えまたはヒントを下さい、お願いします。
------------------------------------------------------------
import java.util.Random;
import java.util.Scanner;

public static void main (String[] args) {
Random rand = new...続きを読む

Aベストアンサー

えぇと, 「0~9 の値が重複しないようにする」ということ? だとしたら, 最初に 0~9 の値を入れておいて, ランダムに交換するというのが簡単ですね.
for (i=0; i < 10; ++i) a[i] = i;
for (i = 10; i > 1; --i) {
int r = rand.nextInt(i);
int t = a[r];
a[r] = a[i];
a[i] = t;
}
という感じ, かな?

QJAVAで素数判定

JAVAの勉強をしてます
練習問題で、素数判定のプログラムをしているのですが。

1~14までの判定はうまくいきますが、15の判定の時に素数であると表示されて困ってます。どなたかわかりませんか?

//読み込んだ数字 n が 15 の場合

if(n == 1)
System.out.println("素数ではありません。");
if(n == 2)
System.out.println("素数です。");

for (int i = 2; i < n; i++) {
if (n % i == 0) {
System.out.println("素数ではありません。");
break;
} else {
System.out.println("素数です。");
break;
}
}

--結果----------------------------------------------
素数です

Aベストアンサー

 簡単に直すには、判定と出力のロジックを分ければよいのです。
 for分のところだけ

boolean issosu = true;
for (int i=2; i<n ; i++) {
 if (n % i == 0) {
  issosu = false;
  break;
 }
}

if (issosu) {
 System.out.println("素数です。");
} else {
 System.out.println("素数ではありません。");
}

Q数字か文字列かを判定する関数

 JAVAの初心者です、宜しくお願いします。
  
 テキストボックスに入力された値を、数字か文字列かを判定する関数ってありますか、VBでは「isNumeric」とかがあるのですが、JAVAではヒットしませんでした。

 どこからどのように調べるのでしょうか。
 いいサイトがあれば教えて下さい。

Aベストアンサー

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parseInt(num);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
------------------------------------------------------------
結果
true
false
------------------------------------------------------------
実数の場合は、Double.parseDouble(String s)があります。
これも、例外(NumberFormatException)を発生します。

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parse...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング