Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

joaoflima_90

Mini-Projecto : Candidatura - Erro ao usar costructor

Mensagens Recomendadas

joaoflima_90

Boa tarde a todos.

Tenho que fazer um mini-projecto para a cadeira de Arquitectura de software , que será submetido através do mooshak , pelo que devo fazer tudo no mesmo ficheiro.

O projecto é baseado num sistema muito simples de candidatura (ao ensino superior) no qual devemos receber do input o numero de alunos que se vão candidatar e uma flag(o output será diferente conforme a flag) , seguida de 5 linhas (bi , nome do aluno , faculdade , codigo faculdade e nota de candidatura) para os alunos que se vão candidatar.

Já criei a class Aluno , Faculdade e Candidatura(main).

Na class Candidatura fiz o método addAluno() mas ao tentar usar o constructor da class Alunos dá erro e não consigo descobrir o que possa ser. Espero que me consigam ajudar ;)

Aqui está o meu código (se acharem que devo trocar alguma coisa mesmo que nao tenha a ver com a minha duvida digam , sou principiante em java , boas sugestoes sao bem-vindas):

import java.util.*;
import java.io.*;

class Aluno{
int biAluno;
String nomeAluno;
String nomeUniversidade;
int idUniversidade;	
float nota;	

Aluno(int a , String b , String c , int d , float e){
	this.biAluno = a;
	this.nomeAluno = b;
	this.nomeUniversidade = c;
	this.idUniversidade = d;
	this.nota = e;
	}	

int getBI(){
	return biAluno;
}	

String getNome(){
	return nomeAluno;
}

String getUniversidade(){
	return nomeUniversidade;
}

int getID(){
	return idUniversidade;
}

float getNota(){
	return nota;
}

}


class Universidade{
int id;
String nomeUniversidade;

Universidade(int a , String b){
	this.id = a;
	this.nomeUniversidade = b;
}

String getUniversidade(){
	return nomeUniversidade;
}

int getID(){
	return id;
}



}


public class Candidatura{

private int totalAlunos = 0;

public static void main(String args[]){

	Scanner stdin= new Scanner(System.in);

	int cont;
	String limpaLinha;

	int nAlunos = stdin.nextInt();
	limpaLinha = stdin.nextLine();
	int flag = stdin.nextInt();
	limpaLinha = stdin.nextLine();

	Aluno[] alunos = new Aluno[nAlunos];
	Universidade[] universidades = new Universidade[nAlunos];

	for (int i = 0 ; i < nAlunos ; i++){
		int bi = stdin.nextInt();
		stdin.nextLine();
		String aluno = stdin.nextLine();
		aluno = stdin.nextLine();
		String univ = stdin.nextLine();
		univ = stdin.nextLine();
		int codUniv = stdin.nextInt();
		stdin.nextLine();
		float grade = stdin.nextFloat();
		stdin.nextLine();
	}
}


   public void addAluno(int bi , String nome , String universidade , String idUniversidade , float nota , Aluno[] alunos){
   	alunos[totalAlunos] = new Aluno(bi,nome,universidade,idUniversidade,nota);
   	   totalAlunos ++;
   }

O erro que me dá é este :

C:\Users\Joao\JavaFiles\Candidatura.java:107: cannot find symbol

symbol : constructor Aluno(int,java.lang.String,java.lang.String,java.lang.String,float)

location: class Aluno

alunos[totalAlunos] = new Aluno(bi,nome,universidade,idUniversidade,nota);

^

1 error

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

No teu construtor da classe Aluno tens esta assinatura:

Aluno(int a , String b , String c , int d , float e)

E estás a chamar com

new Aluno(bi,nome,universidade,idUniversidade,nota)

em que idUniversidade é do tipo String, ao contrário do que seria esperado (tipo int).


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaoflima_90

No teu construtor da classe Aluno tens esta assinatura:

Aluno(int a , String b , String c , int d , float e)

E estás a chamar com

new Aluno(bi,nome,universidade,idUniversidade,nota)

em que idUniversidade é do tipo String, ao contrário do que seria esperado (tipo int).

Obrigado , errei mesmo por distração. :wallbash:

Agora , ao chamar o addAluno(bi , ........); dá-me este erro:

C:\Users\Joao\JavaFiles\Candidatura.java:100: non-static method addAluno(int,java.lang.String,java.lang.String,int,float,Aluno[]) cannot be referenced from a static context

            addAluno(bi, aluno, univ, codUniv, grade, alunos);

