Cadastro de Alunos com disciplinas, vetores, problema com argumentos

15 respostas
D

Prazer a todos. Fiz todo o processo, montei os getters e setters, porém não consigo adiconar informações por causa do método adicionarAluno, dizendo não ser compatíveis os argumentos de passagem, porém está tudo certo e não encontro o errol.

<package pck;

import java.util.Scanner;

import pck.Aluno;
import pck.Disciplina;

public class main {

public static void main(String[] args) {
	//Aluno a1 = new Aluno("Ricardo", 31, 1);
	//Aluno a1 = null;
	//Aluno a2 = new Aluno("Ana Elisa", 17, 1);
	//Aluno a3 = new Aluno("Geovana", 18, 2);
	//Aluno a4 = new Aluno("Livia", 20, 2);
	Scanner sc = new Scanner(System.in);
	
	Disciplina disciplina = new Disciplina();	

	
System.out.println("Enter com a quantidade de alunos: ");
int a = sc.nextInt(); 	
Aluno[] aluno = new Aluno[a];
	
	for (a = 0;a < aluno.length;a++) {		
	    
		System.out.println("Entre com o nome, a idade e a disciplina: ");
		String nome = sc.nextLine();
		int idade = sc.nextInt();
		int turma = sc.nextInt();
		String nomeDisciplina = sc.nextLine();
		
		disciplina.adicionarAluno(nome,idade,turma,nomeDisciplina);		
	}		
	//disciplina.adicionarAluno(a2);
	//disciplina.adicionarAluno(a3);
	//disciplina.adicionarAluno(a4);
		
System.out.println("Quantidade de alunos: " + disciplina.getNumAlunos());
disciplina.exibirInformacoes();
	
System.out.println("Antes de remover alunos. ");
	//removendo aluno
	//disciplina.removerAluno(a2);		
	
System.out.println("Despois de remover alunos. ");
disciplina.exibirInformacoes();
	
System.out.println("Quantidade de alunos: " + disciplina.getNumAlunos() + "\n");
	
	System.exit(0);
}
}>

<

Classe Aluno com os construtores, getters e setters.

package pck;

import pck.Disciplina;
public class Aluno {

private String nome, nomeDisciplina;

private int idade, turma;

int i = 0;
public Aluno(String nome, int idade, int turma, String nomeDisciplina) { 
	 this.nome = nome;
     this.idade = idade; 
     this.turma = turma; 
     this.nomeDisciplina = nomeDisciplina;
     }
  
public void setnomeDisciplina(String nomeDisciplina) {
	this.nomeDisciplina =  nomeDisciplina;
}

public String getnomeDisciplina() {
	return this.nomeDisciplina;
}

public void setNome(String nome) {// atribui um valor para o atributo nome.
	this.nome = nome;
}

public String getNome() {
	return this.nome;
}

public void setIdade(int idade) {
	this.idade = idade;
}

public int getIdade() {
	return this.idade;
}

public void setTurma(int turma) {
	this.turma = turma;
}

public int getTurma() {
	return this.turma;
}

public String mostrarInformacoes() {
	return "Nome: " + getNome() + "\nIdade: " + getIdade() + "\nTurma: " + getTurma() + "\n" + "##############";
}

}

Classe Disciplina com os métodos para exclusão e inclusão:
package pck;

