Escreva uma classe chamada Pessoa que contenha os atributos privados denominados em C++

[b]Hola boa tarde!

Presiso de ajuda nesse exercício logo abaixo.[/b]

[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?

Sim. Crie um get e um set para cada atributo.

Para limitar o sexo, existe 3 formas:

  1. Crie um enum, contendo só os valores MASCULINO e FEMININO e faça do sexo um tipo desse enum.
  2. Ao invés de um "setSexo()" crie dois métodos "setMasculino()" e "setFeminino()";
  3. 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 &lt; 0.5 || a &gt; 2.4) throw std::out_of_range(&quot;Altura deve estar entre 0,5 e 2,4 metros&quot;); altura = a; }

Para usar as exceções, não esqueça de dar um:

No início do seu programa.

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 &lt; 0.5 || a &gt; 2.4) return false; altura = a; return true; }

Você usará o mesmo princípio para o sexo.

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:

private:
    double peso;
public:
    virtual void setPeso (double valor) {
        peso  = valor;
    }
    virtual double getPeso() {
        return peso;
    }

Só que, pelo seu enunciado (custa muito você ler com mais atenção?) o seu professor ou professora está pedindo algo assim:

private:
    double peso;
public:
    virtual bool setPeso (double valor) {
        if (peso &gt;= 0.0 && peso &lt; 200.0) {
            peso = valor;
            return true;
        } else {
            return false;
        }
    }
    virtual double getPeso() {
        return peso;
    }

Poxa agora não ta atribuindo o valor dentro do setaltura e setPeso. porque será? onde estou errando?

#include<iostream> //biblioteca
using namespace std;

class Pessoa {
private:
string nome;
double peso,altura; //variável
char sexo;

 public:

Pessoa(){ //cria o construtor objeto

}
virtual bool setPeso (double valor) {
if (peso >= 0.0 && peso < 200.0) {
peso = valor;
return true;
} else {
return false;
}
}
virtual double getPeso() {
return peso;
}

virtual bool setaltura (double valor) {
if (altura >= 0.50 && altura < 240.0) {
altura = valor;
return true;
} else {
return false;
}
}

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 &lt;&lt; &quot;Digite o nome: &quot;;
 getline(cin,nome);
 cout &lt;&lt; &quot;Digite o peso: &quot;;
 cin &gt;&gt; peso;
 cout&lt;&lt; &quot;Digite a altura: &quot;;
 cin &gt;&gt; altura;
 cout &lt;&lt; &quot;Digite o sexo: &quot;;
 cin &gt;&gt; sexo;
  p.setNome(nome,altura,sexo); //envia o valor para void setNome
  p.setPeso(peso);
  p.print(); //enviar o resultado para void print()

} //fim

Alguêm pode me ajuda?

O que ocorre quando você roda o programa? Qual a entrada e a saída?

Saí sempre resultado tipo 5000 não era pra sair ele sair da altura.

Ajuda um pouco você rodar o seu programa e fazer um copy & paste do que ocorreu? Não entendi patavina - não sou português mas também não sou adivinho.

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 ===|

São erros de compilação.

a) Decida se você quer usar sempre “float” ou sempre “double”, não misture as coisas. (Eu decidiria usar sempre “double”).

b) Você tem de tomar mais cuidado com o que está fazendo. Programação precisa de capricho e atenção.

Passar 3 argumentos para um método que exige 4 argumentos vai dar problemas, por exemplo.

Pronto agora rodo agora meu problema é tipo o sexo deve ser ‘M’ ou ‘F’ apenas. como fazer?

Agora é por sua conta. Basicamente você vai ter um if mais ou menos assim:

if (valor == 'M' || valor == 'F') .......
else .......

#include<iostream> //biblioteca
using namespace std;

class Pessoa {
private:
string nome,sexo;
double peso,altura; //variável

public:
Pessoa(){ //cria o construtor objeto

}
virtual bool setPeso (double valor) {
if (peso >= 0.0 && peso < 200.0) {
peso = valor;
return true;
} else {
return false;
}
}
virtual double getPeso() {
return peso;
}

virtual bool setaltura (double valor) {
if (altura >= 0.50 && altura < 240.0) {
altura = valor;
return true;
} else {
return false;
}
}
virtual double getaltura() {
return peso;
}

bool setsexo (string s) {
if (sexo == ‘M’ || sexo == ‘F’){ <<<DEU ERRO BEM AQUI AGORA ESSE ERRO In member function `bool Pessoa::setsexo(std::string)’:expressionless:
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

Hum, o nome do seu setter deveria ser “setSexo” e ele deveria ter como argumento um char, não uma string, já que a variável “sexo” é de tipo char. OK?

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;

class Pessoa {
private:
string nome;
double peso,altura; //variável
char sexo;

 public:
  Pessoa(){ //cria o construtor objeto

}
virtual bool setPeso (double valor) {
if (peso >= 0.0 && peso < 200.0) {
peso = valor;
return true;
} else {
return false;
}
}
virtual double getPeso() {
return peso;
}

virtual bool setaltura (double valor) {
if (altura >= 0.50 && altura < 240.0) {
altura = valor;
return true;
}else {
return false;
}
}
virtual double getaltura() {
return peso;
}

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,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;
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,peso,altura,sexo); //envia o valor para void setNome
p.print(); //enviar o resultado para void print()
} //fim

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;

class Pessoa {
private:
string nome;
double peso,altura; //variável
char sexo;

 public:
  Pessoa(){ //cria o construtor objeto

}
virtual bool setPeso (double valor) {
if (peso >= 0.0 && peso < 200.0) {
peso = valor;
return true;
} else {
return false;
}
}
virtual double getPeso() {
return peso;
}

virtual bool setaltura (double valor) {
if (altura >= 0.50 && altura < 240.0) {
altura = valor;
return true;
}else {
return false;
}
}
virtual double getaltura() {
return peso;
}

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

o nome deve conter pelo menos dois caracteres;
e agora como atribuir 2 caracteres no mínimo?

#include<iostream> //biblioteca
using namespace std;
class Pessoa {
private:
string nome;
double peso,altura; //variável
char sexo;
public:
Pessoa(){ //cria o construtor objeto

}
bool setNome(string n){ //recebe o valor do int main
nome = n;
}
string getNome(){
return nome;
}

bool setPeso (double p) {
if (peso >= 0.0 && peso < 200.0) {
return false;
}
peso = p;
return true;
}
double getPeso() {
return peso;
}

bool setaltura (double a) {
if (altura >= 0.50 && altura < 240.0) {
return false;
}
altura = a;
return true;
}
double getaltura() {
return peso;
}

bool setsexo (char s) {
if (sexo == ‘M’ || sexo == ‘F’){
return false;
}
sexo = s;
return true;
}
char setsexo(){
return sexo;
}

void print(){ //mostra o valor na tela
cout << "-------------\n";
cout << "Nome: " << nome << endl;
cout << "Peso: " << peso << endl;
cout << "Altura: " << altura << endl;
cout << "sexo: " << 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