Duvida em como proceder no sistema(RESOLVIDO)

Boa tarde a todos, estou criando um sistema(MVC) super simples para aprendizagem mesmo.

O sistema consiste em uma apresentação de um menu, o usuário escolhe a opção que quer dentro deste menu, e o sistema roda de acordo com a opção selecionada.

No meu caso o menu apresenta as seguintes opções:

[1] - CADASTRO DE CLIENTES
[2] - CADASTRO DE PRODUTOS
[3] - PEDIDO
[4] - SAIR

Eu estou seguindo a ordem então estou começando pelo cadastro de clientes

1º criei o pacote view com o menu:

package br.com.fjsistemas.view;

import java.util.Scanner;

import br.com.fjsistemas.model.Cliente;

/**
 * Hello world!
 *
 */
public class App {

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);// RECEBE AS INFORMAÇÕES DIGITADAS NO TECLADO PELO USUARIO

		Cliente cliente = new Cliente();// INSTANCIEI A CLASSE CLIENTE QUE RECEBERA E FORNECERA TODOS OS DADOS
										// REFERENTES AO CLIENTE

		System.out.println("=====BEM VINDO AO SIP=====");
		System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
		System.out.println(
				"\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
		System.out.print("\nSELECIONE: ");
		int opcao = sc.nextInt();// VARIAVEL OPÇÃO RECEBENDO E ARMAZENANDO A OPÇÃO ESCOLHIDA PELO USUARIO

		if (opcao == 1) {// 1ª CONDIÇÃO, SE O USUARIO OPTAR PELO NUMERO 1, O SISTEMA DE VE FAZER ESTE
							// TRECHO DE CÓDIGO
			System.out.println("\nCADASTRANDO CLIENTE");
			System.out.print("\nNome Cliente: ");
			cliente.setNome(sc.next());// NOME DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL NOME(cliente.setNome)
			System.out.print("CPF: ");
			cliente.setCpf(sc.next());// CPF DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL NOME(cliente.setCpf)
			
			//TESTE PARA VERIFICAR SE O NOME DO CLIENTE FOI GRAVADO CORRETAMENTE NA CLASSE CLIENTE(MODELO), CHAMEI (cliente.getNome) E O NOME FOI EXIBIDO CORRETAMENTE NO CONSOLE
			System.out.println(cliente.toString());
		}

	}
}

2º criei o pacote modelo com a classe cliente:

package br.com.fjsistemas.model;

public class Cliente {

private int id;
private String nome;
private String cpf;

public Cliente() {

}

public Cliente(int id, String nome, String cpf) {

	this.id = id;
	this.nome = nome;
	this.cpf = cpf;
}

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public String getNome() {
	return nome;
}

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

public String getCpf() {
	return cpf;
}

public void setCpf(String cpf) {
	this.cpf = cpf;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + id;
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Cliente other = (Cliente) obj;
	if (id != other.id)
		return false;
	return true;
}

@Override
public String toString() {
	return "\nCliente: " + "\n" + "\nID: " + id + "\nNome: " + nome + "\nCPF: " + cpf;
}

}

O resultado foi o que eu esperava mesmo, estou fazendo tudo no console do eclipse, não vou trabalhar com swing no momento.

image

o que eu quero agora é que o sistema pergunte se eu quero cadastrar outro cliente ou retornar ao menu inicial…mas não sei como fazer exatamente isto, gostaria das sugestões de vcs…obg!!

Eu fazia muito desses sistemas na época da faculdade, mas era em C puro ou Pascal (sou meio velho). O que você pode fazer é, escolhida determinada opção, ele entrar em um do-while para fazer novamente as operações, até quando ele perguntar se deseja continuar e a condição se tornar false, aí fora do do-while vc pode limpar a tela e jogar novamente o menu principal. mais ou menos assim. Espero que tenha expressado bem rsrsrs.

1 curtida

Mesmo na programação estruturada, antes de entrar na parte de POO, eu também já fazia esse negócio de repetir com do-while assim como o fagnercruz mencionou. Geralmente eu criava uma variável booleana, e fazia um do-while com a operação inteira.

