从计算中收到错误的结果

时间:2012-11-07 15:31:17

标签: java android eclipse

  

最大心率是最大运动时获得的最高心率。最大心率的差异取决于年龄和性别。有一些简单的方法来衡量您预测的最大心率,例如公式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;
    }

}
}
}

2 个答案:

答案 0 :(得分:4)

好吧,如果你男性为176岁,女性为169岁,我可以理解......但不是179.你确定吗?

怀疑 Integer.parseInt失败了 - 但你无法分辨,因为:

catch (NumberFormatException e){}

从不只捕获异常并完全忽略它。至少将登录

您对两个输入都做了同样的事情。如果解析操作失败,为什么还要继续(并设置伪造数据)?当然,你应该停在那一点,并通知用户他们应该修改他们的输入。

接下来是您执行算术的方式。您是在整数算术中完成所有操作,但随后使用Double.toString - 为什么?那只会给你一个以.0结尾的值。如果您想实际获得非整数结果,则需要在浮点运算。 e.g。

// 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;

答案 1 :(得分:0)

使用JOptionPane进行简单的尝试

public class HeartRates {

    private String fname;
    private String lname;
    private int month,month1;
    private int day,day1;
    private int year,year1;


    public HeartRates(int mn, int dy,int yr)
    {
        month=mn;
        day=dy;
        year=yr;
    }

    public void setFname(String first)
    {
        fname=first;
    }

    public void setLname(String last)
    {
        lname=last;
    }

    public void setMonth(int mn)
    {
        month1=mn;
    }

    public void setDay(int dy)
    {
        day1=dy;
    }

    public void setYear(int yr)
    {
        year1=yr;
    }

    public String getFname()
    {
        return fname;
    }

    public String getLname()
    {
        return lname;
    }

    public int getMonth()
    {
        return month1;
    }

    public int getDay()
    {
        return day1;
    }

    public int getYear()
    {
        return year;
    }
    public int getYear1()
    {
        return year1;
    }

    public int personAge()
    {

        int age;
        age=getYear()-getYear1();

        return age;
    }

    public int maximumHeartRate()
    {
        int max;
        max=220-personAge();

        return max;
    }

    public String targetHR(){

        int hrMax;
        int hrMin;

        hrMax=(maximumHeartRate()*85)/100;
        hrMin=(maximumHeartRate()*50)/100;
        String message=String.format("Target Heart Rate range: %d~%d", hrMin,hrMax);
        return message;

    }

}

//MAIN 

import java.util.Calendar;

import javax.swing.JOptionPane;
public class HeartRateTest {

    public static void main(String[] args)
    {

        Calendar now = Calendar.getInstance();   
        int cyear = now.get(Calendar.YEAR);  
        int cmonth=now.get(Calendar.MONTH);
        int cdate=now.get(Calendar.DATE);

        HeartRates myHeart=new HeartRates(cmonth,cdate,cyear);

        String fname=JOptionPane.showInputDialog("Enter your First Name");
        String lname=JOptionPane.showInputDialog("Enter your Last Name");

        String mn=JOptionPane.showInputDialog("Enter your Birth Month(Enter Numerical Value)");
        String dy=JOptionPane.showInputDialog("Enter your Birth Day");
        String yr=JOptionPane.showInputDialog("Enter your Birth Year");

        int month=Integer.parseInt(mn);
        int day=Integer.parseInt(dy);
        int year=Integer.parseInt(yr);

        myHeart.setFname(fname);
        myHeart.setLname(lname);
        myHeart.setMonth(month);
        myHeart.setDay(day);
        myHeart.setYear(year);

        int age=myHeart.personAge();
        int maxHR=myHeart.maximumHeartRate();
        String message=myHeart.targetHR();

        String msg=String.format("Name: %s %s\nAGE: %d\nMaximum Heart Rate: %d\n%s",fname,lname,age,maxHR,message);

        JOptionPane.showMessageDialog(null,msg);

    }