Glaucco 1 Denunciar post Postado Abril 9, 2009 Vou fazendo de pouco em pouco. Escreva uma classe chamada Aluno que contenha os atributos privados denominados nome, matricula, nota1, nota2, nota3, peso1, peso2 e peso3. Além disso, a) Crie um construtor-padrão para a classe. B) Crie um construtor que inicialize todos os membros de dados com os valores recebidos como argumento. c) Crie os métodos de acesso (getters e setters) para todos os atributos. Os métodos setters devem validar os dados de entrada conforme as regras definidas abaixo: ✔ o nome deve conter pelo menos dois caracteres; ✔ a matrícula de ser constituída de 9 dígitos apenas; d) Escreva um método público para calcular a média ponderada das três notas; e) Sabendo que os quatro primeiros dígitos da matrícula representam o ano de ingresso do aluno na instituição de ensino, escreva um método que, a partir da matrícula, retorne o ano de ingresso. f) Implemente um programa-exemplo para testar sua classe que utilize todos os atributos e métodos criados. Tá dando lup infinito na matrícula como fazer para limitar até 9 digitos sem dar lup ifinito? #include <iostream> using namespace std; class Aluno { private: string nome; int matricula; double nota1,nota2,nota3,peso1,peso2,peso3; public: Aluno(){//construtor } Aluno(string n,int m,double n1,double n2,double n3,double p1,double p2,double p3) { nome=n; matricula=m; nota1=n1; nota2=n2; nota3=n3; peso1=p1; peso2=p2; peso3=p3; } bool setNome(string no) { int tam=no.size(); if (tam<2) return false; nome=no; return true; } string getNome() { return nome; } bool setMatricula(int m){ // Método de Acesso para a validação da MATRICULA. if (m < 100000000 || m < 999999999){ return false; } matricula = m; return true; } int getMatricula(){ return matricula; } void print() { //mostra o valor na tela cout << "-------------\n"; cout << "Nome: " <<nome<< endl; cout << "Matricula: " <<matricula<< endl; } }; int main(){ Aluno p; string nome; int matricula; double nota1,nota2,nota3,peso1,peso2,peso3; do {//Repita cout << "Digite o nome: "; getline(cin,nome); } while (!p.setNome(nome));//Até do {//Repita cout << "Digite a Matricula: "; cin>>matricula; } while (!p.setMatricula(matricula));//Até p.print(); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 A condição está errada na matricula. bool setMatricula(int m){ // Método de Acesso para a validação da MATRICULA. if (m < 100000000 || m < 999999999){ matricula = m; return false; } return true; } Pelo que eu entendi, se o número de matricula estiver entre 100000000 e 999999999 então é um número válido. ficaria assim: bool setMatricula(int m) { if (m>100000000 && m<999999999) { matricula = m; return true; } else return false; Compartilhar este post Link para o post Compartilhar em outros sites
Glaucco 1 Denunciar post Postado Abril 9, 2009 VictorCacciari continua dando loop infinito eu digitei 11digitos deu loop Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 Não entendi... se você digitou um número de 11 digitos, então não é um número de matricula válido, ja era e se esperar que o loop continuasse... tenta digitar algo com 9 digitos e veja se não dá certo. Compartilhar este post Link para o post Compartilhar em outros sites
Glaucco 1 Denunciar post Postado Abril 9, 2009 é se eu digitar 9 da certo mais se eu digitar 11 mais de 11 acima de 11 ele fica aparesendo monte de nome na tela um loop. como fazer para não aparacer esse tanto de nome parece aquele filme matrix Compartilhar este post Link para o post Compartilhar em outros sites
Glaucco 1 Denunciar post Postado Abril 9, 2009 VictorCacciari eu acho pq tipo int Bits 32 bytes 4 Escala 2.147.483.647 quando eu digite 10000000000 ele passa da escala da um loop sera que é isso? Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 Não, o que acontece é um overflow. você quer colocar um pé, tamanho 48 em um sapato tamanho 40... se você declarar a sua variável "matricula" como unsigned long int esse problema não ocorrerá. Mas uma coisa é certa, eu sou do time que defende que o programador não tem que se preocupar com inputs errados... o usuário tem que ler o manual antes de utilizar o software! Essa coisa de ficar tratando todas as possibilidades possiveis de inputs só deixa o usuário cada vez mais preguiçoso. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 9, 2009 double nota1,nota2,nota3,peso1,peso2,peso3; Por que as notas precisam ser de precisão dupla? bool setMatricula(int m){ // Método de Acesso para a validação da MATRICULA. if (m < 100000000 || m < 999999999){ return false; } matricula = m; return true; } Se a matrícula for 123456789: é válida mas você diz que não. void print() { //mostra o valor na tela cout << "-------------\n"; cout << "Nome: " <<nome<< endl; cout << "Matricula: " <<matricula<< endl; } Novamente: método desnecessário e que nem é pedido no exercício. Use os getters! #include <iostream> #include <string> using namespace std; class Aluno { string nome; string matricula; float nota1,nota2,nota3; float peso1,peso2,peso3; bool restricaoNome(string NOME) { return nome.length() > 2; } bool restricaoMatricula(string MATRICULA) { return matricula.length() == 9; } public: Aluno() {} Aluno(string NOME, string MATRICULA, float NOTA1, float NOTA2, float NOTA3, float PESO1, float PESO2, float PESO3) { nome = NOME; matricula = MATRICULA; nota1 = NOTA1; nota2 = NOTA2; nota3 = NOTA3; peso1 = PESO1; peso2 = PESO2; peso3 = PESO3; } void setNome(string NOME) { if (!restricaoNome(NOME) ) nome = NOME; } string getNome() { return nome; } void setMatricula(string MATRICULA) { if(!restricaoMatricula(MATRICULA)) matricula = MATRICULA; } string getMatricula() { return matricula; } void setNota1(float NOTA1) { nota1 = NOTA1; } float getNota1() { return nota1; } void setNota2(float NOTA2) { nota2 = NOTA2; } float getNota2() { return nota2; } void setNota3(float NOTA3) { nota3 = NOTA3; } float getNota3() { return nota3; } float calcularMediaPonderada() { return (nota1*peso1+nota2*peso2+nota3*peso3)/(peso1+peso2+peso3); } string retornarAnoIngresso() { return matricula.substr(0,4); } }; int main() { Aluno A("Lucas","199902355",23.6F,5.8F,8.9F,3,2,4); cout << "Nome do aluno: " << A.getNome() << endl; cout << "Matricula: " << A.getMatricula() << endl; cout << "Media ponderada: " << A.calcularMediaPonderada() << endl; cout << "Ano de ingresso: " << A.retornarAnoIngresso() << endl; return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Glaucco 1 Denunciar post Postado Abril 10, 2009 Obrigado VictorCacciari e import java.Isis pela ajuda terminei mais um exercício terminado com sucesso.Resolvido. #include <iostream> #include <string> #include<iomanip> using namespace std; class Aluno { private: string nome; string matricula; float nota1,nota2,nota3; float peso1,peso2,peso3; public: Aluno() { } Aluno(string n,string m,float n1,float n2,float n3,float p1,float p2,float p3) { nome = n; matricula = m; nota1 = n1; nota2 = n2; nota3 = n3; peso1 = p1; peso2 = p2; peso3 = p3; } bool setNome(string n) { nome=n; return nome.length() >= 2; } string getNome() { return nome; } bool setMatricula(string m) { matricula=m; return matricula.length() == 9; } string getMatricula() { return matricula; } bool setNota1(float n1) { nota1 = n1; } float getNota1() { return nota1; } bool setNota2(float n2) { nota2 = n2; } float getNota2() { return nota2; } bool setNota3(float n3) { nota3 = n3; } float getNota3() { return nota3; } float setMediaponderada() { return (nota1*peso1+nota2*peso2+nota3*peso3)/(peso1+peso2+peso3); } string setRetornaranoingresso() { return matricula.substr(0,4); } void print() { cout << "-------------\n"; cout << "Nome do aluno: " <<nome<<endl; cout << "Matricula: " <<matricula<< endl; cout << "Media ponderada: " <<setprecision(3)<<setMediaponderada()<< endl; cout << "Ano de ingresso: " <<setRetornaranoingresso()<< endl; } }; int main() { Aluno p; string nome; string matricula; float nota1,nota2,nota3; do { cout << "Digite o nome: "; getline(cin,nome); } while (!p.setNome(nome)); do { cout << "Digite a Matricula: "; cin>>matricula; } while (!p.setMatricula(matricula));//Até do { cout << "Digite a primeira nota: "; cin>>nota1; } while (!p.setNota1(nota1)); do { cout << "Digite a segundo nota: "; cin>>nota2; } while (!p.setNota2(nota2)); do { cout << "Digite a terceira nota: "; cin>>nota3; } while (!p.setNota3(nota3)); p.print(); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 10, 2009 Com sucesso nada. Você está jogando fora todos os princípios de orientação a objetos: Os métodos setters devem validar os dados de entrada conforme as regras definidas abaixo: Quem está validando TUDO no seu código é o main. Compartilhar este post Link para o post Compartilhar em outros sites
Glaucco 1 Denunciar post Postado Abril 10, 2009 Olha não to entendendo nada o que você quer dizer import java.Isis. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 11, 2009 Leia o enunciado e depois veja o código que você fez. O método print é totalmente desnecessário. Quem está validando tudo é o main, e não os setters. bool setMatricula(string m) { matricula=m; return matricula.length() == 9; } do { cout << "Digite a Matricula: "; cin>>matricula; } while (!p.setMatricula(matricula)); Compartilhar este post Link para o post Compartilhar em outros sites