Pergunta

Estas são as minhas perguntas:

  1. Estou recebendo um par de erros na linha "public static boolean validNumCheck (String num) {" - "start ilegal de expressão", " ';' esperado", e " ')' esperado".

  2. Como posso dar ao usuário 3 tentativas no total para cada número? Eu acredito que agora o programa pede ao usuário para 3 números e dá-lhes 3 tentativas no total para obter os números corretos (minhas explicações chupar ... leia o código para ter uma melhor idéia do que quero dizer).

Este é meu código:

import javax.swing.JOptionPane;

public class Assignment3 {
    public static void main (String[] args){
        final int MAX_TRIES = 3;
        int[] attempts= new int[2];
        String[] getNumber= new String [2];

        //Ask the user for 3 integers.
        while(attempts[0]<MAX_TRIES){
            getNumber[0]= JOptionPane.showInputDialog(null,"Please enter an integer between 0-200.");

            //Pass the value to validNumChek
            validNumCheck (getNumber);

            //If it is not a valid number give the user 3 more tries.
            if (getNumber== false){
                while(attempts[1]<MAX_TRIES){
                    getNumber[1]= JOptionPane.showInputDialog(null,"Please enter an integer between 0-200.");
                    attempts[1]++;}
                }
            attempts[0]++;
        }

    //Parse the string to an integer and check if it is a valid number.
    public static boolean validNumCheck(String num){
        int number;

        try {
            number = Integer.parseInt(num);
            return number >= 0 && number <= 200;                
        }catch(NumberFormatException e){
            //If it is not a valid number return false.
            return false;
        }
    }
}
Foi útil?

Solução

Eu acho que é importante criar um código pseudo ou algoritmo do problema início e, em seguida, se ele funciona acordo com a programação depois . Caso contrário, você estará resolvendo duas coisas ao mesmo tempo 1. problema de lógica e 2. Implementação detalhes.

Isto é como eu iria fazê-lo.

//The three numbers should be entered by a user in the main method. 

MAIN PROGRAM starts 
declare a , b , c as numbers

//The numbers should be positive and less than 200. 
// see validNumCheck below.

//part 1.If not, the program asks the user to renter the number.
//part 2.The user will have three chances to enter a valid number for each number. 
//part 3. If the number is still invalid after the three trials, the program displays an error message to the user and ends.

 // ok then read a number and validate it. 
 attempts = 0;
 maxAttempts = 3;

 //part 2. three chances... .           
 loop_while (  attemtps < maxAttempts ) do  // or 3 directly.

      number = readUserInput();  // part 1. reenter the number...
      if( numcheck( number ) == false ) then 
           attempts = attempts + 1;
           // one failure.. try again. 
      else 
           break the loop.
      end 

 end 

 // part 3:. out of the loop. 
 // either because the attempts where exhausted 
 // or because the user input was correct.  
 if( attempts == maxAttemtps ) then 
     displayError("The input is invalid due to ... ")
     die();
 else  
     a = number 
 end 

// Now I have to repeat this for the other two numbers, b and c.
// see the notes below... 
MAIN PROGRAM ENDS

E esta seria a função para "validNumCheck"

  // You are encouraged to write a separate method for this part of program – for example: validNumCheck

bool validNumCheck( num )  begin
     if( num < 0 and num > 200 ) then 
         // invalid number 
         return false;
     else 
         return true;
     end
end 

Assim, temos a um ponto onde um número "um" pode ser validado, mas temos de fazer o mesmo para "b" e "c"

Em vez de "copiar / colar" seu código e complicar a sua vida tentando ajustar o código para atender às necessidades que você pode criar uma função e delegar esse trabalho para a nova função.

Assim, o novo código pseudo vai ser assim:

MAIN PROGRAM STARTS 
declare a , b , c as numbers
     a = giveMeValidUserInput();
     b = giveMeValidUserInput();
     c = giveMeValidUserInput();

     print( a, b , c ) 

MAIN PROGRAM ENDS

E mover a lógica para a nova função (ou método)

A função giveMeValidUserInput seria assim (aviso é quase idêntico ao primeiro código pseudo)

function giveMeValidUserInput() starts 
    maxAttempts = 3;
    attempts = 0;


     loop_while (  attemtps < maxAttempts ) do  // or 3 directly.

          number = readUserInput();
          if( numcheck( number ) == false ) then 
               attempts = attempts + 1;
               // one failure.. try again. 
          else 
               return number 
          end 

     end 

     // out of the loop. 
    // if we reach this line is because the attempts were exhausted.
     displayError("The input is invalid due to ... ")
   function ends 

Será que o validNumCheck não mudar.

Passando que fazer código será de alguma forma simples. Porque você já entende o que você quer fazer (análise), e como você deseja fazê-lo (design).

Claro, isso seria mais fácil com a experiência.

Resumo

Os passos passar do problema para a código são :

  1. Leia o problema e entendê-lo (é claro).

  2. Identificar possíveis "funções" e variáveis.

  3. Write como eu ia fazê-lo passo a passo (algoritmo)

  4. traduzi-lo em código, se há algo que você não pode fazer, criar uma função que faz isso por você e manter em movimento.

Outras dicas

Este thread pode seja útil. Essas são dicas para passar de "descrição do problema" para "real codificação"

De acordo com suas perguntas específicas:

Como posso dar ao usuário três oportunidades para introduzir um número válido para cada número? (Eu não quero que a 'resposta' apenas algumas idéias / dicas.

Como você faria isso se fosse uma caixa (com má memória) na vida real? E eu quero dizer muito, muito ruim de memória, tanto que você não consegue se lembrar se você está rejeitando um cliente para a primeira vez ou segundo?

Gostaria de anotá-la em um pedaço de papel, e cada vez que eu rejeito o cliente para adicionar um "|"

"| | |"

Quando o papel tem três linhas em que eu chamaria a polícia. .. :)

Isso é semelhante aqui. Se você não tiver algum coisa que pode variar você vai entrar em uma infinita laço ;)

