Почему этот код вызывает исключение «недопустимое начало выражения»?

Вот мои вопросы:

  1. Я получаю пару ошибок в строке «public static boolean validNumCheck (String num) {» - «недопустимое начало выражения», «';' ожидается ", и" ')' ожидается ".

  2. Как я могу дать пользователю всего 3 попытки для каждого числа? Я считаю, что прямо сейчас программа запрашивает у пользователя 3 числа и дает им в общей сложности 3 попытки, чтобы получить правильные числа (мои объяснения - отстой ... прочтите код, чтобы лучше понять, что я имею в виду).

Это мой код:

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;
        }
    }
}

Ответов (5)

Решение

Я думаю , что это очень важно , чтобы создать псевдокод или алгоритм задачи первым , а затем , если он работает дело с программированием позже . В противном случае вы будете решать две задачи одновременно: 1. Логику проблемы и 2. Детали реализации.

Вот как бы я это сделал.

//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

И это будет функция "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 

Итак, мы подошли к моменту, когда число «а» может быть подтверждено, но нам нужно сделать то же самое для «b» и «c».

Вместо того, чтобы «копировать / вставлять» код и усложнять себе жизнь, пытаясь настроить код в соответствии с потребностями, вы можете создать функцию и делегировать эту работу новой функции.

Итак, новый псевдокод будет таким:

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

     print( a, b , c ) 

MAIN PROGRAM ENDS

И переместите логику в новую функцию (или метод)

Функция giveMeValidUserInput будет такой (обратите внимание, что она почти идентична первому псевдокоду)

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 

ValidNumCheck не меняется.

Переход от этого кода будет каким-то простым. Потому что вы уже понимаете, что вы хотите делать (анализ) и как вы хотите это делать (дизайн).

Конечно, с опытом будет легче.

Резюме

Эти шаги для перехода от задачи к коде :

  1. Прочтите проблему и поймите ее (конечно).

  2. Определите возможные «функции» и переменные.

  3. Напишите, как бы я это сделал пошагово (алгоритм)

  4. Переведите это в код, если есть что-то, что вы не можете сделать, создайте функцию, которая сделает это за вас, и продолжайте двигаться.

Эта ветка может быть полезна. Это подсказки для перехода от «описания проблемы» к «фактическому кодированию».

По вашим конкретным вопросам:

Как я могу дать пользователю три возможности ввести действительный номер для КАЖДОГО числа? (Мне не нужен «ответ», просто некоторые идеи / подсказки.

Как бы вы это сделали, если бы в реальной жизни были кассиром (с плохой памятью)? И я имею в виду очень-очень плохую память, так много, что вы не можете вспомнить, отклоняете ли вы клиента в первый раз или во второй?

Я записывал это на листе бумаги и каждый раз, когда отвергал клиента, я добавлял "|"

"| | |"

Когда в газете будет три строчки, я позвоню в полицию. .. :)

Здесь то же самое. Если у вас нет чего- то , что может отличаться, вы попадете в бесконечный цикл ;)

Является validNumCheck, чтобы вернуть значение И ЗАТЕМ выйти в основном методе void

Нет

... или я могу просто выйти из программы в этом основном методе?

да.

В сигнатуре метода (это будет " public static int validNumCheck(num1,num2,num3) ") вы должны объявить типы формальных параметров . " public static int validNumCheck(int num1, int num2, int num3) " должно сработать.

Однако лучше было бы сделать так, чтобы он validNumCheck принимал только один параметр, а затем вы вызывали бы его с каждым из трех чисел.


Мое следующее предложение (после просмотра вашего обновленного кода) - получить достойную среду IDE. Я только что загрузил его в NetBeans и обнаружил ряд ошибок. В частности, «недопустимое начало выражения» происходит из-за того, что вы забыли } в цикле while, что IDE немедленно отметила бы. После того, как вы закончите «Hello world», Блокнот больше его не сокращает.

Я не буду перечислять поправки для каждой ошибки, но имейте в виду , что int[], int, String[], и String все разные. Кажется, вы используете их как взаимозаменяемые (вероятно, из-за количества изменений, внесенных вами в свой код). Опять же, IDE отметит все эти проблемы.


Ответ на ваш новейший код (версия 12): вы приближаетесь. Похоже, вы использовали MAX_TRIES две разные цели: три числа для ввода и три шанса для каждого числа. Хотя эти два числа одинаковы, лучше не использовать одну и ту же константу для обоих. NUM_INPUTS и MAX_TRIES я бы их назвал.

И вы все еще не добавили недостающее } для цикла while.

Следующее, что нужно сделать после их исправления, - это посмотреть if (getNumber == false) . getNumber является a String[], поэтому это сравнение недопустимо. Вы должны получить возвращаемое значение validNumCheck переменной, например:

boolean isValidNum = validNumCheck(getNumber[0]);

Кроме того, нет причин getNumber быть массивом. Вам нужно только по одному, String не так ли?

Каждому параметру в определении метода нужен тип:

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

но мне интересно, почему вы передаете все три числа, когда вы проверяете только одно за раз. И вы хотите вернуть, если число истинно или нет, поэтому возвращаемое значение должно быть логическим:

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

Кроме того, если пользователь вводит «abc», вы получите исключение из метода «Intger.pareInt (String)». Возможно, вы хотите сохранить введенный текст как строку и передать его в validNumCheck, попробуйте преобразовать его и проверить, находится ли он в диапазоне от 0 до 200.

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

РЕДАКТИРОВАТЬ 1: для трех попыток вам понадобится цикл, который выполняется до тех пор, пока число не станет действительным или не будут выполнены три попытки. Просто посчитайте попытки в int.

Кстати, вы уверены, что вам нужно использовать JOptionPane и JMessageDialog? Это графический интерфейс, который только усложняет эту дыру. Вы также можете читать и записывать текст в консоль, используя System.out и System.in.

РЕДАКТИРОВАТЬ 2: Еще один совет: когда вы создаете массив int с заданной длиной, каждое место в массиве заполняется 0, поэтому вы можете написать:

int[] count= new int [3];

и не нужно этого:

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

И если вы хотите использовать значения, отличные от 0, вы можете использовать более короткую форму, например:

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

РЕДАКТИРОВАТЬ 3: Одна вещь, которую вы должны сделать / изучить, заключается в следующем: не пишите все это и в конечном итоге получите много ошибок и неработающую программу. Немного кодируйте, немного тестируйте . Сделайте одну часть этого, посмотрите, как это работает, и вы будете счастливы.

Эта штука когда-нибудь запускалась? Я имею в виду, вы уже видели, что JOptionPane-InputDialog вы пытаетесь использовать? Если нет, сделайте сначала только это: (и запустите!)

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");
        }
    }
}

Есть, чтобы запустить? Большой! Теперь попробуйте обернуть эту строку JOptionPane в цикл, который выполняется до тех пор, пока пользователь не введет действительное число (используя метод checkValidNum, который у вас уже есть) или не использует свои три попытки.

Когда вы считаете (в реальной жизни), вам не нужно хранить числа в коробках, вам просто нужно изменить значение счета и установить предел.

Например, вы можете заменить это:

        int[] count= new int[2];

С этим:

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

Вы не можете присвоить массив целых чисел массиву строк.

       String[] getNumber= new int [2];

Использование массива строк может работать, но вам нужно назначить массив строк

       String[] numbers = new String[2];

Или вы можете использовать и массив int:

       int [] numbers = new int [2]; 

Выбери один.

Помните, что массивы похожи на коробки, в которых вы можете хранить значения.