Enunciado

Informatização de registros de saúde. Ultimamente,

a questão da informatização dos registros de saúde

tem aparecido muito nos jornais. Essa possibilidade está

sendo abordada com cautela devido a questões de privacidade

e segurança de dados confidenciais, entre outras.

[Trataremos essas questões em outros exercícios.]

A informatização de registros de saúde poderia tornar

mais fácil o compartilhamento de perfis e históricos de

saúde de pacientes com todos os profissionais de saúde

que cuidam deles. Isso poderia melhorar a qualidade

do atendimento, evitar conflitos entre medicamentos e

poderia evitar a prescrição de medicamentos inapropriados,

além de reduzir custos e, em emergências, salvar

vidas. Nesse exercício, você projetará uma classe PerfilSaude

‘inicial’ para uma pessoa. Os atributos da

classe devem incluir nome, sobrenome, gênero e data

de nascimento (em atributos separados para dia, mês

e ano de nascimento), altura (em centímetros) e peso

(em quilos). Sua classe deverá ter um construtor que

receba esses dados. Para cada atributo, forneça funções

set e get. A classe também deverá incluir funções que

calculem e retornem a idade do usuário em anos, as frequências

cardíacas máxima e ideal (ver Exercício 16.16)

e o índice de massa corporal (IMC; ver Exercício 2.32).

Escreva uma aplicação que peça a informação da pessoa,

instancie um objeto da classe PerfilSaude para essa

pessoa e imprima a informação desse objeto — incluindo

nome, sobrenome, sexo, data de nascimento, altura

e peso —, e depois calcule e imprima a idade da pessoa

em anos, IMC, frequência cardíaca máxima e intervalo

da frequência ideal. A aplicação também deverá mostrar

o gráfico dos ‘valores de IMC’ do Exercício 2.32. Use a

mesma técnica do Exercício 16.16 para calcular a idade

da pessoa.

Passo 1

Vamos explicar detalhadamente a criação da classe HeartProfile e criar uma função principal que testará as funcionalidades da classe.

Usaremos a classe Date do exercício 16.15 como o membro de dados desta classe. Além disso, usaremos as informações de cálculo do exercício anterior para criar duas funções na classe.

Vamos começar definindo o arquivo de cabeçalho "HeartProfile.h".

Cabeçalho do arquivo e membros de dados privados:

#include

#include "Date.h"

using namespace std;

class HealthProfile {

public:

...

private:

string firstName;

string lastName;

char gender;

Date dateOfBirth;

double height;

double weight;

};

Os protótipos da função getter/setter:

class HealthProfile {

public:

...

const string &getFirstName() const;

void setFirstName(const string &firstName);

const string &getLastName() const;

void setLastName(const string &lastName);

char getGender() const;

void setGender(char gender);

const Date &getDateOfBirth() const;

void setDateOfBirth(const Date &dateOfBirth);

double getHeight() const;

void setHeight(double height);

double getWeight() const;

void setWeight(double weight);

...

private:

...

};

Passo 2

A função usada para calcular/exibir informações:

class HealthProfile {

public:

...

int getAge() const;

int getMaxiumumHeartRate(int age) const;

int getTargetHeartRate(int age) const;

double getBMI() const;

static void displayBMI();

void displayInfo();

private:

...

};

Agora, vamos implementar as funções no arquivo fonte "HealthProfile.cpp".

Vamos começar com o construtor, que inicializará os membros de dados inline da seguinte forma:

#include

#include "HealthProfile.h"

using namespace std;

HealthProfile::HealthProfile(const string &firstName,

const string &lastName,

char gender,

const Date &dateOfBirth,

double height, double weight)

: firstName(firstName), lastName(lastName),

gender(gender), dateOfBirth(dateOfBirth),

height(height), weight(weight) {}

const string &HealthProfile::getFirstName() const {

return firstName;

}

...

