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
相关产品推荐
相关产品推荐

