[RESOLVIDO] Pesquisa em array

33 respostas
G

Ola,

Tenho que fazer um prog que cadastre alunos e pesquise pelo seu numero de matricula

Dividi o programa em duas partes

A primeira parte compila tranquilo mas acho que o problema esta nela

primera parte:

import java.util.Scanner;
import java.util.ArrayList;
public class Aluno
{
	int matricula;
	int mat2;
	String nome;
	int data;
	String end;
	String email;
	int i;
	Aluno[] aluno = new Aluno[3];
public void Cadastro ()
	{
			Scanner input = new Scanner (System.in);
		    System.out.print ("Digite sua matricula \n\n");  //MATRICULA
			matricula = Integer.parseInt (input.nextLine ());
			System.out.println("Digite o seu nome \n\n"); // NOME
			nome = input.nextLine();
			System.out.print ("Digite a data de nascimento \n\n"); //DATA
			data = Integer.parseInt (input.nextLine ());
			System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO
			end = input.nextLine();
			System.out.println("Digite o seu email \n\n"); // EMAIL
			email = input.nextLine();
			i++;
	}
 public Aluno busca (Aluno aluno[], int mat2)
 {

			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println (aluno[i].matricula);

				}

		}
		return aluno[i];
 }
}

segunda parte

import java.util.Scanner; import java.util.ArrayList; public class Cadastro { public static void main (String args[]) { Scanner input = new Scanner (System.in); Aluno[] aluno = new Aluno[3]; //Variavel do tipo da classe do outro programa int op; int i = 0; int mat; Aluno al; do { System.out.print ("1-Criar cadastro \n2- Procurar matricula\n"); System.out.print("\n"); op = Integer.parseInt (input.nextLine ()); switch (op) { case 1: if (i >=3) { System.out.print ("Capacidade esgotada \n"); break; } else { aluno [i] = new Aluno(); // cada laço, cria um novo Aluno aluno[i].Cadastro(); // chamar procedimento do outro programa i++; break; } case 2: System.out.print("Digite a matricula \n"); mat = Integer.parseInt (input.nextLine ()); busca(aluno[i],mat); } }while (op !=0); } }

o problema ocorre nas funções de busca, pois na de cadastro, funciona normal

alguem poderia me ajudar?

33 Respostas

J

Na primeira parte vc colocou…

public Aluno busca (Aluno aluno[], int mat2)

e na segunda parte…

busca(aluno[i], mat);

O problema nao esta no argumento?? esta faltando o “2.”

cido18

Olá gustavo.rotondo,

Qual erro parece no console?

Bom analisando seu código, repare que você só altera a variavel “i”, no cadastro certo? mas quando vai fazer a busca, apenas está passando o último cadastro, por exemplo:
Você cadastra:

“João , Maria, Antonio”

Ai vc quer procurando o João( i = 0), mas está passando apenas o Antonio…

O que você deveria fazer é passar o array todo ou seja assim:

busca(aluno,mat);

Espero que tenha ficado claro e ajude.

G

Ola cido

o erro é o seguinte

cannot find symbol
symbol : method Busca(Aluno[],int)
location: class Cadastro
Busca(aluno,mat2);
^
1 error

Tool completed with exit code 1

alterei os metodos como me disse ficou assim

primeira parte

public Aluno Busca (Aluno aluno[], int mat2)
 {

			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println (aluno[i]);

				}

		}
		return aluno[i];
 }

segunda parte

case 2:
		                            System.out.print("Digite a matricula \n");
		                            mat2 = Integer.parseInt (input.nextLine ());
		                           Busca(aluno,mat2);
cido18

Desculpe achei que era a mesma classe…(sim, não reparei direito… erro primário meu), enfim você está chamando o método busca, mas não instanciou a classe aluno, como fez no cadastro:

aluno[i].Cadastro();

Se fizer a mesma coisa com o método busca irá funcionar.

Obs: Quando for fazer um array coloque o nome da variavel no plural.

G

então ficaria

case 2:
		                            System.out.print("Digite a matricula \n");
		                            mat2 = Integer.parseInt (input.nextLine ());
		                             aluno[i].Busca(aluno,mat2);