Alguns exercícios de programação estruturada até falavam para “fazer o programa encerrar caso entrasse com um valor inválido”, mas eu fazia duas versões: uma que fazia como a questão pedia, e outra na qual eu PERGUNTO ao usuário se ele deseja continuar, peço para ele entrar com um char (dentro dessa pergunta eu ainda faço um outro do-while pra continuar insistindo na pergunta caso ele inserisse um caractere que não fosse ‘S’ ou ‘s’), e fecho o programa quando for solicitado.

Nesse seu caso (eu tou falando como um iniciante Java, tá?), como uma das linhas de código diz “CADASTRO DE CLIENTES”, eu imagino que o programa não irá cadastrar apenas vários produtos, como também vários clientes. Então no caso eu também aproveitaria para criar uma LISTA do tipo “Cliente” (acredito que uma lista não precise ter um tamanho predefinido inicialmente pelo usuário como um vetor/matriz), uma de “Produto”, e aí ficar criando objetos desses dois tipos, ou excluir, enfim… Ficar “brincando” com o código. :slight_smile:

1 curtida

@fagnercruz e @MullenLeafar eu tentei com while como o @fagnercruz sugeriu, e a principio achei que estava certo, pois quando recebo a pergunta do sistema:

DESEJA CADASTRAR UM NOVO CLINTE? [Y] [N]:

digito Y, e o sistema começa novamente a pedir um nome de usuário e cpf…vejam na imagem de console abaixo:

Mas quando eu respondo N…ele continua a me pedir um novo cliente…vejam:

Aqui após a resposta ser N, deveria retornar ao menu…mas não sei como fazer!!

@MullenLeafar …respondendo a sua pergunta…sim, sou MEGA INICIANTE EM JAVA

CODIGO

package br.com.fjsistemas.view;

import java.util.Scanner;

import br.com.fjsistemas.model.Cliente;

public class App {

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		@SuppressWarnings("unused")
		String resposta = null;

		Scanner sc = new Scanner(System.in);// RECEBE AS INFORMAÇÕES DIGITADAS NO TECLADO PELO USUARIO

		Cliente cliente = new Cliente();// INSTANCIEI A CLASSE CLIENTE QUE RECEBERA E FORNECERA TODOS OS DADOS
										// REFERENTES AO CLIENTE

		System.out.println("=====BEM VINDO AO SIP=====");
		System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
		System.out.println(
				"\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
		System.out.print("\nSELECIONE: ");
		int opcao = sc.nextInt();// VARIAVEL OPÇÃO RECEBENDO E ARMAZENANDO A OPÇÃO ESCOLHIDA PELO USUARIO

		if (opcao == 1) {// 1ª CONDIÇÃO, SE O USUARIO OPTAR PELO NUMERO 1, O SISTEMA DE VE FAZER ESTE
							// TRECHO DE CÓDIGO
			while (resposta != "N") {
				System.out.println("\n======================");
				System.out.println("CADASTRANDO CLIENTE");
				System.out.println("======================");
				System.out.print("\nNome Cliente: ");
				cliente.setNome(sc.next());// NOME DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setNome)
				System.out.print("CPF: ");
				cliente.setCpf(sc.next());// CPF DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setCpf)
				System.out.println();

				System.out.println("=======================");
				// TESTE PARA VERIFICAR SE OS DADOS DO CLIENTE FORAM GRAVADOS CORRETAMENTE NA
				// CLASSE CLIENTE(MODELO), CHAMEI (cliente.toString) E OS DADOS FORAM EXIBIDOS
				// CORRETAMENTE NO CONSOLE
				System.out.println(cliente.toString());
				System.out.println("=======================");

				System.out.print("\nDESEJA CADASTRAR UM NOVO CLINTE? [Y] [N]: ");
				resposta = sc.next();
			}
		}
	}
}

String são objetos e devem ser comparados com o método equals e não == ou !=.

1 curtida

tenta fazer a condicional com equal como @staroski comentou acima, tipo
while ("S".equals(resposta))

1 curtida

@fagnercruz e @staroski

Fiz desta forma como vcs me orientaram, a única coisa diferente que fiz foi colocar while ("N".equalsIgnoreCase(resposta))

