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

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

ただいまの
回答率

90.86%

  • Java

    12816questions

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

ループ化の方法

受付中

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 1,060
退会済みユーザー

退会済みユーザー

public class Gohkaku {
    public static void main(String[] args){
        int math = new java.util.Random().nextInt(51);
        int japanese = new java.util.Random().nextInt(51);
        int sience = new java.util.Random().nextInt(51);
        int social = new java.util.Random().nextInt(51);
        int[] score = { math,japanese,sience,social };
        int sum = score[0] + score[1] + score[2] + score[3];
        if( sum >= 100 ){
            System.out.println(sum + "なので合格");
            } else if ( sum <= 100 ) {
            System.out.println(sum + "なので不合格"); 
        }
    }
}

この文を合格とするまでループ化させたいのですがどのように変えたらよろしいでしょうか?
whileの条件にsumを入れたかったのですが、sumを入れるためにグローバル変数にすると乱数が再生成されないということで困っています。
まだ入門本を読んでるレベルなのでwhileや、for等の簡単な文でご教示頂けると助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+2

whileの条件をtrue(無限ループ)にし、合格したらbreakでループを抜ける、というのはどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/29 17:05

    ありがとうございます。
    早速試してみましたところ無事できました。
    break文の使い道がいまいちイメージ出来ていなかったのでとても為になりました。
    また機会がありましたら宜しくお願い致します。

    キャンセル

+1

はじめてのStream APIプログラミングです。swordoneさんの回答をアレンジしました。

import java.util.stream.IntStream;

public class IntStream_ {
    public static void main(String[] args) {
        IntStream.generate(() -> 
                    IntStream.generate(
                        () -> (int)(Math.random() * 51)).limit(4).sum()
                    )
                 .peek(s -> 
                    System.out.println(
                        s + ((s >= 100) ? "なので合格" : "なので不合格")
                    )
                 )
                 .anyMatch(x -> x >= 100);       
    }
}

peekとanyMatchを発見するまでが長かった。やっと眠れる。
sipadan2003さん、swordoneさん、ありがとうございました。

Random.inits()を利用する(追記)

さらに改良しました。

import java.util.Random;
import java.util.stream.IntStream;

public class IntStream_ {
    public static void main(String[] args) {
        IntStream.generate(
            () -> (new Random()).ints(4l, 0, 51)
            .peek( s -> System.out.print( s + " ") )
            .sum()
        )
        .peek(
            s -> System.out.println(
                "+++p : " + s + ((s >= 100) ? " なので合格" : " なので不合格")
            )
        )
        .anyMatch( s -> s >= 100 );       
    }   
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

        int sum = 0;

        while(sum <= 100){

            int math = new java.util.Random().nextInt(51);
            int japanese = new java.util.Random().nextInt(51);
            int sience = new java.util.Random().nextInt(51);
            int social = new java.util.Random().nextInt(51);
            int[] score = { math,japanese,sience,social };

            sum = score[0] + score[1] + score[2] + score[3];

            if( sum >= 100 ){
                System.out.println(Integer.toString(sum) + "なので合格");
            } else if ( sum <= 100 ) {
                System.out.println(Integer.toString(sum) + "なので不合格"); 
            }
        }
    }
}


こんな感じでどうですかね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/29 17:19

    ありがとうございます。
    今確認したところ無事できました。
    グローバル変数をwhile文の中で上書きしてしまえばよかったんですね。
    勉強になりました。
    また機会がありましたら宜しくお願い致します。

    キャンセル

  • 2015/12/29 17:55

    質問とはズレてしまいますがグローバル変数について誤解されているようなので参考リンクを書いておきます。
    Javaには正確にはグローバル変数は存在しません。

    http://www.kab-studio.biz/Programing/OOPinJava/11/02.html
    http://www.openreference.org/articles/view/686#anchor3

    キャンセル

  • 2016/09/22 03:00

    while(sum < 100)ですね。バグは本質とは関係ないと思いますが。すみません。

    キャンセル

0

本題とは関係ないですが、いちいちRandomを生成しているのが非効率的です。
Math.random()を使うか、一つインスタンスを生成しておいて使うべきでしょう。

import java.util.Random;

public class Gohkaku { 
    public static void main(String[] args){ 
        int sum = 0;
        Random random = new Random();
        while(sum < 100)
        int math = random.nextInt(51);
        //あるいはこう書く 以下同じ
        //int math = (int)(Math.random() * 51);
        int japanese = random.nextInt(51); 
        int sience = random.nextInt(51); 
        int social = random.nextInt(51); 
        int[] score = { math,japanese,sience,social }; 
        int sum = score[0] + score[1] + score[2] + score[3]; 
        if( sum >= 100 ){ 
            System.out.println(sum + "なので合格"); 
        } else if ( sum <= 100 ) { 
            System.out.println(sum + "なので不合格");  
        } 
    } 
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

処理を関数にして、その関数の呼び出しを while で繰り返すようにしてみました。

また スコアの生成や合計計算部分は、質問文のままでも動作しますが、すこし書き換えてみました。
(無駄な変数をなくした、科目の数が増えても書き開ける部分がすくなくなるようにした)
乱数の生成部分も他の方の回答の内容を反映させています。

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.Random;

public class Gohkaku {
  public static void main(String[] args) {
    Random rnd = new Random();
    while(!hantei(rnd)) {}
  }