?

com isso da esse erro

java:34: Busca(Aluno,int) in Aluno cannot be applied to (Aluno[],int)
aluno[i].Busca(aluno,mat2);

J

Aqui o programa rodou depois das alterações que falamos aqui, só que ta tendo algumas Exceptions q nao entendo...Ta ai o código:

import java.util.Scanner;  
import java.util.ArrayList;  
public class Aluno  
{  
    int matricula;    
    String nome;  
    int data;  
    String end;  
    String email;  
    int i;  
    Aluno[] aluno = new Aluno[3];  
public void Cadastro ()  
    {  
            Scanner input = new Scanner (System.in);  
            System.out.print ("Digite sua matricula \n\n");  //MATRICULA  
            matricula = Integer.parseInt (input.nextLine ());  
            System.out.println("Digite o seu nome \n\n"); // NOME  
            nome = input.nextLine();  
            System.out.print ("Digite a data de nascimento \n\n"); //DATA  
            data = Integer.parseInt (input.nextLine ());  
            System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO  
            end = input.nextLine();  
            System.out.println("Digite o seu email \n\n"); // EMAIL  
            email = input.nextLine();  
            i++;  
    }  
public Aluno busca (Aluno[] aluno, int mat2)  
{  
  
            for (i = 0; i <3; i++)  
            {  
                if(mat2 == aluno[i].matricula)  
                {  
                    System.out.println (aluno[i].matricula);  
  
                }  
            }
            return aluno[i];
}  

}
import java.util.Scanner;  
import java.util.ArrayList;  
public class Aluno  
{  
    int matricula;    
    String nome;  
    int data;  
    String end;  
    String email;  
    int i;  
    Aluno[] aluno = new Aluno[3];  
public void Cadastro ()  
    {  
            Scanner input = new Scanner (System.in);  
            System.out.print ("Digite sua matricula \n\n");  //MATRICULA  
            matricula = Integer.parseInt (input.nextLine ());  
            System.out.println("Digite o seu nome \n\n"); // NOME  
            nome = input.nextLine();  
            System.out.print ("Digite a data de nascimento \n\n"); //DATA  
            data = Integer.parseInt (input.nextLine ());  
            System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO  
            end = input.nextLine();  
            System.out.println("Digite o seu email \n\n"); // EMAIL  
            email = input.nextLine();  
            i++;  
    }  
public Aluno busca (Aluno[] aluno, int mat2)  
{  
  
            for (i = 0; i <3; i++)  
            {  
                if(mat2 == aluno[i].matricula)  
                {  
                    System.out.println (aluno[i].matricula);  
  
                }  
            }
            return aluno[i];
}  

}
G

fiz umas mudanças e ficou assim

primeira parte

public void Busca (Aluno aluno[], int mat2)
 {

			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println (aluno[i].matricula);

				}


		}

 }

segunda parte

case 2:

		                             System.out.print("Digite a matricula \n");
		                             mat2 = Integer.parseInt (input.nextLine ());
		                             for (i=0; i<3;i++)
		                             {
		                             aluno[i].Busca(aluno,mat2);
								 }

ele compila sem erros, mas na hora de pesquisar, ele retorna tipo um lixo de memoria com um erro de java lang pointer null algo do tipo

J

Se na hora de cadastrar a Data de nascimento vc cololocar “/” para separar, tambem aparece outra Exception… gostaria de saber como resolver essas duas exceptions ^^

Ops…acabei de perceber q a “data” ta declarada como int…ja entendi o pq da primeira Exception ^^

G

Fiz uma gambiarra master aqui e “deu certo”

ele imprime o aluno certo que eu pesquisei mas da um erro no final da compilação de pointer null

o codigo de busca esta assim

primeira parte

public void Busca (Aluno aluno[], int mat2)
 {

			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println (aluno[i].matricula);
					System.out.println (aluno[i].nome);
					System.out.println (aluno[i].data);
					System.out.println (aluno[i].end);
					System.out.println (aluno[i].email);

				}

		}

 }

a segunda parte

