#include<iostream> //bibliotecausingnamespacestd;classPessoa{private:floatpeso,altura;//variávelcharsexo;stringnome;public:Pessoa(){//cria o construtor objeto}voidsetNome(stringn,floatp,floata,chars){//recebe o valor do int mainnome=n;peso=p;altura=a;sexo=s;}stringgetNome(){returnnome;}voidprint(){//mostra o valor na telacout<<"-------------\n";cout<<"Nome: "<<nome<<endl;cout<<"sexo: "<<sexo<<endl;cout<<"Peso: "<<peso<<endl;cout<<"Altura: "<<altura<<endl;}};intmain(){Pessoap;// chama o construtor-padrãofloatpeso,altura;charsexo;stringnome;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 setNomep.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;
}
Para usar as exceções, não esqueça de dar um:
No início do seu programa.
V
ViniGodoy
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;
}
Você usará o mesmo princípio para o sexo.
T
thingol
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:
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);//enviaovalorparavoidsetNomep.setPeso(peso);p.print();//enviaroresultadoparavoidprint()
} //fim
G
gsdl
Alguêm pode me ajuda?
T
thingol
O que ocorre quando você roda o programa? Qual a entrada e a saída?
G
gsdl
Saí sempre resultado tipo 5000 não era pra sair ele sair da altura.
T
thingol
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.
T
thingol
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.
G
gsdl
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 ===|
T
thingol
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.
G
gsdl
Pronto agora rodo agora meu problema é tipo o sexo deve ser ‘M’ ou ‘F’ apenas. como fazer?
T
thingol
Agora é por sua conta. Basicamente você vai ter um if mais ou menos assim:
if(valor=='M'||valor=='F').......
else.......
G
gsdl
#include<iostream> //biblioteca
using namespace std;
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);//enviaovalorparavoidsetNomep.print();//enviaroresultadoparavoidprint()}//fim
T
thingol
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?
G
gsdl
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;
intmain(){Pessoap;//chamaoconstrutor-padrãodoublepeso,altura;stringnome;charsexo;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);//enviaovalorparavoidsetNomep.print();//enviaroresultadoparavoidprint()}//fim
T
thingol
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.
G
gsdl
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;
intmain(){Pessoap;//chamaoconstrutor-padrãodoublepeso,altura;stringnome;charsexo;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);//enviaovalorparavoidsetNomep.print();//enviaroresultadoparavoidprint()}//fim
G
gsdl
o nome deve conter pelo menos dois caracteres;
e agora como atribuir 2 caracteres no mínimo?
#include<iostream> //bibliotecausingnamespacestd;classPessoa{private:stringnome;doublepeso,altura;//variávelcharsexo;public:Pessoa(){//cria o construtor objeto
intmain(){Pessoap;//chamaoconstrutor-padrãodoublepeso,altura;stringnome;charsexo;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);//enviaovalorparavoidsetNomep.print();//enviaroresultadoparavoidprint()}//fim
T
thingol
Seu programa tem apenas um problema. Falta de atenção.
Que confusão é essa aí que você fez?
De qualquer maneira, dei uma ajeitada . Tire fora as coisas que estou imprimindo a mais e pus só para poder ver por que é que seu programa não estava rodando.
#include<iostream> //biblioteca#include <string>usingnamespacestd;classPessoa{private:stringnome;doublepeso,altura;//variávelcharsexo;public:Pessoa(){//cria o construtor objeto}virtualboolsetPeso(doublevalor){if(peso>=0.0&&peso<200.0){peso=valor;returntrue;}else{returnfalse;}}virtualdoublegetPeso(){returnpeso;}virtualboolsetaltura(doublevalor){cout<<"altura = "<<valor<<endl;if(valor>=0.50&&valor<240.0){altura=valor;cout<<"Dentro"<<endl;returntrue;}else{cout<<"Fora"<<endl;returnfalse;}}virtualdoublegetaltura(){returnaltura;}boolsetsexo(charvalor){if(valor=='M'||valor=='F'){sexo=valor;returntrue;}else{returnfalse;}}virtualcharsetsexo(){returnsexo;}voidsetNome(stringn){//recebe o valor do int mainnome=n;}stringgetNome(){returnnome;}voidprint(){//mostra o valor na telacout<<"-------------\n";cout<<"Nome: "<<nome.c_str()<<endl;cout<<"sexo: "<<sexo<<endl;cout<<"Peso: "<<peso<<endl;cout<<"Altura: "<<altura<<endl;}};intmain(){Pessoap;// chama o construtor-padrãodoublepeso,altura;stringnome;charsexo;cout<<"Digite o nome: ";getline(cin,nome);cout<<"Digite o peso: ";cin>>peso;cout<<peso<<endl;cout<<"Digite a altura: ";cin>>altura;cout<<altura<<endl;cout<<"Digite o sexo: ";cin>>sexo;cout<<sexo<<endl;p.setNome(nome);if(!p.setPeso(peso)){cerr<<"Peso fora dos limites"<<endl;}if(!p.setaltura(altura)){cerr<<"Altura fora dos limites"<<endl;}if(!p.setsexo(sexo)){cerr<<"Sexo fora dos limites"<<endl;}//envia o valor para void setNomep.print();//enviar o resultado para void print()}//fim
G
gsdl
Cara agora ta mostrando na tela 2 veses o peso tipo ele pede digite o peso = ele digito o valor exemplo 2 aparece 2 duas vese.
T
thingol
Sim, ele mostra 2 vezes o peso. Mas eu disse que era para você tirar as coisas que eu pus que eram só para ver onde estavam os erros. Acho que você é esperto suficiente para tirar essas coisas que pus a mais; basta você comparar o seu programa com as minhas alterações.
G
gsdl
Beleza consegui tirar mais o nome tipo la enuciado fala tem atribuir no mínimo 2 caracteres como fazer para quando o usuário digita 1 o programa da erro.
T
thingol
Veja a documentação da classe basic_string. Ela diz que você tem um método "size" ou "length" (são sinônimas) que retorna a quantidade de caracteres da string. Portanto, este código aqui:
string s = "folgado demais";
cout << s.size() << endl;
deve imprimir 14.
Vou trancar esta thread, para você aprender alguma coisa sozinho.