            ^

1 error

Nao faço a minima ideia da razao desse erro , alguem sabe porque me está a dar este erro ?

Já tentei por private Aluno[] alunos; na class Candidatura mas fora do main e assim nao passava o array para o addAluno(); mais isso depois dá-va erro ao alocar memoria dentro do main (alunos[] = new Aluno(nAlunos):)

O código é o mesmo , apenas com

addAluno(bi, aluno, univ, codUniv, grade, alunos);

depois de ler todos os valores do input.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

Uma vez que a classe Candidatura é a que vai correr, ela vai executar o método main da classe, sem a instanciar, por isso, o java não consegue aceder ao método addAluno. Solução: passar esse método para estático, a assinatura deverá ser algo como:

public static void addAluno(int  bi , String nome , String universidade , String idUniversidade , float nota , Aluno[] alunos){


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaoflima_90

Uma vez que a classe Candidatura é a que vai correr, ela vai executar o método main da classe, sem a instanciar, por isso, o java não consegue aceder ao método addAluno. Solução: passar esse método para estático, a assinatura deverá ser algo como:

public static void addAluno(int  bi , String nome , String universidade , String idUniversidade , float nota , Aluno[] alunos){

salvaste-me o dia , orbigado.

Abraço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

(...) Solução: passar esse método para estático (...)

Errado, instanciar a classe e aceder ao método de instância. Passar os métodos para estáticos, apenas porque o método main não consegue aceder não é solução. Claro que passa a funcionar, mas não é a solução correcta.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

Nunca tinha pensado nessa possibilidade, de instanciar a classe. E vendo bem, até seria melhor, porque penso que aquele atributo totalAlunos deixa de poder ser utilizado em contexto estático.

Já agora fica uma dúvida de boas práticas de programação: se a classe é para ser executada como uma aplicação (tem o método static main), é correcto criar mais funções nessa classe, ou é preferível criar outra classe (por exemplo, uma classe B com métodos estáticos para efectuar as diversas operações)?


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaoflima_90

Errado, instanciar a classe e aceder ao método de instância. Passar os métodos para estáticos, apenas porque o método main não consegue aceder não é solução. Claro que passa a funcionar, mas não é a solução correcta.

Para já vou deixar como static , nao tenho muito tempo. Quero por a funcionar , depois , se tiver tempo ponho isso como tu dizes. Obrigado pela sugestao :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaoflima_90

Tenho o addAluno() a trabalhar na perfeição , fiz o addUniversidade() da mesma maneira (acrescentei algum codigo para verificar se a universidade já está no array para nao guardar universidades repetidas) e dá-me erro (ArrayIndexOutOfBoundsException) , nao percebo porque.

O indice do array universidades[] onde vou guardar os dados da faculdade está declarado na class Candidatura fora do main (private static int totalUniversidades = 0;) e incremento essa variavel sempre que adiciono uma nova faculdade. Só da erro quando adiciono mais que uma universidade. Mais uma vez agradecia que alguem me ajudasse.

O codigo da class Candidatura é este :

public class Candidatura{


private static int totalAlunos = 0;
private static int totalUniversidades = 0;

public static void main(String args[]){

	Scanner stdin= new Scanner(System.in);



	int cont;
	String limpaLinha;

	int nAlunos = stdin.nextInt();
	limpaLinha = stdin.nextLine();
	int flag = stdin.nextInt();
	limpaLinha = stdin.nextLine();

	Aluno[] alunos = new Aluno[nAlunos];
	Universidade[] universidades = new Universidade[nAlunos];

	for (int i = 0 ; i < nAlunos ; i++){
		int bi = stdin.nextInt();
		stdin.nextLine();
		String aluno = stdin.nextLine();
		aluno = stdin.nextLine();
		String univ = stdin.nextLine();
		univ = stdin.nextLine();
		int codUniv = stdin.nextInt();
		stdin.nextLine();
		float grade = stdin.nextFloat();
		stdin.nextLine();
		addAluno(bi,aluno,univ,codUniv,grade,alunos);
		addUniversidade(codUniv, univ, universidades);

	}


	if (flag == 0){
		System.out.println(flag0(universidades));
	}


}



   	public static void addAluno(int bi , String nome , String universidade , int idUniversidade , float nota , Aluno[] alunos){
    	alunos[totalAlunos] = new Aluno(bi,nome,universidade,idUniversidade,nota);
       	totalAlunos ++;
    }

public static void addUniversidade(int id, String nome ,  Universidade[] universidades){
    	for(int j = 0;j < universidades.length; j++){
		if(universidades[j] == null ||(universidades[j].getUniversidade() != nome && universidades[j].getID() != id)){
			universidades[totalUniversidades] = new Universidade(id , nome);
			totalUniversidades++;
		}

	}
    }

public static int flag0(Universidade[] universidades){
	return universidades.length;
}

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

universidades[j].getUniversidade() != nome

A comparação de Strings faz-se com o método equals e não com o operador !=.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaoflima_90

universidades[j].getUniversidade() != nome

A comparação de Strings faz-se com o método equals e não com o operador !=.

Que estupidez  :wallbash: tive teste ha pouco tempo e tinha um exercicio no qual se comparavam duas strings , nunca mais me lembrava disso -.-' Obrigado mais uma vez

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.