case 2:

		                             System.out.print("Digite a matricula \n");
		                             mat2 = Integer.parseInt (input.nextLine ());
		                             for (i=0; i<3;i++)
		                             {
		                             aluno[i].Busca(aluno,mat2);
								 }
								 break;

só esse erro de pointer null que não consegui resolver

J

Alguem desvenda esse misterio pra gente =) O que ta causando esse Nullpointer Exception??

G

ate pensei que fosse o prog acessando o array de forma errada mas o for ao meu ver esta correto

não sei se um erro assim daria esse null

ex, vetor de tamanho 4 e acessando a posição 5 por exemplo

cido18

olá desculpe a demora( domingo é tenso), então mexi no código, acredito que vc esteja começando com Java agora... mas depois se for possivel de uma lida na apostila fj-11 da caelum, é muito boa.

vamos lá, para a classe aluno eu alterei tudo... deixe ela com apenas getters/setters:

public class Aluno {
	private int matricula;
	private String nome;
	private int data;
	private String end;
	private String email;

	public void setMatricula(int matricula) {
		this.matricula = matricula;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void setData(int data) {
		this.data = data;
	}

	public void setEnd(String end) {
		this.end = end;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public int getMatricula() {
		return matricula;
	}

	public String getNome() {
		return nome;
	}

	public int getData() {
		return data;
	}

	public String getEnd() {
		return end;
	}

	public String getEmail() {
		return email;
	}
	
}

Peguei os métodos dessa classe e joguei no cadastro( fico nomes redundantes.. mas n tve jeito):

import java.util.List;
import java.util.Scanner;
import java.util.ArrayList;

public class Cadastro {
	
	public Aluno cadastro() {
		Aluno aluno = new Aluno();
		Scanner input = new Scanner(System.in);
		System.out.print("Digite sua matricula \n"); // MATRICULA
		aluno.setMatricula(Integer.parseInt(input.nextLine()));
		System.out.println("Digite o seu nome \n"); // NOME
		aluno.setNome(input.nextLine());
		System.out.print("Digite a data de nascimento \n"); // DATA
		aluno.setData(Integer.parseInt(input.nextLine()));
		System.out.println("Digite o seu endereço \n"); // ENDEREÇO
		aluno.setEnd(input.nextLine());
		System.out.println("Digite o seu email \n"); // EMAIL
		aluno.setEnd(input.nextLine());
		return aluno;
	}
	
	public Aluno busca(List<Aluno> alunos, int mat2) {

		for (int i = 0; i < 3; i++) {
			if (mat2 == alunos.get(i).getMatricula()) {
				System.out.println(alunos.get(i).getNome());
				return alunos.get(i);
			}

		}
		return null;
	}

	
	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
		List<Aluno> alunos = new  ArrayList<Aluno>(); // Variavel do tipo da classe do outro
		Cadastro cad = new Cadastro();
		int op;
		int i = 0;
		int mat;
		do {
			System.out.print("1 - Criar cadastro \n 2 - Procurar matricula\n");
			System.out.print("\n");
			op = Integer.parseInt(input.nextLine());
			switch (op) {
			case 1:
				if (i >= 3) {
					System.out.print("Capacidade esgotada \n");
					break;
				} else {
					alunos.add(cad.cadastro());
					i++;
					break;
				}
			case 2:
				System.out.print("Digite a matricula \n");
				mat = Integer.parseInt(input.nextLine());
				cad.busca(alunos, mat);
			}
		} while (op != 0);
	}
}

O código não está 100% ainda precisa tratar alguns erros que podem acontecer na inserção mas acredito que está tudo funcionando agora, não sei se você pode utilizar as APIs, caso não possa é ó colocar como array.

Qualquer dúvida é só falar.

t+

G

é minha 3 aula em java haha

a apostila é muito boa sim

o get e set são apenas nomes pra determinadas coisas ou realmente são funções?

saberia dizer o porque do erro de pointer null?

J

Uma resposta posso te dar =)

