Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Glaucco

[Resolvido] Classe-constutor c++

Recommended Posts

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

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

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

é 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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.