Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
joaoflima_90

Mini-Projecto : Candidatura - Erro ao usar costructor

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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;
}

}

Share this post


Link to post
Share on other sites
Baderous

universidades[j].getUniversidade() != nome

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.