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 回答
0

简单尝试使用 JOptionPane

公共类心率{

    私有字符串 fname;
    私有字符串 lname;
    私人 int 月,月 1;
    私人 int 日,第 1 天;
    私人 int 年,年 1;


    公共心率(int mn,int dy,int yr)
    {
        月=mn;
        一天=一天;
        年=年;
    }

    public void setFname(字符串优先)
    {
        fname=第一;
    }

    公共无效 setLname(字符串最后)
    {
        lname=最后一个;
    }

    公共无效 setMonth(int mn)
    {
        月1=mn;
    }

    公共无效 setDay(int dy)
    {
        第1天=天;
    }

    公共无效 setYear(int yr)
    {
        第 1 年 = 年;
    }

    公共字符串 getFname()
    {
        返回 fname;
    }

    公共字符串 getLname()
    {
        返回 lname;
    }

    公共 int getMonth()
    {
        返回月份1;
    }

    公共 int getDay()
    {
        返回第 1 天;
    }

    公共 int getYear()
    {
        回归年份;
    }
    公共 int getYear1()
    {
        返回年份1;
    }

    公共 int personAge()
    {

        年龄;
        年龄=getYear()-getYear1();

        返回年龄;
    }

    公共 int 最大心率()
    {
        最大整数;
        最大值=220-personAge();

        返回最大值;
    }

    公共字符串目标HR(){

        整数小时最大值;
        int hrMin;

        hrMax=(最大心率()*85)/100;
        hrMin=(最大心率()*50)/100;
        String message=String.format("目标心率范围:%d~%d", hrMin,hrMax);
        返回消息;

    }

}

//主要的

导入 java.util.Calendar;

导入 javax.swing.JOptionPane;
公共类 HeartRateTest {

    公共静态无效主要(字符串 [] 参数)
    {

        现在日历 = 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("输入你的名字");
        String lname=JOptionPane.showInputDialog("输入您的姓氏");

        String mn=JOptionPane.showInputDialog("输入您的出生月份(输入数值)");
        String dy=JOptionPane.showInputDialog("输入你的生日");
        String yr=JOptionPane.showInputDialog("请输入您的出生年份");

        int 月=整数.parseInt(mn);
        int day=Integer.parseInt(dy);
        int year=Integer.parseInt(yr);

        我的心.setFname(fname);
        myHeart.setLname(lname);
        myHeart.setMonth(月);
        我的心.setDay(天);
        myHeart.setYear(年);

        int age=myHeart.personAge();
        int maxHR=myHeart.maximumHeartRate();
        字符串消息=myHeart.targetHR();

        String msg=String.format("姓名: %s %s\n年龄: %d\n最大心率: %d\n%s",fname,lname,age,maxHR,message);

        JOptionPane.showMessageDialog(null,msg);

    }   

于 2016-08-27T20:40:52.333 回答