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

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

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

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

Q&A

7回答

2626閲覧

ループ化の方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2015/12/29 07:37

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等の簡単な文でご教示頂けると助かります。

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

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

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

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

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

guest

回答7

0

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

投稿2015/12/29 07:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

atm_t

2015/12/29 08:05

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

0

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

Java

1import java.util.stream.IntStream; 2 3public class IntStream_ { 4 public static void main(String[] args) { 5 IntStream.generate(() -> 6 IntStream.generate( 7 () -> (int)(Math.random() * 51)).limit(4).sum() 8 ) 9 .peek(s -> 10 System.out.println( 11 s + ((s >= 100) ? "なので合格" : "なので不合格") 12 ) 13 ) 14 .anyMatch(x -> x >= 100); 15 } 16}

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

###Random.inits()を利用する(追記)
さらに改良しました。

Java

1import java.util.Random; 2import java.util.stream.IntStream; 3 4public class IntStream_ { 5 public static void main(String[] args) { 6 IntStream.generate( 7 () -> (new Random()).ints(4l, 0, 51) 8 .peek( s -> System.out.print( s + " ") ) 9 .sum() 10 ) 11 .peek( 12 s -> System.out.println( 13 "+++p : " + s + ((s >= 100) ? " なので合格" : " なので不合格") 14 ) 15 ) 16 .anyMatch( s -> s >= 100 ); 17 } 18}

投稿2016/09/23 20:28

編集2016/09/26 15:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

java

1public class Gohkaku { 2 public static void main(String[] args){ 3 4 int sum = 0; 5 6 while(sum <= 100){ 7 8 int math = new java.util.Random().nextInt(51); 9 int japanese = new java.util.Random().nextInt(51); 10 int sience = new java.util.Random().nextInt(51); 11 int social = new java.util.Random().nextInt(51); 12 int[] score = { math,japanese,sience,social }; 13 14 sum = score[0] + score[1] + score[2] + score[3]; 15 16 if( sum >= 100 ){ 17 System.out.println(Integer.toString(sum) + "なので合格"); 18 } else if ( sum <= 100 ) { 19 System.out.println(Integer.toString(sum) + "なので不合格"); 20 } 21 } 22 } 23}

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

投稿2015/12/29 08:03

trick

総合スコア366

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

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

atm_t

2015/12/29 08:19

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

退会済みユーザー

2016/09/21 18:00

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

0

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

java

1import java.util.stream.IntStream; 2 3public class Q23614 { 4 5 public static void main(String[] args) { 6 while(!test()); 7 } 8 9 static boolean test(){ 10 int score = IntStream.generate(() -> (int)(Math.random() * 51)).limit(4).sum(); 11 boolean passed = score >= 100; 12 System.out.println(score + (passed ? "なので合格" : "なので不合格")); 13 return passed; 14 } 15 16}

投稿2016/09/22 17:58

swordone

総合スコア20651

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

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

0

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

Java

1 public static void main(String[] args) { 2 boolean passed = false; 3 final Random r = new Random(); 4 while(passed == false){ 5 final int sum = r.ints(4, 0, 51).sum(); 6 passed = (sum >= 100); 7 if(passed){ 8 System.out.println(sum + "なので合格"); 9 }else{ 10 System.out.println(sum + "なので不合格"); 11 } 12 } 13 }

投稿2016/06/14 13:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/09/21 18:19

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

退会済みユーザー

2016/09/22 04:07

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

退会済みユーザー

2016/09/22 10:48

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

退会済みユーザー

2016/09/22 15:20 編集

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/22 16:29

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

0

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

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

java

1import java.util.Arrays; 2import java.util.stream.IntStream; 3import java.util.Random; 4 5public class Gohkaku { 6 public static void main(String[] args) { 7 Random rnd = new Random(); 8 while(!hantei(rnd)) {} 9 } 10 11 static boolean hantei(Random rnd) { 12 int[] score = { 13 rnd.nextInt(51), // math 14 rnd.nextInt(51), // japanese 15 rnd.nextInt(51), // sicence 16 rnd.nextInt(51), // social 17 }; 18 // int sum = score[0] + score[1] + score[2] + score[3]; 19 IntStream intStream = Arrays.stream(score); 20 int sum = intStream.sum(); 21 22 boolean ans = sum >= 100; 23 if (ans) { 24 System.out.println(sum + "なので合格"); 25 } else { 26 System.out.println(sum + "なので不合格"); 27 } 28 return ans; 29 } 30}

実行例

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

投稿2015/12/29 10:23

編集2015/12/29 13:26
katoy

総合スコア22324

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

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

0

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

java

1import java.util.Random; 2 3public class Gohkaku { 4 public static void main(String[] args){ 5 int sum = 0; 6 Random random = new Random(); 7 while(sum < 100) 8 int math = random.nextInt(51); 9 //あるいはこう書く 以下同じ 10 //int math = (int)(Math.random() * 51); 11 int japanese = random.nextInt(51); 12 int sience = random.nextInt(51); 13 int social = random.nextInt(51); 14 int[] score = { math,japanese,sience,social }; 15 int sum = score[0] + score[1] + score[2] + score[3]; 16 if( sum >= 100 ){ 17 System.out.println(sum + "なので合格"); 18 } else if ( sum <= 100 ) { 19 System.out.println(sum + "なので不合格"); 20 } 21 } 22}

投稿2015/12/29 08:34

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問