Ir ao conteúdo
  • Cadastre-se

Ajuda com exercício.


djebs

Posts recomendados

Pessoal , estou fazendo faculdade e comecei a fazer java esses dias. Estou com um problema em um exercício que é pra cadastrar pessoas em uma faculdade. Quando tento mostrar todos os objetos que cadastrei, só aparece o último que foi cadastrado. Segue o código aqui em baixo. O código ta incompleto, e por enquanto só estou cadastrando a classe professores e somente mostrando a mesma. Agradeço muito a ajuda.

 

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner (System.in);Professores pf = new Professores();Funcionarios fun = new Funcionarios ();Alunos al = new Alunos ();while(true) {System.out.println("########################################################");System.out.println("Menu principal");System.out.println("A - Cadastrar professor");System.out.println("B - Cadastrar funcionario");System.out.println("C - Cadastrar aluno");System.out.println("D - Listar tudo");System.out.println("E - Sair");String opcao = sc.nextLine();if (opcao == null) {break;} else if (opcao.equalsIgnoreCase("A")) {cadastrarProfessor(sc, pf );} else if (opcao.equalsIgnoreCase("B")) {cadastrarFuncionario(sc, fun);} else if (opcao.equalsIgnoreCase("C")) {cadastrarAluno(sc, al);} else if (opcao.equalsIgnoreCase("D")) {listarTudo(pf);} else if (opcao.equalsIgnoreCase("E")) {break;} else {System.out.println("Comando desconhecido: " + opcao);}}sc.close();System.out.println("Sistema encerrado");}public static void cadastrarProfessor(Scanner sc , Professores pf){ System.out.println("Digite o nome da pessoa");pf.setNome(sc.nextLine());System.out.println("Digite o rg da pessoa");pf.setRg(sc.nextLine());}         public static void cadastrarFuncionario (Scanner sc, Funcionarios fun){        System.out.println("Digite o nome do funcionario");    String nome = sc.nextLine();    System.out.println("Digite o rg do funcionario");    String rg = sc.nextLine();    System.out.println("Digite o cpf do funcionario");    int cpf = sc.nextInt();       }        public static void cadastrarAluno (Scanner sc, Alunos al){System.out.println("Digite o nome do funcionario");String nome = sc.nextLine();System.out.println("Digite o rg do funcionario");String rg = sc.nextLine();System.out.println("Digite o cpf do funcionario");int cpf = sc.nextInt();}      public static void listarTudo (Professores pf){    // Mostrar professores  System.out.println("Professores Cadastrados");  System.out.println("Nome:" + pf.getNome() );  System.out.println("Rg:" + pf.getRg());          }}
Link para o comentário
Compartilhar em outros sites

O seu problema é que você está usando apenas um instancia da classe "Professores", sendo que para cada novo professor você precisa de uma nova instancia.

 

Algo nesse sentido:

import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {	static class Professor {		String nome;		String rg;		public String getNome() {			return nome;		}		public void setNome(String nome) {			this.nome = nome;		}		public String getRg() {			return rg;		}		public void setRg(String rg) {			this.rg = rg;		}	}	public static void main(String[] args) {		Scanner sc = new Scanner(System.in);				List<Professor> professores = new ArrayList<Professor>();				while (true) {			System.out.println("########################################################");			System.out.println("Menu principal");			System.out.println("A - Cadastrar professor");			System.out.println("B - Cadastrar funcionario");			System.out.println("C - Cadastrar aluno");			System.out.println("D - Listar tudo");			System.out.println("E - Sair");			String opcao = sc.nextLine();			if (opcao == null) {				break;			} else if (opcao.equalsIgnoreCase("A")) {				professores.add(cadastrarProfessor(sc));			} else if (opcao.equalsIgnoreCase("B")) {			} else if (opcao.equalsIgnoreCase("C")) {			} else if (opcao.equalsIgnoreCase("D")) {				listarTudo(professores);			} else if (opcao.equalsIgnoreCase("E")) {				break;			} else {				System.out.println("Comando desconhecido: " + opcao);			}		}		sc.close();		System.out.println("Sistema encerrado");	}	public static Professor cadastrarProfessor(Scanner sc) {		Professor pf = new Professor();		System.out.println("Digite o nome da pessoa");		pf.setNome(sc.nextLine());		System.out.println("Digite o rg da pessoa");		pf.setRg(sc.nextLine());		return pf;	}	public static void listarTudo(List<Professor> professores) {		// Mostrar professores		System.out.println("Professores Cadastrados");		for (Professor pf : professores) {			System.out.println("Nome:" + pf.getNome());			System.out.println("Rg:" + pf.getRg());		}	}}

OBS: Quando for postar um código utilize a formatação apropriada.

Link para o comentário
Compartilhar em outros sites

Acredito que sim, como você não postou o conteúdo da classe "Professores" eu criei a classe "Professor" para poder montar um exemplo para você.

 

Lembre-se que você vai precisar criar uma nova instancia da classe "Professores" para cada novo professor cadastrado e adicionar-la em uma lista, para que você possa efetuar a listagem mais tarde.

Link para o comentário
Compartilhar em outros sites

Surgiu uma nova dúvida. Por que quando tento cadastrar mais atributos, ele pula para o menu? Só da certo se eu deixar pra cadastrar o nome e o rg, pois se coloco o cpf e o endereço, sempre o ultimo pula direto para o menu, e não cadastra.

 

Se você não postar o código fica difícil de ajudar.

Link para o comentário
Compartilhar em outros sites


public static Professores cadastrarProfessor(Scanner sc){

Professores pf = new Professores();

System.out.println("Digite o nome da pessoa");

pf.setNome(sc.nextLine());

System.out.println("Digite o rg da pessoa");

pf.setRg(sc.nextLine());

System.out.println("Digite o endereço da pessoa");

pf.setEndereco(sc.nextLine());

System.out.println("Digite o cpf da pessoa:");

pf.setCpf(sc.nextInt());//porque não cadastra int? Ele não executa aqui//

return pf;

}

Link para o comentário
Compartilhar em outros sites

Você está tentando ler um número muito grande como int, e provavelmente está dando esse erro:

Exception in thread "main" java.util.InputMismatchException: For input string: "00000000000"	at java.util.Scanner.nextInt(Scanner.java:2166)	at java.util.Scanner.nextInt(Scanner.java:2119)	at ScannerTest.main(ScannerTest.java:9)

Você deve ler ele como long ou String:

long cpf = scanner.nextLong();
Link para o comentário
Compartilhar em outros sites

 

Você está tentando ler um número muito grande como int, e provavelmente está dando esse erro:

Exception in thread "main" java.util.InputMismatchException: For input string: "00000000000"	at java.util.Scanner.nextInt(Scanner.java:2166)	at java.util.Scanner.nextInt(Scanner.java:2119)	at ScannerTest.main(ScannerTest.java:9)

Você deve ler ele como long ou String:

long cpf = scanner.nextLong();

O problema é que não aparece erro nenhum. Ele simplesmente aparece: "comando desconhecido" que é algo que eu programei pra quando o usuário digitar alguma coisa nada a ver no menu.

Mudei pra long e não mudou em nada, Vou postar o código inteiro pra você ter uma ideia.

import java.util.Scanner;import java.util.ArrayList;import java.util.List;public class Main {             public static void main(String[] args) {		Scanner sc = new Scanner (System.in);		List<Professores> Professores = new ArrayList<Professores>();		List<Funcionarios> funcionar = new ArrayList<Funcionarios>();		List<Alunos> alu = new ArrayList<Alunos>();		while(true) {			System.out.println("########################################################");			System.out.println("Menu principal");			System.out.println("A - Cadastrar professor");			System.out.println("B - Cadastrar funcionario");			System.out.println("C - Cadastrar aluno");			System.out.println("D - Listar tudo");			System.out.println("E - Sair");			String opcao = sc.nextLine();			if (opcao == null) {				break;			} else if (opcao.equalsIgnoreCase("A")) {				Professores.add(cadastrarProfessor(sc));				} else if (opcao.equalsIgnoreCase("B")){				funcionar.add(cadastrarFuncionario(sc));			}  else if (opcao.equalsIgnoreCase("C")){				alu.add(cadastrarAluno(sc));			}else if (opcao.equalsIgnoreCase("D")) {				listarTudo(Professores,funcionar,alu);			} else if (opcao.equalsIgnoreCase("E")) {				break;			} else {				System.out.println("Comando desconhecido: " + opcao);			}		}		sc.close();		System.out.println("Sistema encerrado");	}						public static Professores cadastrarProfessor(Scanner sc){ 		Professores pf = new Professores();		System.out.println("Digite o nome da pessoa");		pf.setNome(sc.nextLine());		System.out.println("Digite o rg da pessoa");		pf.setRg(sc.nextLine());		System.out.println("Digite o endereço da pessoa");		pf.setEndereco(sc.nextLine());		System.out.println("Digite o cpf da pessoa:");		pf.setCpf(sc.nextLong());//porque não cadastra int?//		return pf;			} 			public static Funcionarios cadastrarFuncionario(Scanner sc){			Funcionarios func = new Funcionarios ();		    System.out.println("Digite o nome da pessoa");		    func.setNome(sc.nextLine());		    System.out.println("Digite o rg da pessoa");		    func.setRg(sc.nextLine());		    		    return func;		}				public static Alunos cadastrarAluno (Scanner sc){			Alunos alun = new Alunos();			System.out.println("Digite o nome do aluno:");			alun.setNome(sc.nextLine());			System.out.println("Digite o rg do aluno:");			alun.setRg(sc.nextLine());			return alun;					}                public static void listarTudo (List<Professores> professores, List<Funcionarios> funcionar, List<Alunos> alu){        	// Mostrar professores      		System.out.println("Professores Cadastrados");      		for (Professores pf : professores) {      			System.out.println("Nome:" + pf.getNome());      			System.out.println("Rg:" + pf.getRg());    	  System.out.println("Endereço:" + pf.getEndereco());      }    System.out.println("Funcionarios cadastrados");    for (Funcionarios func : funcionar){	System.out.println("Nome:" + func.getNome());	System.out.println("Nome:" + func.getRg());	}System.out.println("Alunos cadastrados");for (Alunos alun : alu){	System.out.println("Nome:" + alun.getNome());	System.out.println ("Rg:" + alun.getRg());	}          }          }
Link para o comentário
Compartilhar em outros sites

A classe professores usa herança da classe pessoas, então postarei a classe pessoas.

public class Pessoas {public String nome;public String rg;public long cpf;public String endereco;public String getNome() {	return nome;}public void setNome(String nome) {	this.nome = nome;}public String getRg() {	return rg;}public void setRg(String rg) {	this.rg = rg;}public long getCpf() {	return cpf;}public void setCpf(long cpf) {	this.cpf = cpf;}public String getEndereco() {	return endereco;}public void setEndereco(String endereco) {	this.endereco = endereco;}}
Link para o comentário
Compartilhar em outros sites

O problema ocorre quando você está cadastrando o CPF e dando um <ENTER> o método nextLong da classe Scanner vai ler somente o valor numérico e ignorar a quebra de linha (que vai ver lida pela próxima chamada ao método nextLine) . Se você declarar o CPF como String e utilizar o método nextLine, tudo deve funcionar como deveria.

Link para o comentário
Compartilhar em outros sites

O problema ocorre quando você está cadastrando o CPF e dando um <ENTER> o método nextLong da classe Scanner vai ler somente o valor numérico e ignorar a quebra de linha (que vai ver lida pela próxima chamada ao método nextLine) . Se você declarar o CPF como String e utilizar o método nextLine, tudo deve funcionar como deveria.

Mas no fim, tem alguma diferença entre declarar como long ou string? E outra, se eu quisesse usar o cpf como long mesmo, o que eu deveria fazer?

Link para o comentário
Compartilhar em outros sites

  • Moderador

Mas no fim, tem alguma diferença entre declarar como long ou string? E outra, se eu quisesse usar o cpf como long mesmo, o que eu deveria fazer?

Sim. o java tem esse problema.  sempre recomendo utilizar Strings para cpf, telefones e etc.. deixe valores numéricos para algo como valores monetários... idades... chave primária de tabelas no banco de dados... e etc

Link para o comentário
Compartilhar em outros sites

Sim. o java tem esse problema.  sempre recomendo utilizar Strings para cpf, telefones e etc.. deixe valores numéricos para algo como valores monetários... idades... chave primária de tabelas no banco de dados... e etc

Outra dúvida: nesse código, sempre que eu usar int vai dar esse problema?

Link para o comentário
Compartilhar em outros sites

Outra dúvida: nesse código, sempre que eu usar int vai dar esse problema?

 

Caso você queira trabalhar com long ou int, você pode ler a linha usando o método nextLine, depois converter o valor para int ou long usando Integer.valueOf e Long.valueOf respectivamente (tomando cuidado que o usuário pode digitar um valor invalido).

Link para o comentário
Compartilhar em outros sites

Caso você queira trabalhar com long ou int, você pode ler a linha usando o método nextLine, depois converter o valor para int ou long usando Integer.valueOf e Long.valueOf respectivamente (tomando cuidado que o usuário pode digitar um valor invalido).

Você poderia dar um exemplo de como usar  Integer.valueOf Long.valueOf ?

Link para o comentário
Compartilhar em outros sites

import java.util.Scanner;public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        System.out.println("Digite a sua idade: ");        try {            int idade = Integer.valueOf(scanner.nextLine());            if (idade < 18) {                System.out.println("Você ainda é menor de idade.");            } else {                System.out.println("Você já é maior de idade.");            }        } catch (Exception e) {            System.out.println("O valor que você digitou é invalido.");        }    }}

Para usar o método Long.valueOf é a mesma coisa.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...