o get e o set acredito que seja uma convenção e a tradução deles é pegar e estabelecer, respectivamente. Na apostila da Caelum fala um pouco sobre encapsulamento. Encapsulamento serve para dar mais segurança, em vez de vc ir lah e botar diretamente que o “nome” = blahblah, vc cria metodos com os “get” e “set” e eles vao ser encarregados de pegar ou alterar os valores dos atributos da sua classe…

Eh uma explicação bem ruim, pq sou noobão em java mas espero ajudar em algo =)

Agora em relação ao erro de Nullpointer eu não sei…

G

mas tipo

se a segurança não for nenhum problema

é necessario o get e set?

G

tive uma epifania e consegui finalmente

ele era um vetor de 3 posições, e pra testa por preguiça eu preenchia 2 cadastros

logo ele imprimia a posição 0 1 mas a 2 estava vazia por isso do null

J

mas em vez de colocar (i = 0; i < 3; i++) eu testei (i = 0; i < aluno.length; i++) e deu erro de Nullpointer do mesmo jeito … =/

G

ve isso

primeira parte

import java.util.Scanner;
import java.util.ArrayList;
public class Aluno
{
	int matricula;
	int mat2;
	String nome;
	String data;
	String end;
	String email;
	int i;
	Aluno[] aluno = new Aluno[3];
public void Cadastro ()
	{
			Scanner input = new Scanner (System.in);
		    System.out.print ("Digite sua matricula \n\n");  //MATRICULA
			matricula = Integer.parseInt (input.nextLine ());
			System.out.print("\n");
			System.out.println("Digite o seu nome \n\n"); // NOME
			nome = input.nextLine();
			System.out.print("\n");
			System.out.print ("Digite a data de nascimento \n\n"); //DATA
			data = input.nextLine();
			System.out.print("\n");
			System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO
			end = input.nextLine();
			System.out.print("\n");
			System.out.println("Digite o seu email \n\n"); // EMAIL
			email = input.nextLine();
			System.out.print("\n");
			for(int i = 0; i < 100; i++)  // "LIMPAR A TELA"
			{
			       System.out.println("");
}
			i++;
	}

 public void Busca (Aluno aluno[], int mat2)
 {
			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println ("Matricula " +aluno[i].matricula);
					System.out.println ("Nome " +aluno[i].nome);
					System.out.println ("Data de nascimento " +aluno[i].data);
					System.out.println ("Endereço " +aluno[i].end);
					System.out.println ("Email " +aluno[i].email);
					break;
				}
				else {
					System.out.println("Aluno nao cadastrado \n");
				}
		}
 }
}
segunda parte
import java.util.Scanner;
import java.util.ArrayList;
public class Cadastro
{
	public static void main (String args[])
	{
			Scanner input = new Scanner (System.in);
			Aluno[] aluno = new Aluno[3]; //Variavel do tipo da classe do outro programa
			int op;
			int i = 0;
			int mat2;
			Aluno al;
			do
			{
			   System.out.print ("1-Criar cadastro\n2-Procurar matricula\n3-Listar\n0-Sair");
			   System.out.print("\n\n");
			   op = Integer.parseInt (input.nextLine ());
			   System.out.print("\n");

			   switch (op)
			               {
				             case 1: 	if (i >=3) // CADASTRO
				                                  {
													     System.out.print ("Capacidade esgotada \n");
													     break;
				                                  }
				                        else {
													     aluno [i] = new Aluno(); // cada laço, cria um novo Aluno
													     aluno[i].Cadastro();  // chamar procedimento do outro programa
				                                         i++;
				                                         break;
									         }
		                    case 2: // BUSCA
		                             System.out.print("Digite a matricula \n");
		                             mat2 = Integer.parseInt (input.nextLine ());
		                            for (i=0; i<3;i++)
		                             {
		                             aluno[i].Busca(aluno,mat2);
								 }
								 break;
						 case 3: // LISTAGEM
						 			for (i = 0; i < 3;i++)
											{
													System.out.println (aluno[i].matricula);
													System.out.println (aluno[i].nome);
													System.out.println (aluno[i].data);
													System.out.println (aluno[i].end);
													System.out.println (aluno[i].email);
													System.out.print("\n\n");
											}
											break;
		                      }
		    }while (op !=0);
	}
}