public class Disciplina {

private Aluno[] alunos = new Aluno[40];	

private Disciplina[] disciplina = new Disciplina[10];

private int posicao;
public Disciplina() {
	this.alunos = new Aluno[40];//construtor, quando cria a disciplina, cria automaticamente um vetor Aluno de 40 posições.
}

public int getNumAlunos() {
	int cont = 0;
	for (int i = 0; i < alunos.length; i++) {
		if(alunos[i] != null) {//se a posição é diferente de null não conta.
			cont++;
		}
	}
	return cont;//retorna o número de alunos.
}

public boolean adicionarAluno(Aluno alunos) {		
		if(alunos != null) {
			this.alunos[posicao] = alunos;
			posicao = posicao + 1;
				return true;
			} else {
				return false;//aluno não foi adicionado.
		}
}

public boolean removerAluno(Aluno aluno) {//verifica sem existe nome, idade, e turma, as três tem de ser verificadas, pois podem haver repetições.
	for(int i = 0; i < alunos.length; i++) {//para remover o aluno do vetor. Excluindo pelo nome, idade e turma.
		if((alunos[i].getNome() == aluno.getNome()) &&
		   		(alunos[i].getIdade() == aluno.getIdade()) && 
		   			(alunos[i].getTurma() == aluno.getTurma())) {
						alunos[i] = null;//remove um aluno
							return true;				
								} //aqui não podemos, após esta chave, por causa da posição do vetor, por exemplo, aluno na posição 3.
		//por causa da iteração, o for não estará na posição 0. Pode estar em outra posição. Ele pode não estar na posição 0 e retorna false,
		//queremos que percorra todo o vetor e não encontrar a condição do if acima.
	}
	return false;//caso não encontre na primeira posição, pode estar em outra posição de 0 a 4. Tem de percorrer todo o vetor e não cair dentro do if.
	//por isso não tem o else e o return está fora da condição. False é porque não está no vetor.
}	

//exibir as informações de todos os alunos.
public void exibirInformacoes() {
	for (int i = 0; i < alunos.length;i++) {
		if (alunos[i] != null)//if para evitar exceção se a posição for null pela informação removida, pois a posição não tem mais dados, está vazia.
		System.out.println(alunos[i].mostrarInformacoes());//chama o método já pronto mostrarInformações que está na classe Aluno. Mostra somente posições com valores.
		
	}
}

}>
O método está montado de acordo com os construtores, não sei qual o erro.

15 Respostas

J

Você está passando 3 parâmetros e tentando receber 4, está faltando o nome da disciplina.

adicionarAluno espera receber um Aluno como parâmetro, mas você está passando nome, idade, turna e nomeDisciplina.

E parece que existem outros erros.

D
Obrigado pelo retorno.

Meu construtor:

public Aluno(String nome, int idade, int turma, String nomeDisciplina) {

this.nome = nome; //parametro 1;

this.idade = idade;  //parametro 2;

this.turma = turma; parametro 3;

this.nomeDisciplina = nomeDisciplina; parametros 4;

}

Método para adicionar: Não estão corretos, mesmos parâmetros?
disciplina.adicionarAluno(nome,idade,turma,nomeDisciplina);

O método:

public boolean adicionarAluno(Aluno alunos) {		

if(alunos != null) {

this.alunos[posicao] = alunos;

posicao = posicao + 1;

return true;

} else {

return false;//aluno não foi adicionado.

}

}

Já alterei o método removerAluno onde faltava o nome da Disciplina. É algo com o parâmetro nomeDisciplina, não identifiquei o erro ainda.

D

Ainda não sei identificar muito bem esses tipos de erros. Pois a lógica parece correta. O Problema está na passagem dos parâmetros e ele diz não ser compatível com o método e no construtor está igual, por isso não entendo.

staroski

O método adicionarAluno espera receber um objeto do tipo Aluno mas você está passando o nome, idade, turma e nomeDisciplina.

Você precisa criar um objeto do tipo Aluno para passar como parâmetro ao método adicionarAluno.

D

Agora entendi, falta instânciar um objeto para receber as informações como nome por exemplo. Por isso o erro. Eu pensei que era os atributos que deveriam ser passados, não um objeto. Valeu.

D

Fiz o pedido, mas não funcionou.
Coloquei dentro do comando for:
Aluno aluno = new Aluno();// o construtor está na classe Aluno, como pode estar indefinido? Pedindo construtor vazio porque?
E aqui:
int idade = sc.nextInt();//erro na entrada de dados. mismach.
]Obrigado pela ajuda.