para o sistema ignorar maiúsculas e minúsculas.

fazendo desta forma, ao selecionar a opção 1 do menu, o sistema parou de avançar, ou seja, ele não vai mais para o cadastro do cliente em si

ele para aqui:

código:

package br.com.fjsistemas.view;

import java.util.Scanner;

import br.com.fjsistemas.model.Cliente;

public class App {

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		@SuppressWarnings("unused")
		String resposta = null;

		Scanner sc = new Scanner(System.in);// RECEBE AS INFORMAÇÕES DIGITADAS NO TECLADO PELO USUARIO

		Cliente cliente = new Cliente();// INSTANCIEI A CLASSE CLIENTE QUE RECEBERA E FORNECERA TODOS OS DADOS
										// REFERENTES AO CLIENTE

		System.out.println("=====BEM VINDO AO SIP=====");
		System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
		System.out.println(
				"\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
		System.out.print("\nSELECIONE: ");
		int opcao = sc.nextInt();// VARIAVEL OPÇÃO RECEBENDO E ARMAZENANDO A OPÇÃO ESCOLHIDA PELO USUARIO

		if (opcao == 1) {// 1ª CONDIÇÃO, SE O USUARIO OPTAR PELO NUMERO 1, O SISTEMA DE VE FAZER ESTE
							// TRECHO DE CÓDIGO
			while ("N".equalsIgnoreCase(resposta)) {
				System.out.println("\n======================");
				System.out.println("CADASTRANDO CLIENTE");
				System.out.println("======================");
				System.out.print("\nNome Cliente: ");
				cliente.setNome(sc.next());// NOME DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setNome)
				System.out.print("CPF: ");
				cliente.setCpf(sc.next());// CPF DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setCpf)
				System.out.println();

				System.out.println("=======================");
				// TESTE PARA VERIFICAR SE OS DADOS DO CLIENTE FORAM GRAVADOS CORRETAMENTE NA
				// CLASSE CLIENTE(MODELO), CHAMEI (cliente.toString) E OS DADOS FORAM EXIBIDOS
				// CORRETAMENTE NO CONSOLE
				System.out.println(cliente.toString());
				System.out.println("=======================");

				System.out.print("\nDESEJA CADASTRAR UM NOVO CLINTE? [Y] [N]: ");
				resposta = sc.next();
			}
		}
	}
}

Ao meu ver, você pode setar a variável “resposta” como um char ao invés de String, já que você só está pedindo para o usuário digitar uma letra ao invés de uma palavra (string de letras). Assim você pode comparar com == ao invés de equals.

1 curtida

@MullenLeafar

fiz como sugeriu, mas o problema acima descrito continua

package br.com.fjsistemas.view;

import java.util.Scanner;

import br.com.fjsistemas.model.Cliente;

public class App {

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		@SuppressWarnings("unused")
		char resposta = 0;

		Scanner sc = new Scanner(System.in);// RECEBE AS INFORMAÇÕES DIGITADAS NO TECLADO PELO USUARIO

		Cliente cliente = new Cliente();// INSTANCIEI A CLASSE CLIENTE QUE RECEBERA E FORNECERA TODOS OS DADOS
										// REFERENTES AO CLIENTE

		System.out.println("=====BEM VINDO AO SIP=====");
		System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
		System.out.println(
				"\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
		System.out.print("\nSELECIONE: ");
		int opcao = sc.nextInt();// VARIAVEL OPÇÃO RECEBENDO E ARMAZENANDO A OPÇÃO ESCOLHIDA PELO USUARIO

		if (opcao == 1) {// 1ª CONDIÇÃO, SE O USUARIO OPTAR PELO NUMERO 1, O SISTEMA DE VE FAZER ESTE
							// TRECHO DE CÓDIGO
			while (resposta =='N') {
				System.out.println("\n======================");
				System.out.println("CADASTRANDO CLIENTE");
				System.out.println("======================");
				System.out.print("\nNome Cliente: ");
				cliente.setNome(sc.next());// NOME DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setNome)
				System.out.print("CPF: ");
				cliente.setCpf(sc.next());// CPF DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setCpf)
				System.out.println();

				System.out.println("=======================");
				// TESTE PARA VERIFICAR SE OS DADOS DO CLIENTE FORAM GRAVADOS CORRETAMENTE NA
				// CLASSE CLIENTE(MODELO), CHAMEI (cliente.toString) E OS DADOS FORAM EXIBIDOS
				// CORRETAMENTE NO CONSOLE
				System.out.println(cliente.toString());
				System.out.println("=======================");

				System.out.print("\nDESEJA CADASTRAR UM NOVO CLINTE? [Y] [N]: ");
				resposta = (char) sc.nextByte();
			}
		}
	}
}

