

Java初心者です。  
値を繰り返し入力し合計値が100を超える、または、10回入力が行われた場合に入力を止めそれまでの値を出力するプログラムを作成しています。

Eclipseでループ処理と配列を使って書いているんですが、whileで条件を指定したところ、  
以下の警告が出てしまいます。  
・演算子 < は引数の型 Scanner, int で未定義です  
スコープの外で定義していると思うのですが、  
エラーが出てしまう理由がよくわからないので、  
解決策を教えてください。  
お願いします。

[code]

        int s[] = new int[100];
        int input = 0;
        Scanner scan;
        // 値をキーボードから入力
        for (int i = 0; i < 10; i++) {
            System.out.println("整数を入力してください");
            scan = new Scanner(System.in);
            s[i] = scan.nextInt();
        }
    
        // 入力値が100を超える、または入力が10回行われたら入力ストップ
        while (scan < 10 && s < 100) {
    
        }
    
        // 入力された数値を全て出力
    }
    
[/code]


CC BY-SA 3.0
2017-08-15T08:24:54.153
37214
2017-08-15T10:40:44.110
2017-08-15T09:55:02.357
13972
24884
question
java
Javaで値を繰り返し入力し合計値が100を超える、または、10回入力が行われた場合に入力を止めそれまでの値を出力するプログラム

[code]

    int s[] = new int[10];
    int input = 0;
    
    // 配列sをクリア
    for(int i = 0; i < 10; i++) {
      s[i] = 0;
    }
    
    Scanner scan;
    // 値をキーボードから入力
    for (int i = 0; i < 10; i++) {
        System.out.println("整数を入力してください");
        scan = new Scanner(System.in);
        s[i] = scan.nextInt();
    
        int sum = 0;
        for(int j = 0; j < 10; j++) {
          sum += s[i];
        }
        if (sum > 100) break;
    }
    
[/code]


CC BY-SA 3.0
2017-08-15T08:35:06.697
37215
2017-08-15T08:35:06.697
24490
37214
answer


あなたのコードには以下のようなまずい点があります。

  * 指定条件で「入力を止め」ないといけないのに、あなたのコードは`for (int i = 0; i < 10; i++) {...}`で、必ずループを10回行なってしまった後で、`while(...) {...}`の中に「入力を止め」るための条件を書こうとしています。

  * あなたのコードの中で`scan`は`Scanner`型のインスタンスを表しています。これがあなたの意向を忖度して、時に「入力回数」を表すなんてことはありません。従って`scan`を`int`型の値である`10`と比較することもできません。

「演算子 < は引数の型 Scanner, int
で未定義です」と言うエラーは、「`Scanner`型の値と`int`型の値を比較できるような比較演算子`<`は存在しない」ことを表しているのであって、`Scanner`型の何かが未定義だといっているのではありません。

  * 別エラーで隠されているようですが、`s < 100`も正しい式ではありません。あなたのコードでは`s`は「`int`型の配列」を表します。Javaの配列では配列名`s`とだけ書いてその合計を表すような機能はありません。合計値が必要であれば、別途計算してやる必要があります。

* * *

そこら辺を修正した私なりのコードをお示ししておきます。

[code]

    public static void main(String[] args) {
        // 配列sの初期化
        int[] s = new int[10];
        //### 合計値を表す変数を持つ
        int total = 0;
        //### どこまで入力されたかを示す変数を持つ
        int lastIndex = -1;
        System.out.println("整数を入力してください"); //### プロプトの表示は最初の１回で良いはず
        Scanner scan = new Scanner(System.in); //### Scannerのインスタンスもループごとに作る必要はない
        // 入力を10(=配列のサイズ)回受け付ける
        for( int i = 0; i < s.length; ++i ) { //### 配列全体を回すときは i < s.length が常套句
            try {
                s[i] = scan.nextInt();
                total += s[i]; //### 合計値を更新
                //### どこまでを合計に加えたかを覚えておく
                lastIndex = i;
                //### 合計値が100を超えると入力ストップ
                //### (「入力が10回行われたら」は、for()で実現できている
                if( total > 100 ) {
                    break;
                }
            } catch( Exception e ) {
                //### 問題の条件にはないが、整数値が入力できない場合も入力終了
                break;
            }
        }
        scan.close();
        // 入力された数値を全て出力
        for( int i = 0; i <= lastIndex; ++i ) { //### `lastIndex`番目の値も有効なので`<=`になっている
             System.out.println(s[i]);
        }
    }
    
[/code]

操作・出力例(コード整形してあるのが出力部分)

> `整数を入力してください`  
>  10  
>  20  
>  30  
>  40  
>  50
[code]

>     10
>     20
>     30
>     40
>     50
>  
[/code]

※「100を超えたら」と言う表現ではぴったり100は「超え」てはいない、との判定が普通です。「それまでの値」に入力を超えることになった最後の値を含めるのかどうかは微妙ですが、上のコードでは「含める」動作になります。(私がこの課題を出して丸がもらえなかったら、出題が曖昧なのが悪いとごねるでしょう。)

操作・出力例2(出題指定外の条件による停止)

> `整数を入力してください`  
>  10  
>  20  
>  30  
>  end
[code]

>     10
>     20
>     30
>  
[/code]

最新のJavaコードとするのであれば、前質問で[Kohei
TAMURAさんが示された](https://ja.stackoverflow.com/a/37213/13972)ように、 _`try-with-
resources`を使う方がよりいい_
のだろうとは思うのですが、使用されるJavaのバージョンが不明ですので、少し古いJavaでも動くように書いてあります。(老Javaプログラマーが慣れている書き方をした、と言うのもありますが。)

少し細かめにあれこれコメントをつけてあります。十分理解されないまま課題レポートにコピペして終了として、次の課題に移るのではなく、しっかり理解していただいて、次の課題ではご自身で解ける部分を少しでも増やすようにしていただけるよう願っております。


CC BY-SA 3.0
2017-08-15T09:49:05.437
37221
2017-08-15T10:40:44.110
2020-06-17T08:14:45.997
-1
13972
37214
answer