staroski

Você está tentando chamar um construtor sem parâmetros, esse construtor não existe na classe Aluno.
O construtor que você declarou espera receber 4 parâmetros.

D

Vou verificar os parâmetros, obrigado.

public Aluno(String nome, String nomeDisciplina, int idade, int turma) {		
		this.nome = nome;
		this.NomeDisciplina = nomeDisciplina;
		this.idade = idade;
		this.turma = turma;		
	}

E mudei a posição da chamada da criação do objeto aluno.

for (a = 0;a < alunos.length;a++) {	
			System.out.println("Entre com o nome, a idade e a disciplina: ");
			String nome = sc.next();
			String NomeDisciplina = sc.next();
			int idade = sc.nextInt();//erro na entrada de dados. mismach.
			int turma = sc.nextInt();
			
			Aluno aluno = new Aluno();
			//disciplina.adicionarAluno(nome,idade,turma, nomeDisciplina);			
			disciplina.adicionarAluno(aluno);
			sc.nextLine();
		}

Eliminei o erro, porém aparece erro mismatch nessa linha: int idade = sc.nextInt();, algo com o tamanho do vetor. Ainda não descobri, o vetor está declarado na classe Disciplina. E limpo o buffer do teclado. Também criei um construtor Aluno sem parâmetros, para dar acesso aos métodos.
Obrigado.

D
Estava procurando exemplos aqui e derrepente encontrei um exemplo da criação de um objeto.

Cliente cliente1 = new Cliente();

cliente1.setNome = Fulano;

Apesar de ter criado e instanciado o objeto, eu não consigo acesso aos sets, comente as propriedades gets, ou seja,  algo errado no meu código e ainda não entendi como fazer algumas coisas, pois os getters e setters foram feitos.
staroski

Essa linha está errada, sua classe não possui um construtor sem parâmetros, você precisa passar os parâmetros ao chamar o construtor.

Quando você criar um Scanner que leia o System.in, utilize somente o método nextLine()

Quando você criar um Scanner que leia o System.in, utilize somente o método nextLine()

D

Preciso rever sobre os construtores, creio ser onde estou errando, apesar de ter entendido o conceito.

staroski

Construtor é o código executado para criar um objeto da sua classe, é o que você chama com a instrução new.

O construtor da classe Aluno é assim:

public Aluno(String nome, String nomeDisciplina, int idade, int turma)

Percebe que ele espera receber 4 parâmetros?
1 String com o nome do aluno
1 String com o nome da disciplina
1 int com a idade do aluno
1 int com a turma do aluno

Então você não pode criar um objeto do tipo Aluno fazendo simplesmente

new Aluno()

Cadê os parâmetros que o construtor precisa?
Não tem nada entre os parênteses.
Você precisa passar os parâmetros, por exemplo:

new Aluno("Huguinho", "Matemática", 10, 1);
D

Obrigado. Você está ajudando muito. Eu fiz isso. É a Classe Aluno, onde fiz os construtor, só não entendo o erro na entrada do dado nos inteiros, nextInt, porem se coloco `

aluno.setIdade(idade);
int idade = 0, turma = 0;
aluno.setTurma(turma);`
Funciona, porém a contagem de alunos, a idade e turma saem 0. É algum erro na leitura no vetor, e não  para ser nextLine, teria de converter ou alterar o construtor para as duas variáveis de Int para String. Obrigado. Vou rever tudo e como melhor inserir os dados em apostilas que tenho.
staroski

Como eu disse anteriormente, ao usar o Scanner para ler o TECLADO, utilize somente o método nextLine().
Se precisar ler um int, é só converter o valor lido.

Exemplo:

int idade = Integer.parseInt(sc.nextLine());
D

Vou fazer e digo se funcionou. Valeu.

Criado 1 de abril de 2022
Ultima resposta 15 de abr. de 2022
Respostas 15
Participantes 3