Cadastro de Alunos com disciplinas, vetores, problema com argumentos

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.

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.

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.

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.

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.

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.

1 curtida

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.

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.

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.

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, há algo errado no meu código e ainda não entendi como fazer algumas coisas, pois os getters e setters foram feitos.

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()

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

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);

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 dá 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.

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());

Vou fazer e digo se funcionou. Valeu.