Почему этот код вызывает исключение «незаконное начало выражения»? - PullRequest
1 голос
/ 25 февраля 2009

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

  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 ]

3 голосов
/ 25 февраля 2009

Я думаю, важно создать псевдокод или алгоритм задачи сначала , а затем, если он работает, заниматься программированием , позже . В противном случае вы решите две вещи одновременно: 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» и «с»

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

Итак, новый псевдокод будет выглядеть так:

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. Переведите это в код, если есть что-то, что вы не можете сделать, создайте функцию, которая сделает это за вас, и продолжайте двигаться.

2 голосов
/ 25 февраля 2009

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

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

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

Выберите один.

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

2 голосов
/ 25 февраля 2009

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

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? Это GUI материал и только усложняет эту дыру. Вы также можете читать и записывать текст в консоли, используя 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, который вы уже получили) или не использует свои три попытки.

2 голосов
/ 25 февраля 2009

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

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

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

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

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

"| | |"

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

Это похоже здесь. Если у вас нет вещи , которая может варьироваться , вы получите бесконечный цикл ;)

Допустим, validNumCheck возвращает значение И ПОТОМ завершается в методе void main

нет

Нет

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

Да.

2 голосов
/ 25 февраля 2009

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

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


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

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


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

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

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

boolean isValidNum = validNumCheck(getNumber[0]);

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

...