takuma150318
@takuma150318

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

if文 java

解決したいこと

Elizaの簡単なプログラムを作成しており
else ifの条件がif文の条件だけしか出ていないため
"次の質問は??"を6回表示させた後に
"終わりを入力"出るようにしたいです。

発生している問題・エラー

for文の中とif文の条件

java2.png

該当するソースコード

java
		for (int i = 0; i <= 2; i++) {
			
				if (i <= 2) {
					System.out.println("次の質問は??");

				} else if (i >= 3) {
					System.out.println("終わりを入力");
					break;

				}

全体ソースコード
package guitest;

import java.util.Random;

//イライザクラス
class Eliza {

	public String hanasu(String str1) {

		int k1 = 0, k2 = 0;

		for (int i = 0; i <= 2; i++) {
			
				if (i <= 2) {
					System.out.println("次の質問は??");

				} else if (i >= 3) {
					System.out.println("終わりを入力");
					break;

				}

				// 私は○○だよに対応

				k1 = str1.indexOf("私は");

				k2 = str1.indexOf("だよ");

				if (k1 >= 0 && k2 >= 0) {

					String str2 = str1.substring(k1 + 2, k2);

					return ("こんにちは" + str2 + "さん");

				}

				// 「こんにちは」が含まれるか判断

				k1 = str1.indexOf("こんにちは");

				if (k1 >= 0)
					return ("こんにちは!");

				//「お話しよ」に「いいよ」と返す

				k1 = str1.indexOf("お話しよ");

				if (k1 >= 0)
					return ("いいよ!");

				/* どんな食べ物が好き?
				ここで、2つの分岐条件で「イチゴが好きと答えるか、」
				「私もそれが好き」と言い合わせるかの2択を行っている。
				*/
				k1 = str1.indexOf("食べ物は、");

				k2 = str1.indexOf("が好き");

				if (k1 >= 0 && k2 >= 0) {

					java.util.Date d = new java.util.Date();

					long t = d.getTime();

					if (t % 3 == 0)

						return ("私は、イチゴが好き.");

					else if (t % 3 == 1)

						return ("私もそれが好き");

				}

				// 「天気」が含まれるか判断

				k1 = str1.indexOf("いい天気だね");
				// 0から3までの範囲で乱数を1つ生成する
				Random rand = new Random();
				int k11 = rand.nextInt(3);

				// 取得した乱数の値によってt天気を決める。
				if (k11 == 0 && k1 == 0) {
					return ("今日は晴れだね");
				} else if (k11 == 1 && k1 == 1) {
					return ("今日は快晴だね");
				} else if (k11 == 2 && k1 == 1) {
					return ("今日は曇りだね");
				}

				// 私は○○を食べたに対応し「おいしそう」と答える。

				k1 = str1.indexOf("私は、");

				k2 = str1.indexOf("を食べたんだ");

				if (k1 >= 0 && k2 >= 0) {

					String str2 = str1.substring(2, k2);

					return (str2 + "おいしそうだね!");

				}

				// 私は○○してたよに対応
				//値を受けとりその値に返信する。

				k1 = str1.indexOf("今日は、");

				k2 = str1.indexOf("してたよ!");

				if (k11 >= 0 && k2 >= 0) {

					String str2 = str1.substring(k1 + 2, k2);

					return ("今日は" + str2 + "してたのか!");

				}
				k1 = str1.indexOf("そうだよ");
				if (k1 >= 0)
					return ("楽しそうだね!");

			}
		

		return ("会話の終了");
	}
}

自分で試したこと

条件式を何度抱えて実行してみたのですがelseの処理が行われていませんでした。

0

2Answer

質問の内容に入る前に、デバッグはどのように行っていますでしょうか?
ステップ実行を活用したり、処理の途中で変数の値を出力してみたりしていますでしょうか?
そのようなデバッグをすれば、おのずとバグに気付けると思います。

条件式を何度抱えて実行してみたのですがelseの処理が行われていませんでした。

for文の条件が2までで常にif (i <= 2)という条件を満たしており、elseの処理に入らなくなっているように思われます。

追記
2以下と3以上で処理を分けたい時は、

if (i <= 2){
    //処理
}
else if (i >= 3){
    //処理
}

ではなく、

if (i <= 2){
    //処理
}
else{
    //処理
}

でいいと思います。

1Like

Comments

  1. @takuma150318

    Questioner

    無事にプログラムが完成しました。
    ありがとうございました。
for (int i = 0; i <= 2; i++) {

変数 i の値は 0, 1, 2 と変化します。
3以上 になることはないので、elseの方の条件が成立することはありません。

06の値で7回ループするならば、

for (int i = 0; i <= 6; i++) {

にするといいですよ。
else の比較値も最後の値 6 に変更するか、@YottyPG さんが書かれているように 単に else だけにする必要があります。

1Like

Comments

  1. @takuma150318

    Questioner

    できました!
    ご丁寧に解説していただきありがとうございました。

Your answer might help someone💌