As funções getter retornarão valores de membros de dados correspondentes, enquanto as funções setter simplesmente definem os valores dos membros de dados para o valor passado.

As definições:

const string &HealthProfile::getFirstName() const {

return firstName;

}

void HealthProfile::setFirstName

(const string &firstName)

{

HealthProfile::firstName = firstName;

}

const string &HealthProfile::getLastName() const {

return lastName;

}

void HealthProfile::setLastName(const string &lastName) {

HealthProfile::lastName = lastName;

}

char HealthProfile::getGender() const {

return gender;

}

void HealthProfile::setGender(char gender) {

HealthProfile::gender = gender;

}

const Date &HealthProfile::getDateOfBirth() const {

return dateOfBirth;

}

void HealthProfile::setDateOfBirth

(const Date &dateOfBirth)

{

HealthProfile::dateOfBirth = dateOfBirth;

}

double HealthProfile::getHeight() const {

return height;

}

void HealthProfile::setHeight(double height) {

HealthProfile::height = height;

}

double HealthProfile::getWeight() const {

return weight;

}

void HealthProfile::setWeight(double weight) {

HealthProfile::weight = weight;

}

Passo 3

A função que usaremos para calcular a idade (em anos) da pessoa.

A função deve solicitar ao usuário que insira a data atual, pois não aprendemos como obter a data atual do próprio computador.

int HealthProfile::getAge() const

{

int month, day, year;

cout

cin >> month >> day >> year;

int age = year - dateOfBirth.getYear() - 1;

if (month - dateOfBirth.getMonth() == 0 &&

day - dateOfBirth.getDay() >= 0 ||

month - dateOfBirth.getMonth() > 0)

age++;

return age == -1 ? 0 : age;

}

As funções getMaxiumumHeartRate() e getTargetHeartRate() são explicadas no exercício anterior.

Faremos com que eles usem o valor de idade como parâmetro para evitar solicitar repetidamente que o usuário insira a data atual.

int HealthProfile::getMaxiumumHeartRate(int age) const

{

return 220 - age;

}

int HealthProfile::getTargetHeartRate(int age) const

{

int maximumHeartRate = getMaxiumumHeartRate(age);

double low = maximumHeartRate * 0.5;

double high = maximumHeartRate * 0.85;

return (int)((low + high) / 2);

}

A função getBMI() calcula o índice de massa corporal, enquanto a função estática displayBMI() gera um gráfico de valores/intervalos de IMC.

double HealthProfile::getBMI() const {

return (weight * 703) / (height * height);

}

void HealthProfile::displayBMI() {

cout

}

Por fim, temos uma função que será utilizada para exibir as informações armazenadas no objeto do perfil de saúde:

void HealthProfile::displayInfo() {

int age = getAge();

cout

dateOfBirth.displayDate();

cout

displayBMI();

}

O arquivo principal deve incluir o arquivo de cabeçalho "HealthProfile.h" para usar a classe que acabamos de definir:

#include

#include "HealthProfile.h"

using namespace std;

Criaremos uma função que será usada para inicializar um objeto HealthProfile.

Solicita que o usuário insira informações de uma pessoa, armazene as informações em variáveis locais e retorne uma lista inicializadora de um objeto HealthProfile da seguinte forma:

HealthProfile getHealthProfile()

{

string firstName, lastName;

cout

cin >> firstName >> lastName;

char gender;

cout

cin >> gender;

int month, day, year;

cout

cin >> month >> day >> year;

double height, weight;

cout

cin >> height;

cout

cin >> weight;

return {firstName,

lastName,

gender,

Date(month, day, year),

height,

weight};

}

Por fim, a função main utiliza as funções definidas anteriormente para inicializar um único objeto HealthProfile e exibir suas informações:

int main()

{

HealthProfile healthProfile = getHealthProfile();

healthProfile.displayInfo();

return 0;

}

Resposta

Ver o desenvolvimento.