Menu de opções no console em JAVA

Ola, sou novo na linguagem, estou como estagiário em uma empresa de programação e meu chefe me pediu para realizar um pequeno programa para exercitar o meu aprendizado, pediu que fizesse um menu no console em java.

-cada item precisa ter uma descrição, exemplo: cadastros
-cada item pode ter outros itens, exemplo: pessoas, produtos.
-os itens do menu estão condicionados a serem exibidos apenas quando o usuário tem permissão para isso.
-o desafio é criar o programa para que seja possível inserir a estrutura do menu e o programa montar o mesmo de acordo com a estrutura informada.
-é necessário também uma estrutura que informe quais itens o usuário tem acesso.

Eu realizei o menu até agora, a primeira dificuldade é que eu escolho uma opção e o programa se encerra, preciso que ele continue funcionando para selecionar outras opções, estou tentando salvar o que a pessoa digita no teclado para um arraylist no caso os cadastros, a parte da permissão não faço ideia como fazer, alguém me da uma luz por favor kkkk

meu código até então:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

		Scanner menu = new Scanner (System.in);
		
		System.out.print("##--Teste Estrutura de Menu--##\n\n");
		System.out.print("|-----------------------------|\n");
		System.out.print("| Opção 1 - Novo Cadastro     |\n");
		System.out.print("| Opção 2 - Clientes          |\n");
		System.out.print("| Opção 3 - Produtos          |\n");
		System.out.print("| Opção 4 - Sair              |\n");
		System.out.print("|-----------------------------|\n");
		System.out.print("Digite uma opção: ");
		
		int opcao = menu.nextInt();
		
		
		switch (opcao) {
		case 1:
			System.out.print("\nOpção Novo Cadastro Selecionado");
			break;
		
		case 2:
			System.out.print("\nOpção Clientes Selecionado\n");
			break;
		
		case 3:
			System.out.print("\nOpção Produtos Selecionado\n");
			break;
			
		default:
			System.out.print("\nOpção Inválida!");
			break;
			
		case 4:
			System.out.print("\nAté logo!");
			menu.close();		
		}
}

}

Você precisa colocar o menu em um laço, ou colocar em um método e chamá-lo em um laço. Nesse caso, o laço (estrutura de repetição) deve ser indeterminado, ou seja, sem a predefinição do número de repetições. Nesse caso, o Do... while ou o while.

o switch então serve para apenas uma opção? não consigo fazer com ele?

O switch é uma estrutura de seleção, não de repetição.

1 - Estruturas de Seleção (ou Condicional): seleciona o código a ser executado com base em um teste. Se uma determinada condição é verdadeira (true) executa um determinado trecho de código. Caso seja falso (false) executa um outro trecho.

1.1 - IF: condicional simples, ou seja, só executa se a condição for verdadeira, retornando ao fluxo norma caso não seja.

if(n > 10)
	System.out.println("N é maior que 10");

1.2 - IF… ELSE: condicional composto. Executa um trecho de código quando a condição é verdadeira e um outro trecho se for falso para só depois voltar ao fluxo normal.

if(n > 10)
	System.out.println("N é maior que 10");
	
else
	System.out.println("N é menor ou igual a 10");

1.3 - SWITCH: seleciona um trecho de código com base em casos, isto é, com base em uma determinada opção, um determinado caso é selecionado e, com base nisso, um trecho de código.

switch(opcao){
	case 1:
		System.out.println("Caso 01");
		break;
	case 2:
		System.out.println("Caso 02");
		break;
	case 3:
		System.out.println("Caso 03");
		break;
	default:
		System.out.println("Caso padrão");
}

1.4 - Ternário: verifica uma condição e executa um trecho de código se form verdadeiro e outro trecho se for falso, tudo em uma única linha.

String str1 = System.out.println("N é maior que 10");
String str2 = System.out.println("N é menor ou igual a 10");

(n > 10) ? str1 : str2;

