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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

Q&A

解決済

2回答

18360閲覧

Javaで、for文の中にif文がある場合の正確な制御の仕方についてお聞きしたいです。

ryoogo

総合スコア7

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

0グッド

0クリップ

投稿2017/01/13 13:24

###前提・実現したいこと
プログラミング初心者です。
Javaでプログラムを組んでいます。
以下のように、for文の中にif文がある条件分岐なのですが、無限回試行されてしまいます。基礎的な質問で申し訳ありませんが、ご回答をお願いしたいです。

###発生している問題・エラーメッセージ
120回の試行を行いたいが無限回の試行になってしまう。
120回の試行それぞれのデータを取り出したいです。

###該当のソースコード

java

1 for ( int i = 2; i<10; i++){ 2 for ( int j = 1; j<i; j++){ 3 for ( int k = 0; k<j; k++){ 4 if ( 条件文1 ){ 5 実行文1 6 } 7 else if ( 条件文2 ){ 8 実行文2 9 } 10 else if ( 条件文3 ){ 11 実行文3 12 } 13 else if ( 条件文4 ){ 14 実行文4 15 } 16 else if ( 条件文5 ){ 17 実行文5 18 } 19 else{ 20 実行文6 21 } 22 }}}

###試したこと
for文のみで試行したところ、120回で終わったので、if文の抜け方に問題があると思いますが、よくわかりません。。。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

i,j,kをfor文内で書き換えていないですか?

投稿2017/01/13 13:49

yona

総合スコア18155

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

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

ryoogo

2017/01/13 14:24

ご回答ありがとうございます。書き換えてはいませんでしたが、他のファイルからgetで引っ張ってきている部分がダメだったみたいです。
guest

0

ベストアンサー

たとえば、以下のように実行しても無限回は試行されません
具体的にどのようなコードを書いて無限回実行されたのでしょうか

java

1class OAL{ 2 3public static void main(String[] args){ 4 5 for ( int i = 2; i<10; i++){ 6 for ( int j = 1; j<i; j++){ 7 for ( int k = 0; k<j; k++){ 8 if (k==2){ 9 System.out.println("k2"); 10 11 } 12 else if (k==0 ){ 13 System.out.println("k0"); 14 } 15 else if ( i==3 ){ 16 System.out.println("i3"); 17 18 } 19 else if (j==1 ){ 20 System.out.println("j1"); 21 22 } 23 else if (j==2 ){ 24 System.out.println("j2"); 25 26 } 27 else{ 28 System.out.println("0"); 29 30 } 31 }}} 32} 33 34}

書き加えられたコメント内のコードに足りない分を追加して実行すると以下のようなコードで何十行か有限回実行された結果が出力されました

java