Enquanto o usuário NÃO quiser cadastrar um novo cliente você está cadastrando um novo cliente.
Sua lógica precisa ser negada.

1 curtida

@staroski

não sei se foi isto que vc quis dizer, mas neguei a condição:

package br.com.fjsistemas.view;

import java.util.Scanner;

import br.com.fjsistemas.model.Cliente;

public class App {

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		@SuppressWarnings("unused")
		String resposta = null;

		Scanner sc = new Scanner(System.in);// RECEBE AS INFORMAÇÕES DIGITADAS NO TECLADO PELO USUARIO

		Cliente cliente = new Cliente();// INSTANCIEI A CLASSE CLIENTE QUE RECEBERA E FORNECERA TODOS OS DADOS
										// REFERENTES AO CLIENTE

		System.out.println("=====BEM VINDO AO SIP=====");
		System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
		System.out.println(
				"\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
		System.out.print("\nSELECIONE: ");
		int opcao = sc.nextInt();// VARIAVEL OPÇÃO RECEBENDO E ARMAZENANDO A OPÇÃO ESCOLHIDA PELO USUARIO

		if (opcao == 1) {// 1ª CONDIÇÃO, SE O USUARIO OPTAR PELO NUMERO 1, O SISTEMA DE VE FAZER ESTE
							// TRECHO DE CÓDIGO
			while (!"N".equalsIgnoreCase(resposta)) {
				
				System.out.println("\n======================");
				System.out.println("CADASTRANDO CLIENTE");
				System.out.println("======================");
				System.out.print("\nNome Cliente: ");
				cliente.setNome(sc.next());// NOME DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setNome)
				System.out.print("CPF: ");
				cliente.setCpf(sc.next());// CPF DO CLIENTE SENDO GRAVADO(SET) NA CLASSE CLIENTE NA VARIAVEL
											// NOME(cliente.setCpf)
				System.out.println();

				System.out.println("=======================");
				// TESTE PARA VERIFICAR SE OS DADOS DO CLIENTE FORAM GRAVADOS CORRETAMENTE NA
				// CLASSE CLIENTE(MODELO), CHAMEI (cliente.toString) E OS DADOS FORAM EXIBIDOS
				// CORRETAMENTE NO CONSOLE
				System.out.println(cliente.toString());
				System.out.println("=======================");

				System.out.print("\nDESEJA CADASTRAR UM NOVO CLINTE? [Y] [N]: ");
				resposta = sc.next();
			}
		}
	}
}

agora o sistema voltou a fazer o cadastro, mas quando informei ao sistema que Não gostaria de cadastrar um novo usuario, ele simplesmente encerrou o sistema, eu gostaria agora de voltar ao menu principal. Como faço isto?

Bom, eu tomei a liberdade de copiar esse seu pedaço de código e fiz um pequeno experimento aqui na IDE. Declarei globalmente as variáveis opção como INT (para o menu inicial) e resposta como CHAR (para o sub-menu de cadastro de cliente). Dei uma testada aqui, e pelo menos o efeito de continuar/sair no sub-menu e do menu inicial deram certo. Dá uma olhada e vê se era esse o efeito que você procurava.

