Cadastro de pessoas

58 respostas Resolvido
X

eu preciso criar uma lista que utilize a idade do usuário como chave e o
nome como informação. Onde quando eu for buscar uma pessoa pela idade seja exibido o
nome da mesma. podendo ser cadastrada apenas uma pessoa por idade.

preciso solicitar ao usuário o num de pessoas cadastradas, a idade e o nome e ao termino devo listar todas as pessoas no seguinte formato

idade->nome

exemplo: 27-> Pedro

isso foi o que fiz mas algo errado não está certo

import java.util.Scanner;

public class Pessoa {

public String nome;
public int idade;



Pessoa[] lista;



Scanner in = new Scanner(System.in);

Pessoa[]  cadastrar(Pessoa pessoa) {
	System.out.println("digite o número de pessoas para o cadastro: ");
	int numero = in.nextInt();
	 Pessoa[] lista = new Pessoa[numero];
	 
	for (int i = 0; i<lista.length; i++) {
		System.out.println("digite o nome da pessoa: ");
		pessoa.nome = in.next();
		System.out.println("digite a idade: ");
		pessoa.idade = in.nextInt();
		
		if(lista[i] == null) {
			lista[i] = pessoa;	
		}
		
		else {
			System.out.println("não foi possível cadastrar. ");
		}
		
	}
		
		return lista;
	
}

}

58 Respostas

X

quando eu vou na classe aplicação, instancio uma pessoa e uso o método ele não retorna o nome e a idade :frowning:

adriano_si

Cadê o código que você recupera o Array e tenta exibir? Como você está cadastrando as pessoas?

X

como eu faria isso? estava pensando se não era pra usar ArrayList ou algo do gênero

adriano_si

Você só está cadastrando a lista e retornando ela no método de cadastro. Em nenhum momento você tenta exibir essa lista pelo código que você nos passou…

X

e como eu faço para exibi-la?

adriano_si

Você precisa:

  • O método main pra poder começar a executar seu programa.
  • Chamar o método de cadastrar e inserir as Pessoas
  • Pegar a sua lista retornada no cadasto e iterar sobre ela usando o for (que você já aprendeu)
  • Dentro do seu for, para cada pessoa você usa o método (que também já tem no seu código) para imprimir o resultado da sua lista respeitando o formato do seu exercício. :wink:

Tenta usando isso que eu te disse e se tiver alguma dificuldade posta aí.

X
void imprimir(Pessoa pessoa) {
	 for(int i = 0; i<lista.length; i++) {
		 if(lista != null) {
		 System.out.println(lista[i].pessoa.nome + "->" + lista[i].pessoa.idade);
		 }
	 }
	
}

eu fiz esse metodo para imprimir mas ainda sim da uma exceção

X
public class Programa {

public static void main(String[] args) {
	
	Pessoa p = new Pessoa();
	
	p.cadastrar(p);
	
	
	
	p.imprimir(p);
}

}

o main

X

agradeço quem puder ajudar

Enadrov

Se você deixa:

System.out.println (lista [i].nome + "->" + lista [i].idade);

X

sim eu tirei o pessoa e coloquei desse jeito só que tbém deu a exceção na hora do imprimir :frowning:

Enadrov

Qual exceção

X

Exception in thread “main” java.lang.NullPointerException

at package.Pessoa.imprimir(Pessoa.java:46)
at package.Aplicacao.main(Aplicacao.java:13)
Enadrov

Esss exceção diz que está tentando acessar um objeto que não foi instanciado. Verifique se está carregando sua lista corretamente.

Enadrov

Você está usando duas variavel lista uma como atributo de classe e uma no metodo cadastrar. Use apenas a lista que vc declara como atributo de classe e mude se metodo para void ao invés de Pessoa []

X

acabei trocando o Pessoa[] lista = new Pessoa[numero]; no metodo de cadastro
por this.lista = new Pessoa[numero] e acabou funcionando.

X

na vdd ainda tem um erro. quando eu cadastro 2 ou mais pessoas por exemplo: ana, 22 e pedro, 20

aparece na tela 2 vezes 20->pedro

Enadrov

Mude seu metodo cadastrar para somente cadatro, sem que vc tenha que digitar os dados dentro dele. Você faria assim na sua aplicação:

Pessoa p1 = new Pessoa ();
p1.nome = "Eu";
p1.idade = 10;