1class RUD{ 2public static void main(String[] args){ 3 4 5ddd(); 6 7} 8 9 10public static int ddd(){ 11 12int price=100; 13int quantity=10; 14int sell0=30; 15int sell1=40; 16int sell2=50; 17int a3=60; 18int summax=46; 19int gene1=99; 20int gene2=99; 21int sumgene=33; 22int gene0=94; 23int PO0 =104; 24int POsell0=309; 25int PObuy0=44; 26int POuse0=70; 27int dem0=90; 28int min0=66; 29int payoff=61; 30int a0=62; 31int max0=22; 32for ( int i = 2; i<10; i++){ 33for ( int j = 1; j<i; j++){ 34for ( int k = 0; k<j; k++){ 35System.out.println("iは" + i +"jは" + j + "kは" + k ); 36 37("希望販売価格1"+i*10).equals("希望販売価格"+i*10); 38 39("希望販売価格"+i*10).equals("希望販売価格"+i*10); 40//myAction.getActionName().equals("希望販売価格"+i*10); 41//otherAction1.getActionName().equals("希望販売価格"+ j*10); 42//otherAction2.getActionName().equals("希望販売価格"+ k*10); 43 44if ( k*10/a3 + summax <= gene2 ){ 45price = k*10; 46quantity = price/a3 + summax; 47sell0 = 0; 48sell1 = 0; 49sell2 = quantity; 50} 51else if ( k*10 < a3 * (gene2-summax) && a3 * (gene2-summax) <j*10 ){ 52price = a3 * (gene2-summax); 53quantity = gene2; 54sell0 = 0; 55sell1 = 0; 56sell2 = quantity; 57} 58else if ( j*10/a3 + summax <= gene2 + gene1 ){ 59price = j*10; 60quantity = price/a3 + summax; 61sell0 = 0; 62sell1 = quantity - gene2; 63sell2 = gene2; 64} 65else if ( j*10 < a3 * (gene2 + gene1 - summax) && a3 * (gene2 + gene1 - summax) <i*10 ){ 66price = a3 * (gene2 + gene1 - summax); 67quantity = gene2 + gene1; 68sell0 = 0; 69sell1 = gene1; 70sell2 = gene2; 71} 72else if ( i*10/a3 + summax <= sumgene ){ 73price = i*10; 74quantity = price/a3 + summax; 75sell0 = quantity - gene1 - gene2; 76sell1 = gene1; 77sell2 = gene2; 78} 79else{ 80price = a3 * (sumgene - summax); 81quantity = sumgene; 82sell0 = gene0; 83sell1 = gene1; 84sell2 = gene2; 85} 86dem0 = price/a0 + max0; 87POsell0 = price * sell0; 88PObuy0 = - price * dem0; 89POuse0 = 100 * min0 + (100 + price) * (dem0 - min0); 90PO0 = POsell0 +PObuy0 + POuse0; 91payoff = PO0; 92System.out.println(payoff); 93}}} 94return payoff; 95 96} 97 98} 99

if,elseif文両方共に問題があるとは思えません
問題がある可能性が残るとすればgetActionName()ですが、このコードに関する部分で無限ループが起きているとすれば、getActionName()のメソッドの中で無限回ループが起きているのではないでしょうか 後はこの入れ子for文の入ったメソッド(今回は仮にddd()としたもの)の呼び出し部自体に無限ループが起きているかもしれない、です。

投稿2017/01/13 13:34

編集2017/01/13 14:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ryoogo

2017/01/13 13:58

迅速な回答ありがとうございます。非常に助かります。 具体的には、以下のようなコードです。 summax,gene1,gene2,gene3など、新たに出てきているものは、このfor文の上で与えている定数となっています。 分かりにくく、申し訳ないのですが、お願いいたします。 ```java for ( int i = 2; i<10; i++){ for ( int j = 1; j<i; j++){ for ( int k = 0; k<j; k++){ System.out.println("iは" + i +"jは" + j + "kは" + k ); myAction.getActionName().equals("希望販売価格"+i*10); otherAction1.getActionName().equals("希望販売価格"+ j*10); otherAction2.getActionName().equals("希望販売価格"+ k*10); if ( k*10/a3 + summax <= gene2 ){ price = k*10; quantity = price/a3 + summax; sell0 = 0; sell1 = 0; sell2 = quantity; } else if ( k*10 < a3 * (gene2-summax) && a3 * (gene2-summax) <j*10 ){ price = a3 * (gene2-summax); quantity = gene2; sell0 = 0; sell1 = 0; sell2 = quantity; } else if ( j*10/a3 + summax <= gene2 + gene1 ){ price = j*10; quantity = price/a3 + summax; sell0 = 0; sell1 = quantity - gene2; sell2 = gene2; } else if ( j*10 < a3 * (gene2 + gene1 - summax) && a3 * (gene2 + gene1 - summax) <i*10 ){ price = a3 * (gene2 + gene1 - summax); quantity = gene2 + gene1; sell0 = 0; sell1 = gene1; sell2 = gene2; } else if ( i*10/a3 + summax <= sumgene ){ price = i*10; quantity = price/a3 + summax; sell0 = quantity - gene1 - gene2; sell1 = gene1; sell2 = gene2; } else{ price = a3 * (sumgene - summax); quantity = sumgene; sell0 = gene0; sell1 = gene1; sell2 = gene2; } dem0 = price/a0 + max0; POsell0 = price * sell0; PObuy0 = - price * dem0; POuse0 = 100 * min0 + (100 + price) * (dem0 - min0); PO0 = POsell0 +PObuy0 + POuse0; payoff = PO0; System.out.println(payoff); }}} return payoff; } ```
swordone

2017/01/13 14:13

それを質問内で書くべきです。ここだとマークダウン効かないので。
退会済みユーザー

退会済みユーザー

2017/01/13 14:13

長くなるので上記回答に追記して答えます
ryoogo

2017/01/13 14:23

なるほど、理解しました。ご指摘の部分を変更して試してみます。 迅速な回答ありがとうございます。非常に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問