2 - Estruturas de Repetição (Laço ou Iteração): repete um trecho um determinado número de vezes enquanto uma condição seja satisfeita.

2.1 FOR: restrutura de repetição determinada, ou seja, em que seu término é previamente determinado. Assume a forma:

for(inicialização; teste; incremento/decremento){
	código a ser repetido;
}

Exemplo:

int contador = 0;
for(int i = 0; i < 10; i++){
	System.out.println("-> " + (contador++));
}

2.2 - DO… WHILE: estrutura de repetição com teste condicional final. Ao menos uma repetição será executada.

int contador = 0;
do{
	System.out.println("-> " + (contador++));
}while(contador < 20);

2.3 - WHILE: estrutura de repetição com teste condicional inicial. O trecho do código só será executado se a condição passar no teste que é feito já no início.

int contador = 0;
while(contador >= 0){
	System.out.println("-> " + (contador++));
}

Então no meu caso seria melhor usar o do…while, tentei implementar porem não sei oque colocar no while.

public static void main(String[] args) {

  	Scanner menu = new Scanner (System.in);
  	
  	do {
  	System.out.print("##--Teste Estrutura de Menu--##\n\n");
  	System.out.print("|-----------------------------|\n");
  	System.out.print("| Opção 1 - Novo Cadastro     |\n");
  	System.out.print("| Opção 2 - Clientes          |\n");
  	System.out.print("| Opção 3 - Produtos          |\n");
  	System.out.print("| Opção 4 - Sair              |\n");
  	System.out.print("|-----------------------------|\n");
  	System.out.print("Digite uma opção: ");
  	
  	int opcao = menu.nextInt();

  	if (opcao == 4) {
  		System.out.print("\nAté logo!");
  		menu.close(); 
  	}
  	
  	switch (opcao) {
  	case 1:
  		System.out.print("\nOpção Novo Cadastro Selecionado");
  		break;
  		
  	case 2:
  		System.out.print("\nOpção Clientes Selecionado\n");
  		break;
  		
  	case 3:
  		System.out.print("\nOpção Produtos Selecionado\n");
  		break;
  		
  	default:
  		System.out.print("\nOpção Inválida!");
  		break;
  }

}
}

Onde está o teste? o while do do..while? Por curiosidade, tu está fazendo faculdade? Que semestre? Isso é o básico do básico.
O switch deve ficar ‘dentro’ do laço.

Faço engenharia de software a 2 anos porem comecei a aprender JAVA faz 1 semana, tive o primeiro contato com c++ e depois javascript, estou bem no básico mesmo do JAVA , inclusive começou a matéria de programação agora e por minha sorte é em JAVA.

Exemplo (incompleto, tu faz o resto):

1 - Classe Cliente

public class Cliente {
	private int idCliente;
	private String nomeCliente;
	
	/*
	* Métodos acessores modificadores
	*/
	public void setIdCliente(int idCliente){
		this.idCliente = idCliente;
	}
	
	public int getIdCliente(){
		return idCliente;
	}
	
	public void setNomeCliente(String nomeCliente){
		this.nomeCliente = nomeCliente;
	}
	
	public String getNomeCliente(){
		return nomeCliente;
	}
}

2 - Classe Produto

public class Produto {
	private int codigoProduto;
	private String marca;
	private String descricao;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setCodigoProduto(int codigoProduto){
		this.codigoProduto = codigoProduto;
	}
	
	public int getCodigoProduto(){
		return codigoProduto;
	}
	
	public void setMarca(String marca){
		this.marca = marca;
	}
	
	public String getMarca(){
		return marca;
	}
	
	public void setDescricao(String descricao){
		this.descricao = descricao;
	}
	
	public String getDescricao(){
		return descricao;
	}
}

3 - Teste

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

public class Teste {
	List<Cliente> clientes = new ArrayList<>();
	List<Produto> produtos = new ArrayList<>();
	
