You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++心率计算程序可执行但输出异常,寻求技术排查建议

问题排查与修正方案

看起来你遇到的核心问题是数据没有正确存入类的成员变量,再加上年龄计算逻辑有误,导致输出不符合预期。咱们一步步拆解问题,然后给出修正后的代码:

1. 最关键的问题:Setter方法和构造函数没有正确给类成员赋值

你所有的setter方法里,都错误地声明了和类成员同名的局部变量,比如:

void HeartRates::setFirstName(string firstname) {
    string firstName = firstname; // 这里是创建了一个局部的firstName,和类成员没关系!
}

这个局部变量会覆盖类的成员变量,导致用户输入的姓名、出生日期根本没存到HeartRates对象里,所以后续调用get方法返回的都是默认值(或者未初始化的垃圾值)。

同样,第二个构造函数也犯了同样的错误:

HeartRates::HeartRates(std::string firstname, std::string lastname, int day, int month, int year) {
    string setFirstName(firstname); // 这不是调用setter,是创建局部变量!
    // ...其他同理
}

修正方式:

  • Setter方法里去掉局部变量的类型声明,直接给类成员赋值:
    void HeartRates::setFirstName(string firstname) {
        firstName = firstname; // 直接赋值给类的成员变量
    }
    
  • 构造函数要么直接给成员赋值,要么调用对应的setter:
    HeartRates::HeartRates(std::string firstname, std::string lastname, int day, int month, int year) {
        setFirstName(firstname);
        setLastName(lastname);
        setDayOfBirth(day);
        setMonthOfBirth(month);
        setYearOfBirth(year);
    }
    
  • 默认构造函数用初始化列表给成员赋值(更规范):
    HeartRates::HeartRates() : firstName("unknown"), lastName("unknown"), dayOfBirth(0), monthOfBirth(0), yearOfBirth(0) {}
    

2. 年龄计算逻辑错误

当前的getAge函数里,月份和日期的判断完全没起到作用,不管用户是否过了当年的生日,都直接返回当前年份 - 出生年份,这会导致年龄计算不准确。比如当前是2024年3月,用户生日是2000年4月,实际年龄是23,但你的代码会返回24。

修正后的年龄计算逻辑:

int HeartRates::getAge() {
    int currentYear, currentMonth, currentDay;
    cout << "Enter current year: " << endl;
    cin >> currentYear;
    cout << "Enter current month: " << endl;
    cin >> currentMonth;
    cout << "Enter current day: " << endl;
    cin >> currentDay;

    int age = currentYear - getYearOfBirth();
    // 如果当前月份小于出生月份,说明还没到生日,年龄减1
    if (currentMonth < getMonthOfBirth()) {
        age--;
    }
    // 如果月份相同,但当前日期小于出生日期,也减1
    else if (currentMonth == getMonthOfBirth() && currentDay < getDayOfBirth()) {
        age--;
    }
    return age;
}

3. 其他小问题优化

  • getTargetHeartRate函数输出的是浮点数,但用int类型的maxHR计算会导致精度丢失,建议强制转换为double类型计算:
    void HeartRates::getTargetHeartRate(int maxHR) {
        double lower = static_cast<double>(maxHR) * 0.5;
        double upper = static_cast<double>(maxHR) * 0.85;
        cout << "Your target heart rate is between " << lower << " and " << upper << " bpm." << endl;
    }
    
  • 把类的成员变量设为private,符合面向对象的封装原则,避免外部直接修改成员变量;
  • main函数末尾加上return 0,符合C++程序的规范。

修正后的完整代码

HeartRates.h

#include <string>
class HeartRates {
public:
    explicit HeartRates();
    HeartRates(std::string firstname, std::string lastname, int day, int month, int year);
    void setFirstName(std::string); 
    void setLastName(std::string); 
    void setDayOfBirth(int); 
    void setMonthOfBirth(int); 
    void setYearOfBirth(int); 
    std::string getFirstName() const; 
    std::string getLastName() const; 
    int getDayOfBirth() const; 
    int getMonthOfBirth() const; 
    int getYearOfBirth() const; 
    int getAge(); 
    int getMaxHeartRate(int); 
    void getTargetHeartRate(int); 
    void displayHeartRates(int); 
private:
    std::string firstName;
    std::string lastName;
    int dayOfBirth;
    int monthOfBirth;
    int yearOfBirth;
};

