1

最大心拍数とは、最大運動時に得られる最高心拍数です。最大心拍数の違いは、年齢と性別によって異なります。式 220 など、予測最大心拍数を測定する簡単な方法があります - あなたの年齢 = 男性の予測最大心拍数. たとえば、40 歳の男性の予測最大心拍数は 180 回/分です。

プログラムは、式を使用して男性の最大心拍数を計算する必要があります: 220 - 彼らの年齢 = 最大心拍数および: 212 - 彼らの年齢 = 女性の最大心拍数. ユーザーは年齢を入力し、性別を選択し、安静時心拍数を選択できる必要があります。次に、プログラムは次の式を使用して目標心拍数を決定する必要があります。

目標心拍数 = [(最大心拍数 – 安静時心拍数) × 80%]

プログラムは、ユーザーの最大心拍数、安静時心拍数、目標心拍数を表示できる必要があります。

しかし、何らかの理由で、プログラムを実行したときに受信すると、入力が完全に取り込まれていないようで、男性のボタンをクリックすると間違った答えが返され、男性の場合は 179.0、女性の場合は 169.0 という答えが返されます。

私はそれを何度も見直しましたが、この論理エラーを理解できないようです. これが私のコードです。

public class MainHMR extends Activity implements View.OnClickListener {

Button chkCmd;
CheckBox Male, Femail;
EditText age, RestHeart;
TextView MaxHeart, TargetHeart;

int m = 220;
int f = 212;
int AgeResult =0, RestResultFinal =0, TargetHeartFinal =0;
double MaleResult, FemailResult;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_hmr);
    Initilise();
    format();
    Male.setOnClickListener(this);
    Femail.setOnClickListener(this);
    chkCmd.setOnClickListener(this);

}

private void Initilise() {
    // TODO Auto-generated method stub
    /* Button */chkCmd = (Button) findViewById(R.id.bResults);
    /* checkBox */Male = (CheckBox) findViewById(R.id.cbM);
    /* checkBox */Femail = (CheckBox) findViewById(R.id.cbF);
    /* EditText */age = (EditText) findViewById(R.id.etAge);
    /* EditText */RestHeart = (EditText) findViewById(R.id.etRestHeart);
    /* TextView */TargetHeart = (TextView) findViewById(R.id.etTargetHeard);
}

private void format() {
    // TODO Auto-generated method stub

    String change = age.getText().toString();
    AgeResult = 0; // set it to 0 as the default
    try {
        AgeResult = Integer.parseInt(change);
        System.out.println(AgeResult);
    }
    catch (NumberFormatException e){}

    String changeTwo = RestHeart.getText().toString();
    RestResultFinal = 0; // set it to 0 as the default
    try {
        RestResultFinal = Integer.parseInt(changeTwo);
        System.out.println(RestResultFinal);
    }
    catch (NumberFormatException e){}
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch(v.getId()){
    case R.id.bResults:
    if (Male.isChecked()) {
        int result = m - AgeResult;
        MaleResult = ((result - RestResultFinal) * 0.8);
        String finalResult = Double.toString(MaleResult);
        TargetHeart.setText(finalResult);
    } else if (Femail.isChecked()) {
        int result = f - AgeResult;
        FemailResult = (int) ((result - RestResultFinal) * 0.8);
        String finalResult = Double.toString(FemailResult);
        TargetHeart.setText(finalResult);
        break;
    }

}
}
}
4

2 に答える 2

4

ええと、男性が 176、女性が 169 だったら理解できますが、179 ではありません。よろしいですか?

私はあなた Integer.parseIntのために失敗していると思います-しかし、あなたはこれのために言うことができません:

catch (NumberFormatException e){}

例外をキャッチして完全に無視しないでください少なくともそこにログインを入れてください。

両方の入力に対して同じことをしています。いずれかの解析操作が失敗した場合、なぜ続行する (そして偽のデータを配置する) 必要があるのでしょうか? 確かに、その時点で停止し、入力を修正する必要があることをユーザーに通知する必要があります。

次に、算術を実行する方法があります。あなたは整数演算でそれをすべてやっていますが、それからDouble.toString- なぜですか? それは、で終わる値を与えるだけです.0実際に整数以外の結果を取得したい場合は、浮動小数点で演算を実行する必要があります。例えば

// I've changed the names of some variables to comply with conventions
double maximumRate = MALE_MAXIMUM_RATE_LIMIT - parsedAge;
double targetRate = (maximumRate - parsedRestingRate) * 0.8;
于 2012-11-07T15:35:07.003 に答える