	private void exibirMenu(){
		System.out.println("\n\n");
		System.out.println("+-------------------------------------------+");
		System.out.println("|        Menu de Opções                     |");
		System.out.println("+-------------------------------------------+");
		System.out.println("| 01 - Cadastrar Cliente                    |");
		System.out.println("| 02 - Cadastrar Produto                    |");
		System.out.println("| 03 - Imprimir relatório de clientes       |");
		System.out.println("| 04 - Imprimir relatório de produtos       |");
		System.out.println("| 50 - Exibir o menu de opções              |");
		System.out.println("| 99 - Sair                                 |");
		System.out.println("+-------------------------------------------+");
	}
	
	private void cadastrarCliente(){
		Scanner leitor = new Scanner(System.in);
		Cliente cliente = new Cliente();
		
		System.out.print("ID do cliente: ");
		cliente.setIdCliente(leitor.nextInt());
		
		System.out.print("Nome do cliente: ");
		leitor.nextLine();// limpa o scanner
		cliente.setNomeCliente(leitor.nextLine());
		
		clientes.add(cliente);
		
		//leitor.close();
	}
	
	private void imprimirCliente(){
		for(Cliente cliente : clientes){
			System.out.println("\nId: " + cliente.getIdCliente());
			System.out.println("Nome: " + cliente.getNomeCliente());
			System.out.println("\n\n");
		}
	}
	
	public static void main(String[] args){
		short opcao = 50;
		Scanner leitor = new Scanner(System.in);
		Teste teste = new Teste();

		do{
			teste.exibirMenu();
		
			System.out.print("Opção escolhida: ");
			opcao = leitor.nextShort();
			
			switch(opcao){
				case 1:
					teste.cadastrarCliente();
					break;
				case 3:
					teste.imprimirCliente();
					break;
				case 50:
					teste.exibirMenu();
					break;
				default:
					teste.exibirMenu();
			}
		}while(opcao != 99);
	}
}

Rodando…


image

1 curtida

Legal, vou tentar entender todo o código, no caso do this, isso me confundi quando devo usa-lo e os get e sets, estou pesquisando todos os conceitos, muito obrigado pela ajuda!

Não entendi essa parte do código:

private void cadastrarCliente(){
Scanner leitor = new Scanner(System.in);
Cliente cliente = new Cliente();

no caso você criou um objeto cliente ? fiquei confuso nesta parte.

Scanner = Classe que permite ler dados do teclado. Grosseiramente, seria algo próximo ao scanf do C, guardadas as devidas diferenças de funcionamento e paradigma (o Java é Baseado no C).
Veja a doc: Docs Oracle - Classe Scanner.

Cliente cliente = new Cliente(); - crio um novo objeto cliente a cada chamada ao método de cadastro.

Cliente: é o tipo abstrato (semelhante, de certa forma a um TAD)
cliente: variável do tipo Cliente
new: palavra reservada que a JVM usa para reservar espaço de memória
Cliente(): conctrutor da classe Cliente que inicializa as variáveis…

Sugiro dar uma ‘espiada’ aqui: Java Tutorials e aqui: Curso em Vídeo (YouTube) - POO com Java.

Entendi.

consegui adicionar o cadastro de produtos e exibi-los =) , porem quando vou digitar a descrição do produto eu digito dou enter, depois preciso digitar mais uma linha para dai sim ele sair e voltar para o menu, por que isso acontece?

package programaJava;

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

public class Teste {
	List<Cliente> clientes = new ArrayList<>();
	List<Produto> produtos = new ArrayList<>();
	