é validNumCheck supor para retornar um valor e depois sair no método main vazio

Não

... ou eu posso ter apenas sair do programa em que o método principal?

Sim.

Quando você contar (na vida real), você não precisa para armazenar os números em caixas, você só tem que alterar o valor da contagem e têm um limite.

Por exemplo, você pode substituir o seguinte:

        int[] count= new int[2];

Com este:

        int attemtps = 0 ; // or count 
        int maxTries = 3;

Você não pode atribuir um array de inteiros a um matrizes de Strings.

       String[] getNumber= new int [2];

Usando uma matriz de strings podem funcionar, mas você tem que atribuir um array de strings

       String[] numbers = new String[2];

Ou você pode usar e matriz de int:

       int [] numbers = new int [2]; 

Escolha um.

Lembre-se matrizes são como caixas onde você pode armazenar valores.

Na assinatura do método (que seria "public static int validNumCheck(num1,num2,num3)"), você tem que declarar os tipos de parâmetros formais . "public static int validNumCheck(int num1, int num2, int num3)" deve fazer o truque.

No entanto, um projeto melhor seria fazer validNumCheck take apenas um parâmetro, e então você iria chamá-lo com cada um dos três números.


A minha sugestão seguinte (depois de ter visto o seu código atualizado) é que você começa uma IDE decente. Eu só carregá-la em NetBeans e encontrou uma série de erros. Em particular, o "start ilegal de expressão" é porque você se esqueceu de um } no loop while, que um IDE teria sinalizado imediatamente. Depois de ter passado "Olá, mundo", Notepad apenas não cortá-lo mais.

Eu não estou indo para listar as correções para cada erro, mas tenha em mente que int[], int, String[] e String são todos diferentes. Você parece estar usando-os de forma intercambiável (provavelmente devido à quantidade de mudanças que você fez ao seu código). Mais uma vez, um IDE iria sinalizar todos esses problemas.


Em resposta ao seu código mais recente (revisão 12): Você está ficando mais perto. Você parece ter MAX_TRIES usado para dois fins distintos: os três números para entrar, e os três chances para cada número. Embora estes dois números são os mesmos, é melhor não usar a mesma constante para ambos. NUM_INPUTS e MAX_TRIES são o que eu iria chamá-los.

E você ainda não adicionou a } faltando para o loop while.

A próxima coisa a fazer após a fixação desses seria olhar para if (getNumber == false). getNumber é um String[], então esta comparação é ilegal. Você deve estar recebendo o valor de retorno de validNumCheck em uma variável, como:

boolean isValidNum = validNumCheck(getNumber[0]);

E, também, não há nenhuma razão para getNumber ser um array. Você só precisa de um String de cada vez, certo?

Cada parâmetro em uma definição de método precisa de um tipo:

public static int validNumCheck(int num1, int num2, int num3){

mas eu me pergunto por que você passar todos os três números, quando você só verificar um no momento. E você quiser retornar se o número é verdadeiro ou não, então o valor de retorno deve ser um booleano:

public static boolean validNumCheck(int num){
    // test and return true or false

Além disso, se o usuário digita "abc", você receberá uma exceção do "Intger.pareInt (String)" método. Talvez você deseja armazenar o texto inserido como uma String de um dar a validNumCheck, tentar convertê-lo e verificar se ele está entre 0 e 200.

public static boolean isValidNumber(String num){
try {
    int number = Integer.parseInt(num);
    return number >= 0 && number <= 200;        
}catch(NumberFormatException e){
    return false;
}
} 

Editar 1: Para os três tentativas, você precisa de um loop, que é executado até que o número é válido ou três tentativas são tomadas. Basta contar as tentativas com em int.

A propósito, você tem certeza que você tem que usar JOptionPane e JMessageDialog? Isso é coisa GUI e apenas complica essa coisa buraco. Você também pode ler e texto de gravação para o console usando System.out e System.in

EDIT 2: Mais uma dica, quando você criar uma matriz int com um determinado comprimento, cada lugar na matriz é preenchida com 0, então você poderia escrever:

int[] count= new int [3];

e não é necessário que:

count[0]=0;
count[1]=0;
count[2]=0;

E se você quiser usar outros valores que 0, você poderia usar uma forma mais curta como esta:

int[] count = {1, 5, 2}

EDIT 3: Uma coisa que você deve fazer / aprender é esta: não escrever a coisa toda e acabar com muitos erros e um programa não funcionar. Código um pouco, testar um pouco . Proceda de uma parte dela, vê-lo correr e você está feliz.

Será que essa coisa nunca correr? Quero dizer, você já viu que JOptionPane-InputDialog tentar usar? Se não, só que desta primeira: (! E executá-lo)

public class Assignment3 {

    public static void main (String[] args){

        int[] numbers = new int[3];

        for (int i = 0; i < numbers.length; i++) {
            JOptionPane.showInputDialog("enter something");
        }
    }
}

Got-lo para executar? Ótimo! Agora, tente embrulhar essa linha com o JOptionPane em um loop, que vai até o usuário digitou um número válido (usando o método checkValidNum você já tem) ou usou suas três tentativas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top