queria arrumar a busca, tipo com 3 posições ele imprime 3 vezes o resultado. como eu faço para imprimir uma vez so?

pois o exercicio são 50, se imprimir 50 vez fica muito ruim

R

Desculpe, cheguei agora ‘-’

Voce quer imprimir somente uma vez caso o usuario selecione buscar por matricula ? Nao entendi bem o que voce quer.

J

se tirar aquele FOR do case 2 nao resolve?

G

isso, imprimir somente uma vez

quando eu imprimo ele imprimi o aluno o mesmo numero de vezes que é o tamanho do vetor

e tirei di case 2, ele da erro na hora da busca

R

Tirou so o FOR do case 2 ? e manteve a busca ? Qual erro gerado ?

R

retire o for e deixe assim: aluno[0].Busca(aluno, mat2);

Faça um teste e nos avise, flw.

G

case 2: // BUSCA System.out.print("Digite a matricula \n"); mat2 = Integer.parseInt (input.nextLine ()); // for (i=0; i<3;i++) // { aluno[0].Busca(aluno, mat2); // }

deu erro quando digitei a matricula da busca

java.lang.arrayIndex

R

Cara, acabei de pegar aqui o seu codigo, tirei o FOR, e fiz como eu mesmo tinha falado, e funcionou de primeira, sem eu precisar fazer mais nada.

Seu codigo atual esta diferente do que voce postou aqui ?

G

Só modifiquei a estetica do programa. A logica continua a mesma

a parte da busca

case 2: // BUSCA System.out.print("Digite a matricula \n"); mat2 = Integer.parseInt (input.nextLine ()); for (i=0; i<3;i++) { aluno[i].Busca(aluno, mat2); } break;

a parte do metodo

public void Busca (Aluno aluno[], int mat2)
 {
			for (i = 0; i <3; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println ("Matricula " +aluno[i].matricula);
					System.out.println ("Nome " +aluno[i].nome);
					System.out.println ("Data de nascimento " +aluno[i].data);
					System.out.println ("Endereço " +aluno[i].end);
					System.out.println ("Email " +aluno[i].email);
					break;
				}
				else {
					System.out.println("Aluno nao cadastrado \n");
				}
		}
 }
R

Entao, aqui funcionou de boa, me passa os passos que voce realizou pra eu fazer igual e ver se é alguma coisa que nao percebi.

G

agora foi

mas não entendi o porque

ele manda o aluno da posição 0 e procura só na 0?

não entendi a logica

R

No caso, o aluno[0] é um aluno especifico, so QUE, ele é um aluno, e voce esta usando o mesmo para fazer a busca, so o esta utilizando-o para chamar o metodo busca, pelo fato de o metodo nao ser estatico, voce precisa instanciar a classe e chamar o Metodo.

Experimente por o metodo Busca como static e no for (i = 0 use for (int i = 0, iniciando a variavel i dentro do for mesmo, e no case 2 voce passa a chamar assim: Aluno.Busca(aluno, mat2); lembrando que nomes de metodos e bom comecar com letra minuscula.

G

agora entendi

uma ultima duvida

o meu trab teria que ser feito com um array de 50 posições e estou testando com 3

na hora do teste se eu digito 2 alunos, ele lista os 2 e mais um null. então se ele é com 50, para funcionar 100% eu terias que digitar 50 alunos. teria como não sair esse “null” caso o numero de alunos não fosse igual ao tamanho do array?

pensei em true e false mas não sei se é possivel

G

consegui

fiz um if (aluno[i] != null)

gostaria de agradecer a todos que me auxiliaram. Sempre programei em C e vi que não é muito diferente a linguagem. Achei ate mais facil

R

:smiley:

cido18

Opa, acho que achei atrasado para responder as coisas XD, bom já que você não tem mais dúvidas não esqueça de colocar [resolvido] no tópico blz??

qualquer coisa é só postar ai.

Criado 16 de fevereiro de 2013
Ultima resposta 18 de fev. de 2013
Respostas 33
Participantes 4