Почему этот код вызывает исключение «недопустимое начало выражения»?
Вот мои вопросы:
Я получаю пару ошибок в строке «public static boolean validNumCheck (String num) {» - «недопустимое начало выражения», «';' ожидается ", и" ')' ожидается ".
Как я могу дать пользователю всего 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)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 не меняется.
Переход от этого кода будет каким-то простым. Потому что вы уже понимаете, что вы хотите делать (анализ) и как вы хотите это делать (дизайн).
Конечно, с опытом будет легче.
Резюме
Эти шаги для перехода от задачи к коде :
Прочтите проблему и поймите ее (конечно).
Определите возможные «функции» и переменные.
Напишите, как бы я это сделал пошагово (алгоритм)
Переведите это в код, если есть что-то, что вы не можете сделать, создайте функцию, которая сделает это за вас, и продолжайте двигаться.
Эта ветка может быть полезна. Это подсказки для перехода от «описания проблемы» к «фактическому кодированию».
По вашим конкретным вопросам:
Как я могу дать пользователю три возможности ввести действительный номер для КАЖДОГО числа? (Мне не нужен «ответ», просто некоторые идеи / подсказки.
Как бы вы это сделали, если бы в реальной жизни были кассиром (с плохой памятью)? И я имею в виду очень-очень плохую память, так много, что вы не можете вспомнить, отклоняете ли вы клиента в первый раз или во второй?
Я записывал это на листе бумаги и каждый раз, когда отвергал клиента, я добавлял "|"
"| | |"
Когда в газете будет три строчки, я позвоню в полицию. .. :)
Здесь то же самое. Если у вас нет чего- то , что может отличаться, вы попадете в бесконечный цикл ;)
Является 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];
Выбери один.
Помните, что массивы похожи на коробки, в которых вы можете хранить значения.