Pessoa p2 = new Pessoa ();
p2.nome = "Eu";
p2.idade = 10;

Pesssoa pessoa = new Pessoa ();
pessoa.cadastrar (p1);
pessoa.cadastrar (p2);

e para imprimir:

pessoa.imprimir ();

Com o medoto imprimir sem argumento.

Tenta fazer isso que vai ficar bem legal

X

vou fazer sim, obrigado!

X

ainda continua imprimindo errado :frowning:

Enadrov

Posta se novo código de cadastro

X
void  cadastro(Pessoa pessoa) {
	System.out.println("digite o número de pessoas para o cadastro: ");
	int numero = in.nextInt();
	 this.lista = new Pessoa[numero];
	 
	for (int i = 0; i<lista.length; i++) {
		System.out.println("digite o nome da pessoa: ");
		nome = in.next();
		System.out.println("digite a idade: ");
		idade = in.nextInt();
		
		if(lista[i] == null) {
			lista[i] = pessoa;	
		}
		
		else {
			System.out.println("não foi possível cadastrar. ");
		}
		
		
	}

eu preciso que o usuário digite quantas pessoas ele quer cadastrar

Enadrov

Cara na verdade o que esta acontecendo é o seguinte, quando você chama o método:

cadastro(pessoa);

você cadastra esta pessoa duas vezes, por causa do comando:

for (int i = 0; i<lista.length; i++) {

}

Então quando você chama esse metodo pela segunda vez a sua lista ja esta cheia. Poderia passar o código aqui mas prefiro te ajudar a fazer.
Se estiver de acordo vamos usar 3 classes:
Classe Pessoa:
onde só vai ter os dados da pessoa no caso nome e idade;
Classe Cadastro:
Onde vai ter o atributo:
Pessoa lista[];
e os metodos cadastrar e imprimir
E a classe Programa
Que é a que vai executar o programa.

Enadrov
public class Pessoa {
          String nome;
          int idade;
}

public class CadastroDePessoas{
          public Pessoa lista[];
          public void cadastrar(Pessoa pessoa){
          }
          public void imprimir(){
          }
}

public class Programa {
           public static void main(String args[]){
           }
}

As classes seriam assim

X

mas eu preciso que o usuário digite o número de pessoas para o cadastro

Enadrov

E vai digitar mas na classe programa, não na cadastro

X

e como meu metodo cadastro vai saber quantas pessoas ele deve cadastrar?

Enadrov
CadastroDePessoas cp = new CadastroDePessoas ();
System.out.println ("digite quantidade");
int quant = in.nextInt ();
cp.lista = new lista [quant];
X

vou tentar desse jeito

Enadrov

Esso vai na aplicação ou seja no metodo main da classe Programa. E nessa classe tb vai digitar o nome e a idade

X

aqui não seria = new Pessoa[quant]?

Enadrov

Nao seria lista que é onde vai cadastrar as pessoas na classe CadastroDePessoas

X

como eu arrumo esse negocio de ficar cadastrando a mesma pessoa 2 vezes? o que fiz de errado no meu método?

X

mas da erro de compilação quando eu ponho lista

Enadrov

Pra concetar se código.
Crie um atributo por exemplo:
int topo = -1;

No metodo remove o for e faz o seguinte:

topo++;

lista [topo] = pessoa;
Enadrov

Vou escrever classe por classe aqui

X

e qual seria a condição para que isso aconteça? se a lista[topo] == null aí eu devo inserir a pessoa na posição topo++?

Enadrov
public class CadastroDePessoas {

Pessoa lista [];
int topo= -1;

public void cadatrar (Pessoa pessoa){
topo = topo+1;
lista [topo];
}

public void imprimir (){
for (int i = 0; i < lista.length; i++){
System.out.println ("nome: " + lista [i].nome + " -> " + lista [i].idade);
}
}
}
Enadrov

Você coloca essa condição na classe Programa

if (cp.topo < cp.lista.length){
cp.cadastro (pessoa)
}else {
System.out.println ("Lista cheia");
}
X

mas aqui da um erro de compilação. eu não teria que colocar lista[topo] = pessoa?

Enadrov

Desculpa é que estou pelo celular não percebi o erro. Faltou atribiur a pessoa a lista.
lista [topo] = pessoa;

Enadrov

Se tiver mas erros de digitacao, foi mau é que pelo celular é dificil kkkk

X

mas dentro do metodo eu ainda preciso que o usuário digite o nome e a idade da pessoa. eu adicionei isso e o problema ainda persiste.

acho que devo está fazendo algo de errado

Enadrov

Voce vai digitar na classe programa

System.out.println ("Digite nome");
String nome = in.nextLine ();
System.out.println ("idade");
int idade = in.nextInt ();
cp.cadastrar(new Pessoa (nome,idade));
Enadrov

Não lembro se usei construtor na classe. Você sabe usar construtor

X

sei sim

Enadrov

Ai é so colocar esse codigo em um for e repetir quantas vezes vc colocou na variavel que tem a quantidade de pessoas para cadastrar

X

como assim? mas na aplicação eu não tenho a variável quant

Enadrov

Você não tem uma varial onde você armazenou a quatidade de pessoas que vai cadastrar

X

eu fiz aqui mas tá dando outro erro, amanhã vejo o que faço.

muito obrigado pela boa vontade e ajuda e tenha uma boa noite.

amanhã continuarei nessa saga

Enadrov

Que isso fico feliz em ajudar. Caso queira posso postar as três classes prontas ou se quiser continuar tentando fico a disposição para ajudar

X

tentarei sim, quando puder coloco aqui

Enadrov
import java.util.Scanner;

public class Pessoa {
	public String nome;
	public int idade;

	public Pessoa(String n, int i){
		nome  = n;
		idade = i;
	}

	public String getNome(){
		return nome;
	}

	public int idade(){
		return idade;
	}

	public String toString(){
		return "Nome: " + nome + " -> " + "Idade: " + idade;
	}
}
Enadrov
public class Cadastro {
	Pessoa lista[];
	int topo = -1;

	public Cadastro(int numeroDePessoas){
		this.lista = new Pessoa[numeroDePessoas];
	}

	void  cadastrar(Pessoa pessoa) {
		topo++;
		lista[topo] = pessoa;
	}

	void imprimir() {
	 for(int i = 0; i<lista.length; i++) {
		 if(lista != null) {
		 //System.out.println(lista[i].nome + "->" + lista[i].idade);
		 System.out.println(lista[i].toString());
		 }
	 }
}
}
Enadrov
Solucao aceita
import java.util.Scanner;

public class Programa {
	public static void main(String args[]){
		Scanner in = new Scanner(System.in);

		System.out.println("digite o número de pessoas para o cadastro: ");
		int numeroDePessoas = Integer.parseInt(in.nextLine());

		Cadastro cadastro = new Cadastro(numeroDePessoas);


		for(int i = 0; i < numeroDePessoas; i++){
			System.out.println("digite o nome da pessoa: ");
			String nome = in.nextLine();
			System.out.println("digite a idade: ");
			int idade = Integer.parseInt(in.nextLine());

			cadastro.cadastrar(new Pessoa(nome, idade));

			System.out.println("");
		}

		cadastro.imprimir();
		
	}
}

Qualquer duvida estou a disposição

X

poxa obrigado!!! resolveu meu problema.

mas eu gostaria de saber, o que eu estava fazendo de errado? porque minha lista ficava repetindo os nomes e a idade da última pessoa digitada? poderia me explicar isso?

Enadrov

Você pede a quantidade de pessoas para cadastrar. Digamos que fosse 2 pessoas, você coloca esse valor no tamanho da lista

Pessoa lista[] = new Pessoa [2];

Então quando você dava o comando for:

for (int i = 0; i < lista.length; i++){

if (lista [i] == null){

lista [i] = pessoa;

}

}

O loop é realizado duas vezes para a mesma pessoa, cadastrando a primeira pessoa nas duas posições da lista. E quando for adicionar a segunda pessoa a lista esta toda preenchida e por isso aparece duas vezes a mesma pessoa.
Para resolver dentro do if você poderia fazer o seguinte.

if (lista [i] == null){
      lista [i] = pessoa;
      break;
}

Assim ele cadastra a pessoa e termina o loop, deixando a segunda posição como null, ou seja, livre para cadastrar a segunda pessoa.

X

puxa, era isso mesmo. muito obrigado pela ajuda, entendi perfeitamente.

Criado 7 de junho de 2019
Ultima resposta 14 de jun. de 2019
Respostas 58
Participantes 3