HeartRates.cpp

#include <iostream>
#include "HeartRates.h"
using namespace std;

HeartRates::HeartRates() : firstName("unknown"), lastName("unknown"), dayOfBirth(0), monthOfBirth(0), yearOfBirth(0) {}

HeartRates::HeartRates(std::string firstname, std::string lastname, int day, int month, int year) {
    setFirstName(firstname);
    setLastName(lastname);
    setDayOfBirth(day);
    setMonthOfBirth(month);
    setYearOfBirth(year);
}

void HeartRates::setFirstName(string firstname) {
    firstName = firstname;
}

void HeartRates::setLastName(string lastname) {
    lastName = lastname;
}

void HeartRates::setDayOfBirth(int day) {
    dayOfBirth = day;
}

void HeartRates::setMonthOfBirth(int month) {
    monthOfBirth = month;
}

void HeartRates::setYearOfBirth(int year) {
    yearOfBirth = year;
}

string HeartRates::getFirstName() const {
    return firstName;
}

string HeartRates::getLastName() const {
    return lastName;
}

int HeartRates::getDayOfBirth() const {
    return dayOfBirth;
}

int HeartRates::getMonthOfBirth() const {
    return monthOfBirth;
}

int HeartRates::getYearOfBirth() const {
    return yearOfBirth;
}

int HeartRates::getAge() {
    int currentYear, currentMonth, currentDay;
    cout << "Enter current year: " << endl;
    cin >> currentYear;
    cout << "Enter current month: " << endl;
    cin >> currentMonth;
    cout << "Enter current day: " << endl;
    cin >> currentDay;

    int age = currentYear - getYearOfBirth();
    if (currentMonth < getMonthOfBirth()) {
        age--;
    } else if (currentMonth == getMonthOfBirth() && currentDay < getDayOfBirth()) {
        age--;
    }
    return age;
}

int HeartRates::getMaxHeartRate(int age) {
    return 220 - age;
}

void HeartRates::getTargetHeartRate(int maxHR) {
    double lower = static_cast<double>(maxHR) * 0.5;
    double upper = static_cast<double>(maxHR) * 0.85;
    cout << "Your target heart rate is between " << lower << " and " << upper << " bpm." << endl;
}

void HeartRates::displayHeartRates(int age) {
    cout << "Hello " << getFirstName() << " " << getLastName() << endl;
    cout << "Your DOB is " << getDayOfBirth() << "/" << getMonthOfBirth() << "/" << getYearOfBirth() << endl;
    cout << "Your age is " << age << " years old" << endl;
}

main.cpp

#include <iostream>
#include "HeartRates.h"
using namespace std;
int main() {
    int d, m, y;
    string firstName, lastName;
    HeartRates heart;
    cout << "Please enter your first name: ";
    cin >> firstName;
    heart.setFirstName(firstName);
    cout << "Please enter your last name: ";
    cin >> lastName;
    heart.setLastName(lastName);
    cout << "What year were you born: ";
    cin >> y;
    heart.setYearOfBirth(y);
    cout << "What month were you born on: ";
    cin >> m;
    heart.setMonthOfBirth(m);
    cout << "What day were you born on: ";
    cin >> d;
    heart.setDayOfBirth(d);
    int age = heart.getAge();
    int maxHR = heart.getMaxHeartRate(age);
    heart.displayHeartRates(age);
    heart.getTargetHeartRate(maxHR);
    return 0;
}

这样修正后,程序应该能正确存储用户输入的数据,准确计算年龄和心率范围,输出符合预期了。

内容的提问来源于stack exchange,提问作者CodeoDavenport

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:47:51