  static boolean hantei(Random rnd) {
    int[] score = {
      rnd.nextInt(51),  // math
      rnd.nextInt(51),  // japanese
      rnd.nextInt(51),  // sicence
      rnd.nextInt(51),  // social
    };
    // int sum = score[0] + score[1] + score[2] + score[3];
    IntStream intStream = Arrays.stream(score);
    int sum = intStream.sum();

    boolean ans = sum >= 100;
    if (ans) {
      System.out.println(sum + "なので合格");
    } else {
      System.out.println(sum + "なので不合格");
    }
    return ans;
  }
}


実行例

$ javac Gohkaku.java 

$ java Gohkaku
113なので合格

$ java Gohkaku
93なので不合格
91なので不合格
88なので不合格
153なので合格

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

入門中とのことですが、Java 8で導入されたStreamを使ったプログラム案です。

public static void main(String[] args) {
        boolean passed = false;
        final Random r = new Random();
        while(passed == false){
            final int sum = r.ints(4, 0, 51).sum();
            passed = (sum >= 100);
            if(passed){
                System.out.println(sum + "なので合格");
            }else{
                System.out.println(sum + "なので不合格");
            }
        }
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/22 03:19

    final int sum = r.ints(4, 0, 51).sum(); のfinalは必要ないと思います。(仮にsumをラムダ式の中から参照している場合でも、代入の後、sumを変更しなければ、コンパイラが暗黙finalとみなすので、明示的なfinalは必要ないのですが、sumはラムダ式で使われていないし...)finalにした意図はなんでしょうか?

    キャンセル

  • 2016/09/22 13:07

    finalはなくても構いません。
    個人的に再利用を防止する意味でfinalを積極的に使っているだけです。

    キャンセル

  • 2016/09/22 19:48

    今、ラムダ式を勉強しているので、もう一つ質問させてください。ストリームの利用でpassed = (sum >= 100);は、filter()を使えますか。使ったら不合格の場合、nullが返されるのでしょうか。あるいは、"なので合格"、"なので不合格"を直接返すとしたら、どうすればよいでしょうか。本題とは異なる質問なので恐縮です。

    キャンセル

  • 2016/09/23 00:09 編集

    filter()は対象のデータをふるい分けて絞り込むときに使うものなので、
    今回のケースでは適さないと考えています。

    次のように三項演算子を使う方法はいかがでしょうか?
    ーーーー
    passed = (sum >= 100);
    final String s = passed ? "なので合格" : "なので不合格";
    System.out.println(sum + s);
    ーーーー

    次のようにOptionalを使う方法もありますが、非効率的です。
    ーーーー
    final String str = Optional.of(sum).map(s -> (s >= 100) ? "なので合格" : "なので不合格").get();
    ーーーー

    キャンセル

  • 2016/09/23 01:29

    ありがとうございました。ストリームAPIを使うと、たぶん外側のwhileも内側に入れられるのだろうと思います。内部でSystem.out.printlnするので、いわゆる純粋ではないけど。

    キャンセル

0

booleanを返すメソッドとして切り出して、whileの継続条件に使う手もあります。

import java.util.stream.IntStream;

public class Q23614 {

    public static void main(String[] args) {
        while(!test());
    }

    static boolean test(){
        int score = IntStream.generate(() -> (int)(Math.random() * 51)).limit(4).sum();
        boolean passed = score >= 100;
        System.out.println(score + (passed ? "なので合格" : "なので不合格"));
        return passed;
    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    java ループ

    コード java public void play(){     Random rnd = new Random();         int run = rnd.nextIn

  • 受付中

    java For文が正常に動きません。

    初心者なのですが、forが処理できません。なぜでしょうか? 教えてくださいよろしくお願いします。 package game; import java.util.Rando

  • 解決済

    乱数表示から最大値を表示する Java

    いつもお世話になっております。 現在変数を表示させてから、最大値を求めるプログラムを組んでいます。 乱数は表示できる状態です。 開発環境Eclipse、言語はJavaです

  • 受付中

    ENTER実行処理

    Enterキーを押して、次の処理に移るCUIを作りたいのですが、思うようにいきません。勇者の攻撃のあとと、HP、MP表示のあとEnter押すまで次の処理しないようにしたのですが、教

  • 解決済

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

    整数データが1行に1つ計500個書かれているテキストファイルdata_5_1000_500.txtのデータの最大値、最小値、平均値を求めるプログラムCalcFile.javaを書き

  • 解決済

    00

    oooooooooooooooooooooooooooooooooooooooo

  • 受付中

    おみくじのプログラムについて

    while文を使って、好みのメッセージが出るまで(「吉」が出るまで)おみくじを引き続けるプログラムを作りたいのですが、何度も実行しても1回の実行につきメッセージは1つしか出てきませ

同じタグがついた質問を見る

  • Java

    12816questions

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