Loop with options

3

How do I create a loop with options in Java? For example: "type 1 to save and 2 to delete". And when doing the commands of each option, go back to the: "type 1 to save and 2 to delete".

import java.io.*;

public class CadastroPessoa{

public static void main(String[] args) throws IOException{
//burocracia para leitura de teclado
InputStream entradaSistema = System.in;
InputStreamReader leitor = new InputStreamReader(entradaSistema);
BufferedReader leitorEntrada = new BufferedReader(leitor);
String entradaTeclado;

//instanciando objetos do sistema
ControlePessoa umControle = new ControlePessoa();


System.out.println("Digite 1 para adicionar pessoa. Digite 2 para remover pessoa. Digite 3 para pesquisar uma pessoa. Digite 4 para sair.");
entradaTeclado = leitorEntrada.readLine();
String Opcao = entradaTeclado;

    String opcao1 = "1";
    String opcao2 = "2";
    String opcao3 = "3";
String opcao4 = "4"; 

while (!Opcao.equals(opcao4)){

    if (Opcao.equals(opcao1)){

        //interagindo com usuário
        System.out.println("Digite o nome da Pessoa:");
        entradaTeclado = leitorEntrada.readLine();
        String umNome = entradaTeclado;

        System.out.println("Digite o telefone da Pessoa:");
        entradaTeclado = leitorEntrada.readLine();
        String umTelefone = entradaTeclado;


        //adicionando uma pessoa na lista de pessoas do sistema
        Pessoa umaPessoa = new Pessoa(umNome, umTelefone);
        String mensagem = umControle.adicionar(umaPessoa);
        System.out.println(mensagem);
        }

    if (Opcao.equals(opcao2)){

        System.out.println("Digite o nome da pessoa que você quer remover:");
        entradaTeclado = leitorEntrada.readLine();
        String umNome = entradaTeclado;

        //removendo uma pessoa na lista de pessoas do sistema
        }


if (Opcao.equals(opcao3)){

        System.out.println("Digite o nome da pessoa que você quer pesquisar:");
        entradaTeclado = leitorEntrada.readLine();
        String umNome = entradaTeclado;

        //buscando pessoa na lista de pessoas


    }   
}
//conferindo saída
System.out.println("=================================");
System.out.println("=)");

}

}
    
asked by anonymous 04.04.2014 / 22:53

2 answers

3

Well, come on. Your code has a few common mistakes.

First, on line 25 (the condition of the loop) you are using:

while (Opcao != opcao4){

This condition will check if the variable Opcao is different from the opcao4 variable in terms of its content, ie in practice if objects are different. They will always be different because you have distinct strings. Then this loop will execute infinitely. The ideal is to correct to compare the contents of the strings, not the objects themselves, as follows:

while (!Opcao.equals(opcao4)){

Another error is that your loop control variable is called Opcao but you do not use it for reading the data! The variable you are using to read the data is called entradaTeclado . So even with the previous fix your code still will not work properly. So the code in line 25 would look more like this:

while (!entradaTeclado.equals(opcao4)){

Regardless of these errors, there is a logic error in your loop. You start the program by displaying its "menu" of options and making an initial reading (the option itself). Then you enter the loop in which the data of the specific option is requested. However, when this loop is terminated (and execution returns to while ), the option is not called again (it is outside the loop, before it actually). Therefore, your code is eternally requesting the data of the first chosen option until (due to the previously suggested correction) it is interrupted by typing the number 4 (for example, make the corrections that I suggested above and type 1 the first time you are asked, you will notice that the code will only be terminated if you type 4 on the person's phone).

I must also say that your code is a bit disorganized, and this may be disrupting your own understanding. Try to correctly indentify the levels always, even within the class or function.

Another suggestion is that you do not need to put the option values in variables for the comparison because if (entradaTeclado.equals("1")){ is valid. Below I propose a maybe simpler code that gets the result you want:

InputStream entradaSistema = System.in;
InputStreamReader leitor = new InputStreamReader(entradaSistema);
BufferedReader leitorEntrada = new BufferedReader(leitor);

String entradaTeclado;
do {
    System.out.println("Digite 1 para adicionar pessoa. Digite 2 para remover pessoa. Digite 3 para pesquisar uma pessoa. Digite 4 para sair.");
    entradaTeclado = leitorEntrada.readLine();      

    if(entradaTeclado.equals("1")) {
        System.out.println("Digite o nome da Pessoa:");
        String umNome = leitorEntrada.readLine();

        System.out.println("Digite o telefone da Pessoa:");
        String umTelefone = leitorEntrada.readLine();

        // Faz o que tem que fazer aqui
    }
    else if(entradaTeclado.equals("2")) {
        System.out.println("Digite o nome da pessoa que você quer remover:");
        String umNome = leitorEntrada.readLine();

        // Faz o que tem que fazer aqui
    }
    else if(entradaTeclado.equals("3")) {
        System.out.println("Digite o nome da pessoa que você quer pesquisar:");
        String umNome = leitorEntrada.readLine();

        // Faz o que tem que fazer aqui
    }
    else if(entradaTeclado.equals("4")) {
        break; // Interrompe
    }
    else {
        System.out.println("Oops! Opção inválida: " + entradaTeclado);
    }       
} while(true);

In this code I used do...while instead of while because so you can first request the value and only check the value at the end. In practice I have set true to the check because checking the 4 value uses break to stop. I also used else if to chain decisions so that you can validate the invalid options in else finite%.

Note, however, that because your options are numeric the code can get 'simpler' if you convert the entry to a number and use switch . Note also that you do not need to read the data for the control variable entradaTeclado , and neither should it therefore change the value of the option. You can read immediately for the variables umNome and umTelefone .

    
05.04.2014 / 00:24
1

You should read the entry within the replay, for example:

short entradaTeclado;
 do{
    //lê dado e realiza uma operação
    entradaTeclado = leitorEntrada.nextShort();
    switch(entradaTeclado){
        case 1: /*faz algo*/ break;
        case 2: /*faz algo*/ break;
        case 3: /*faz algo*/ break;
    }
 }while(entradaTeclado != 4);

So, as long as the user does not select the output option, it will repeat the loop.

    
05.04.2014 / 00:01