0

現在、これは私のコードであり、ユーザーが選択肢として A、B、C、D、E、または F を選択しない場合は、「有効な選択肢を入力してください」と表示する必要があります。問題は、「有効な....を入力してください」というステートメントを「else」条件に入れると、ユーザーが正しい選択を選択しないと変数ActivityFactorがないため、Javaは変数ActivityFactorを初期化するように求めます。 . これを修正する方法を知っている人はいますか?または、そのようなプログラムをどのようにコーディングすればよいでしょうか?

if((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("A"))
            ActivityFactor = 1.0;

        else if ((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("B"))
        ActivityFactor = 1.3;

        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("C"))
        ActivityFactor = 1.6;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("C"))
        ActivityFactor = 1.5;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("D"))
        ActivityFactor = 1.7;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("D"))
        ActivityFactor = 1.6;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("E"))
        ActivityFactor = 2.1;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("E"))
        ActivityFactor = 1.9;
        else if (inGender.equalsIgnoreCase("M") && inActivity.equalsIgnoreCase("F"))
        ActivityFactor = 2.4;
        else if (inGender.equalsIgnoreCase("F") && inActivity.equalsIgnoreCase("F"))
        ActivityFactor = 2.2;
        else
        {
       ActivityFactor = -1;

    }

    //After
    if(ActivityFactor != -1){
     tdee = (nBMR * ActivityFactor);
     System.out.println(tdee);}
    else
   { System.out.println("Please enter a valid choice");
    }
4

5 に答える 5

2

if ステートメントの条件がいずれも true でない場合は、 に何も割り当てずActivityFactor、行で使用しても初期化されませんdouble TDEE = (nBMR * ActivityFactor);

ここに示したコードの前に初期化するか、最後のケースでデフォルト値を与えるか、有効な値を取得するまでループします。

于 2012-12-15T23:25:17.560 に答える
1

ループの前に変数を初期化するか、ループ全体を関数内に配置してから、次のようにします。

double TDEE = (nBMR * getActivityFactor());

また、これを見てください:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

ハッピーコーディング!;)

于 2012-12-15T23:30:45.960 に答える
1

条件の前に、ActivityFactor を通常の値に初期化します。

たとえば、これを行うことができます:

// knowing that it can never be -1
// so if that value remains, you know that user entered wrong letter
ActivityFactor = -1

// then the conditional begins
if((inGender.equalsIgnoreCase("M") ||(inGender.equalsIgnoreCase ("F"))) && inActivity.equalsIgnoreCase("A"))
...

// after conditional...
if(activityFactor != -1){
    double TDEE = (nBMR * ActivityFactor);
}

ところで、ActivityFactor の代わりに「activityFactor」を使用することをお勧めします。

于 2012-12-15T23:34:40.987 に答える
0

次の 2 つのことを行う必要があります。

  1. ロジックをメソッドで囲む
  2. 引数がメソッド ロジックと一致しない場合、例外をスローします。

キャッチする例外をスローすることで、この問題を解決できます。

private double getTDEE (String inGender, String inActivity) {

   //logic
   else {
     throw new IllegalArgumentException("Please enter a valid choice");
   }

  return (nBMR * ActivityFactor);
}

例外のチュートリアル

于 2012-12-15T23:35:21.120 に答える
0

既にお気づきのように、コードの問題は、ユーザーが有効な入力を入力したかどうかに関係なく、実行が続行されることです。このため、多くのリファクタリングが予定されています。また、条件ステートメントをもう少しきれいにすることも試みます。しかし、それは個人的な好みです。

可能な解決策:

a) ループを使用する- ユーザーが満足のいく入力を入力したら、ループから抜け出します。

while( true ){ 
   /* get input from the user */

   /* run through validation checks... 
        and -break- out of the loop when they're satisfied */
}
/* do calculations here */

b)関数を使用して、このすべてのロジックを抽象化します..(Psyclopsが示唆するように)

個人的には、これらのアプローチを組み合わせて使用​​します。有効な入力が入力されていない場合に false を返す関数にこのロジックをすべて抽出し、while(! yourFunction() )完了するまで単純にループするような構造を使用します。参照渡しを使用して、ブール値以外に戻り値の型を使用する必要がないようにすることができます。

ループの前に変数を初期化しません! これは、プログラムが引き続き実行されることを意味します。ただし、そこには適切なデータがありません。これは、アプリケーションが単にクラッシュするよりも悪い可能性があります。

コードで答えを正確に提示したわけではありませんが、そのようなソリューションを概念的に構成/設計する方法を考えるための出発点になることを願っています. それは一般的に最も難しい部分です.. ;) 頑張ってください。

于 2012-12-15T23:43:17.850 に答える