[size=18]Escreva uma classe chamada Pessoa que contenha os atributos privados denominados
[color=red]nome[/color], [color=blue]peso[/color], [color=orange]altura[/color] e [color=green]sexo[/color]. Além disso,[/size] a) Crie um construtor que inicialize todos os membros de dados com os valores
recebidos como argumento. b) Crie os métodos de acesso (getters e setters) para todos os atributos. Os métodos
setters (booleanos) devem validar os dados de entrada, retornando verdadeiro
somente quando as condições definidas abaixo forem satisfeitas:
. o nome deve conter pelo menos dois caracteres;
. o peso deve ser positivo e menor que 200;
. a altura (em metros) deve ser maior que 0,50 e menor que 2,40;
. o sexo deve ser ‘M’ ou ‘F’ apenas. c) Escreva um método público para o cálculo do IMC (Índice de Massa Corporal). d) Escreva um método público para o cálculo do peso ideal de acordo com o sexo. e) Implemente uma função principal (main) que construa (declare) um objeto do tipo Pessoa, leia os atributos e escreva na tela o nome, o IMC e o peso ideal da pessoa,
informando ainda quantos quilos ela deve perder (ou ganhar) para atingir o seu
peso ideal.
São dadas as fórmulas: IMC = peso/altura2
peso ideal = 72,7 x altura ? 58 (para homens)
peso ideal = 62,1 x altura ? 44,7 (para mulheres)
O que eu consegui fazer logo abaixo
#include<iostream> //biblioteca
using namespace std;
class Pessoa {
private:
float peso,altura; //variável
char sexo;
string nome;
public:
Pessoa(){ //cria o construtor objeto
}
void setNome(string n,float p,float a,char s){ //recebe o valor do int main
nome = n;
peso = p;
altura = a;
sexo = s;
}
string getNome(){
return nome;
}
void print(){ //mostra o valor na tela
cout << "-------------\n";
cout << "Nome: " << nome << endl;
cout << "sexo: " << sexo << endl;
cout << "Peso: " << peso << endl;
cout << "Altura: " << altura << endl;
}
};
int main(){
Pessoa p; // chama o construtor-padrão
float peso,altura;
char sexo;
string nome;
cout << "Digite o nome: ";
getline(cin,nome);
cout << "Digite o sexo: ";
cin >> sexo;
cout<< "Digite a altura: ";
cin >> altura;
cout << "Digite o peso: ";
cin >> peso;
p.setNome(nome,peso,altura,sexo); //envia o valor para void setNome
p.print(); //enviar o resultado para void print()
} //fim
Mia dúvida é como vou fazer pra limtar o sexo em M ou F? e criar os métodos de acesso (getters e setters) para todos os atributos?
estou fazendo por partes. Alguém pode me auxiliar?
Crie um enum, contendo só os valores MASCULINO e FEMININO e faça do sexo um tipo desse enum.
Ao invés de um "setSexo()" crie dois métodos "setMasculino()" e "setFeminino()";
Teste se o sexo informado é do tipo M ou F, lance uma exceção caso não seja. Essa é a pior das alternativas, pq em C++ é sempre uma péssima idéia lançar exceções. Você pode também retornar um código de erro, mas acho que fica tão ruim quanto.
No caso, para os outros atributos (altura, peso, etc), não vai ser muito possível fugir da alternativa 3:
void Pessoa::setAltura(double a)
{
if (a < 0.5 || a > 2.4)
throw std::out_of_range("Altura deve estar entre 0,5 e 2,4 metros");
altura = a;
}
Putz, agora que li o enunciado, vi que o seu professor quer que retorne true se o set aceitou o atributo, ou false, caso contrário. Então fica mais simples ainda:
bool Pessoa::setAltura(double a) {
if (a < 0.5 || a > 2.4)
return false;
altura = a;
return true;
}
Dica número 1: (essa dica foi dada pelo sr. Brian Kernighan ou pelo sr. Dennis Ritchie - um dos dois - no tempo em que criaram a linguagem C, que é a mãe do C++): evite usar "float", use sempre "double", exceto quando você sabe o que está fazendo.
Dica número 2: setters e getters são baseados em receita de bolo.
Se você for suficientemente esperto, pode gerar getters e setters a partir de uma macro.
Em C++ eles seriam, basicamente:
virtual double getaltura() {
return peso;
}
void setNome(string n,float p,float a,char s){ //recebe o valor do int main
nome = n;
peso = p;
altura = a;
sexo = s;
}
string getNome(){
return nome;
}
void print(){ //mostra o valor na tela
cout << "-------------\n";
cout << "Nome: " << nome << endl;
cout << "sexo: " << peso << endl;
cout << "Peso: " << altura << endl;
cout << "Altura: " << sexo << endl;
}
};
int main(){
Pessoa p; // chama o construtor-padrão
double peso,altura;
char sexo;
string nome;
cout << "Digite o nome: ";
getline(cin,nome);
cout << "Digite o peso: ";
cin >> peso;
cout<< "Digite a altura: ";
cin >> altura;
cout << "Digite o sexo: ";
cin >> sexo;
p.setNome(nome,altura,sexo); //envia o valor para void setNome
p.setPeso(peso);
p.print(); //enviar o resultado para void print()
Entretanto , minha bola de cristal indica que você pode estar com o seguinte problema: para digitar na entrada um valor de altura (por exemplo, 1,80) , você não pode usar 1 vírgula 80 e sim 1 ponto 80 - ou seja, 1.80
Se você puser a vírgula, o ">>" se confunde todo e bagunça as próximas entradas.
Aparece esse erro
C:\Documents and Settings\PC\Meus documentos\C++ 10-02-2009-AULA-01\questao1.cpp||In function int main()':| C:\Documents and Settings\PC\Meus documentos\C++ 10-02-2009-AULA-01\questao1.cpp|79|error: no matching function for call toPessoa::setNome(std::string&, double&, char&)’|
C:\Documents and Settings\PC\Meus documentos\C++ 10-02-2009-AULA-01\questao1.cpp|39|note: candidates are: void Pessoa::setNome(std::string, float, float, char)|
||=== Build finished: 1 errors, 0 warnings ===|
bool setsexo (string s) {
if (sexo == ‘M’ || sexo == ‘F’){ <<<DEU ERRO BEM AQUI AGORA ESSE ERRO In member function `bool Pessoa::setsexo(std::string)’
no match for ‘operator==’ in ‘((Pessoa*)this)->Pessoa::sexo == ‘M’’|
no match for ‘operator==’ in ‘((Pessoa*)this)->Pessoa::sexo == ‘F’’|
||=== Build finished: 2 errors, 0 warnings ===|
sexo = s;
return true;
} else {
return false;
}
}
virtual string setsexo() {
return sexo;
}
void setNome(string n,float p,float a,string s){ //recebe o valor do int main
nome = n;
peso = p;
altura = a;
sexo = s;
}
string getNome(){
return nome;
}
void print(){ //mostra o valor na tela
cout << "-------------\n";
cout << "Nome: " << nome << endl;
cout << "sexo: " << peso << endl;
cout << "Peso: " << altura << endl;
cout << "Altura: " << sexo << endl;
}
};
int main(){
Pessoa p; // chama o construtor-padrão
double peso,altura;
string nome,sexo;
cout << "Digite o nome: ";
getline(cin,nome);
cout << "Digite o peso: ";
cin >> peso;
cout<< "Digite a altura: ";
cin >> altura;
cout << "Digite o sexo: ";
cin >> sexo;
p.setNome(nome,peso,altura,sexo); //envia o valor para void setNome
p.print(); //enviar o resultado para void print()
} //fim
Olha agora correndo tudo certo sem erro mas quando ele começa copila pede pra digita sexo eu coloco E ele mostra o sexo. E ele era mostra apenas o sexo M e F o que sera agora?
#include<iostream> //biblioteca
using namespace std;
Hum, você sabe conferir seu programa? Se você cria um método, provavelmente vai ter de chamá-lo dentro de seu programa, não? Veja se você está chamando setSexo, por exemplo.
Agora foi
mais quando eu digito os valores na tela ele mostra tipo digito 10 em peso mostra 6.91789+ não so em peso altura sexo mostra os valores do programa padrão.
#include<iostream> //biblioteca
using namespace std;
bool setsexo (char s) {
if (sexo == ‘M’ || sexo == ‘F’){
sexo = s;
return true;
} else {
return false;
}
}
virtual char setsexo() {
return sexo;
}
void setNome(string n){ //recebe o valor do int main
nome = n;
}
string getNome(){
return nome;
}
void print(){ //mostra o valor na tela
cout << "-------------\n";
cout << "Nome: " << nome << endl;
cout << "sexo: " << peso << endl;
cout << "Peso: " << altura << endl;
cout << "Altura: " << sexo << endl;
}
};
int main(){
Pessoa p; // chama o construtor-padrão
double peso,altura;
string nome;
char sexo;
cout << "Digite o nome: ";
getline(cin,nome);
cout << "Digite o peso: ";
cin >> peso;
cout<< "Digite a altura: ";
cin >> altura;
cout << "Digite o sexo: ";
cin >> sexo;
p.setNome(nome);
p.setPeso(peso);
p.setaltura(altura);
p.setsexo(sexo);
//envia o valor para void setNome
p.print(); //enviar o resultado para void print()
} //fim