public static void main(String[] args){

        Scanner sc = new Scanner(System.in);

        //Todos os comandos pertencentes à classe Cliente eu deixei comentados.
        //Cliente cliente = new Cliente();

        //Declarando as duas seguintes variáveis globalmente.

        int opcao;
        char resposta;

        //Essa primeira frase eu deixei fora do DO-WHILE
        //porque achei que seria bom só mostra-la uma vez.

        System.out.println("=====BEM VINDO AO SIP=====");
        
        do{
            System.out.println("\nNAVEGUE PELO MENU E SELECIONE A OPÇÃO DESEJADA");
            System.out.println(
                "\n[1] - CADASTRO DE CLIENTES" + "\n[2] - CADASTRO DE PRODUTOS" + "\n[3] - PEDIDO" + "\n[4] - SAIR");
            System.out.print("\nSELECIONE: ");
            opcao = sc.nextInt();

            sc.nextLine();
            //Eu coloquei esse sc.nextLine() acima isolado por causa daquela "treta"
            //entre o nextLine() e os demais next()s.           

            if(opcao == 1){
                do{
                    System.out.println("\n======================");
                    System.out.println("CADASTRANDO CLIENTE");
                    System.out.println("======================");

                    System.out.print("\nNome Cliente: ");
                    //cliente.setNome(sc.next());

                    System.out.print("CPF: ");
                    //cliente.setCpf(sc.next());

                    System.out.println();

                    System.out.println("=======================");
                    //Aqui você chamou o toString da classe Cliente. Não implementei aqui.
                    //System.out.println(cliente.toString());

                    System.out.println("=======================");

                    System.out.print("\nDESEJA CADASTRAR UM NOVO CLIENTE? [Y] [N]: ");

                    resposta = sc.nextLine().charAt(0);

                } while(resposta == 'Y' || resposta == 'y');
                System.out.println("SAINDO DA OPÇÃO 1.");
            }

        }while(opcao != 4);

        //Aqui, se a opção digitada do menu inicial não for a 4, o programa vai continuar.
        //Mas se for a 4, o programa vai sair do loop e exibir a mensagem abaixo.
        System.out.println("Agradecemos por utilizar nosso programa.");

        sc.close();
    }

Como você quer encerrar um sub-menu para voltar ao menu inicial, então eu particularmente achei melhor colocar o menu inicial em um do-while. Cada uma das opções no caso ficaria em um sub-menu separado, cada um com um do-while, todos esses “do-whiles menores” estando dentro de um IF maior (eu particularmente, nesse caso usaria o SWITCH, mas é questão de gosto). Assim, toda vez que for finalizar um sub-menu, como o menu inicial também está em um do-while, então vai voltar para o menu inicial.

Desculpa se tou mostrando um “código pronto”, ou sei lá. Achei que seria melhor pra retratar como eu acho que ficaria mostrando o “resposta” como char e usando para sair/repetir menus. Veja se fica melhor pra você.

1 curtida

@MullenLeafar Eu rodei o seu código, apenas descomentei os dados da classe Cliente…veja o que deu:

Experimenta tirar o “sc.nextLine()” que eu coloquei isolado após o “opcao = sc.nextInt()”.

1 curtida

@MullenLeafar mesmo erro, removi o código sc.nextLine()

Percebi aqui após implementar a classe Cliente. Ao invés de remover aquele sc.nextLine() que eu te falei, o que fica logo abaixo do opcao = sc.nextInt() (aliás, coloque de volta se você tirou kkkk), coloque um novo sc.nextLine() logo após o segundo sc.next(). Fiz aqui e deu certo.

1 curtida

@MullenLeafar Muitooo Obg Mestre!!! Deu certo…obg pelas dicas!!

1 curtida

De nada! :slight_smile:

Eu? “Mestre” nada. Ainda tou aprendendo o básico de POO. Mas obrigado. :blush:

1 curtida

mais uma duvida

está tudo certo, ai digito que N para não cadastrar um novo usuario, e o console me exibe novamente o Menu Principal

Minha duvida é:

Eu até então nunca mexi com comandos de limpar tela de console. Dei uma rápida busca no Google e achei esse link aqui:

Logo em seguida achei esse link do Stack Overflow sobre o assunto:

Pelo que li nesse segundo link parece bem difícil poder digitar comandos de limpamento automático de tela de console no Eclipse a menos que você consiga criar um plugin pro Eclipse que faça justamente isso. Posso estar errado.

1 curtida