	private void exibirMenu(){
		System.out.println("\n\n");
		System.out.println("+-------------------------------------------+");
		System.out.println("|        Menu de Opções                     |");
		System.out.println("+-------------------------------------------+");
		System.out.println("| 01 - Cadastrar Cliente                    |");
		System.out.println("| 02 - Cadastrar Produto                    |");
		System.out.println("| 03 - Imprimir relatório de clientes       |");
		System.out.println("| 04 - Imprimir relatório de produtos       |");
		System.out.println("| 50 - Exibir o menu de opções              |");
		System.out.println("| 99 - Sair                                 |");
		System.out.println("+-------------------------------------------+");
	}
	
	
	private void cadastrarProduto(){
		Scanner leitor = new Scanner(System.in);
		Produto produto = new Produto();
		
		System.out.print("Código do produto: ");
		produto.setCodigoProduto(leitor.nextInt());
		
		System.out.print("Marca do produto: ");
		leitor.nextLine();// limpa o scanner
		produto.setMarca(leitor.nextLine());
		
		System.out.println("Descrição do produto: ");
		leitor.nextLine();
		produto.setDescricao(leitor.nextLine());
		
		produtos.add(produto);
	}
	
	private void imprimirProdutos() {
		for(Produto produto : produtos){
			System.out.println("\nCódigo: " + produto.getCodigoProduto());
			System.out.println("Marca: " + produto.getMarca());
			System.out.println("Descrição: " + produto.getDescricao());
			System.out.println("\n\n");
		}
	}
	
	private void cadastrarCliente(){
		Scanner leitor = new Scanner(System.in);
		Cliente cliente = new Cliente();
		
		System.out.print("ID do cliente: ");
		cliente.setIdCliente(leitor.nextInt());
		
		System.out.print("Nome do cliente: ");
		leitor.nextLine();
		cliente.setNomeCliente(leitor.nextLine());
		
		clientes.add(cliente);
		
	}
	
	private void imprimirCliente(){
		for(Cliente cliente : clientes){
			System.out.println("\nId: " + cliente.getIdCliente());
			System.out.println("Nome: " + cliente.getNomeCliente());
			System.out.println("\n\n");
		}
	}
	
	public static void main(String[] args){
		short opcao = 50;
		Scanner leitor = new Scanner(System.in);
		Teste teste = new Teste();

		do{
			teste.exibirMenu();
		
			System.out.print("Opção escolhida: ");
			opcao = leitor.nextShort();
			
			switch(opcao){
				case 1:
					teste.cadastrarCliente();
					break;
				case 2:
					teste.cadastrarProduto();
				case 3:
					teste.imprimirCliente();
					break;
				case 4:
					teste.imprimirProdutos();
				case 50:
					teste.exibirMenu();
					break;
				default:
					teste.exibirMenu();
			}
		}while(opcao != 99);
	}
}

não compreendi também, oque este for está fazendo(Cliente cliente : clientes).

private void imprimirCliente(){
for(Cliente cliente : clientes){
System.out.println("\nId: " + cliente.getIdCliente());
System.out.println(“Nome: " + cliente.getNomeCliente());
System.out.println(”\n\n");

OBS: faltou os BREAKS ali no case já arrumei hehehe

É o chamado "for aprimorado". Basicamente, esse for atribui, em cada iteração, um valor da lista clientes na variável cliente. Se na sua faculdade estiver acesso ao livro Java Como Programar 8, isto está explicado na página 202.
Eu acho, (portanto, posso estar completamente enganado) que é um equivalente para algo como:

for(int i = 0; i < clientes; i++){
	Cliente cliente = clientes.get(i);
}

Se você prestar atenção, na linha 31 há: leitor.nextLine();// limpa o scanner. O método nextLine() da classe Scanner se mantém lendo os tokens (trechos de texto) até encontrar um separador de linha, quando coloca o cursor apontado para a próxima linha (conforme descrito aqui). Como os métodos next() e nextInt(), etc. não marcam a separação de linha, o método nextLine() continua lendo, o que ocasiona esse problema. Então você precisa interpor um nextLine() para ‘sanar’ esse problema como eu fiz no código que te disponibilizei.

Sobre tokes, tu vais encontrar mais informações em JCP8, pág. 535.

1 curtida