このコードにより「式の不正な開始」例外が発生するのはなぜですか?
-
06-09-2019 - |
質問
これらは私の質問です:
私は行にいくつかのエラーを取得します。予想 "、および" ')' queeds "。
各番号に対して合計 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;
}
}
}
解決
問題の疑似コードまたはアルゴリズムを作成することが重要だと思います 初め そしてそれが機能する場合はプログラミングに対処します 後で. 。そうしないと、2 つのことを同時に解決することになります 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
したがって、数値「a」を検証できる段階まで到達しましたが、「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 は変更されません。
その do コードから渡すことは、どういうわけか簡単になります。なぜなら、あなたは何をしたいのか (分析)、そしてどのようにしたいのか (設計) をすでに理解しているからです。
もちろん、これは経験があればもっと簡単になります。
まとめ
問題を読んで理解してください (もちろん)。
考えられる「関数」と変数を特定します。
どのように実行するかを段階的に書きます (アルゴリズム)
それをコードに変換し、実行できないことがあれば、それを実行する関数を作成して、作業を続けます。
他のヒント
このスレッド 役立つかもしれません。これらは「問題の記述」から「実際のコーディング」につなげるためのヒントです。
あなたの具体的な質問に従って:
ユーザーに各番号に有効な番号を入力する機会を 3 回与えるにはどうすればよいですか?(「答え」はアイデアやヒントだけでいいのではありません。
実生活であなたが(物覚えの悪い)レジ係だったらどうしますか?つまり、記憶力が非常に悪く、顧客を断ったのが初めてなのか二度目なのか思い出せないほどですか?
私はそれを紙に書き留め、顧客を拒否するたびに「|」を追加します。
"| | |"
紙に3行書いてあったら警察に通報します。..:)
それはここでも似ています。いくつか持っていない場合は、 もの そうかもしれない 変化する あなたは無限の中に入るでしょう ループ ;)
validNumCheck は値を返し、その後 void メイン メソッドで終了することを想定しています
いいえ
...それとも、その main メソッドでプログラムを終了するだけでよいでしょうか?
はい。
(実際には) 数を数えるとき、ボックスに数値を保存する必要はありません。数の値を変更して制限を設定するだけで済みます。
たとえば、これを次のように置き換えることができます。
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];
一つを選ぶ。
配列は値を保存できるボックスのようなものであることを覚えておいてください。
の中に メソッドのシグネチャ (それは「」でしょうpublic static int validNumCheck(num1,num2,num3)
")、の型を宣言する必要があります。 仮パラメータ. "public static int validNumCheck(int num1, int num2, int num3)
" うまくいくはずです。
ただし、より良いデザインは、 validNumCheck
パラメータを 1 つだけ取り、それを 3 つの数値のそれぞれで呼び出します。
(更新されたコードを見て) 私の次の提案は、適切な IDE を入手することです。NetBeans にロードしたところ、多数のエラーが見つかりました。特に「表現の不正開始」は、 }
while ループ内で、IDE はすぐにフラグを立てます。「Hello world」を越えると、メモ帳ではもう役に立たなくなります。
すべてのエラーの修正点をリストするつもりはありませんが、次の点に留意してください。 int[]
, int
, String[]
, 、 そして String
はすべて異なります。これらを同じ意味で使用しているようです (おそらく、コードに加えた変更の量が原因です)。繰り返しますが、IDE はこれらすべての問題にフラグを立てます。
最新のコード (リビジョン 12) への応答:どんどん近づいてきていますね。使っていたようです MAX_TRIES
2 つの異なる目的のため:入力する 3 つの数字と、各数字に対する 3 つのチャンス。これら 2 つの数値は同じですが、両方に同じ定数を使用しない方がよいでしょう。 NUM_INPUTS
そして MAX_TRIES
それらを私はそう呼んでいます。
そしてあなたはまだ不足しているものを追加していません }
while ループ。
それらを修正した後に次に行うことは、次のことを確認することです。 if (getNumber == false)
.
getNumber
です String[]
, したがって、この比較は違法です。戻り値が得られるはずです validNumCheck
次のような変数に代入します。
boolean isValidNum = validNumCheck(getNumber[0]);
また、理由はありませんが、 getNumber
配列になる。必要なのは 1 つだけです String
一度にですよね?
メソッド定義のすべてのパラメータには型が必要です。
public static int validNumCheck(int num1, int num2, int num3){
しかし、一度に 1 つの数字しかチェックしないのに、なぜ 3 つの数字すべてを渡すのか不思議です。そして、数値が true かどうかを返したいので、戻り値はブール値である必要があります。
public static boolean validNumCheck(int num){
// test and return true or false
また、ユーザーが「abc」と入力すると、「Intger.pareInt(String)」メソッドから例外が発生します。おそらく、入力されたテキストを 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:3 回の試行には、番号が有効になるか、3 回の試行が行われるまで実行するループが必要です。in int を使用して試行回数をカウントするだけです。
ところで、JOptionPane と JMessageDialog を使用する必要がありますか?これは GUI の問題であり、問題を複雑にするだけです。System.out と System.in を使用して、コンソールにテキストを読み書きすることもできます。
編集2:もう 1 つのヒントとして、指定した長さの int 配列を作成すると、配列内のすべての場所が 0 で埋められるため、次のように書くことができます。
int[] count= new int [3];
そしてそれは必要ありません:
count[0]=0;
count[1]=0;
count[2]=0;
0 以外の値を使用したい場合は、次のような短い形式を使用できます。
int[] count = {1, 5, 2}
編集3:あなたがすべき/学ばなければならないことの1つはこれです:すべてを書かないと、多くのエラーが発生し、プログラムが実行されなくなります。 少しコードを書いて、少しテストしてください. 。その一部を実行して、それが実行されるのを確認すれば満足です。
これって走ったことあるの?つまり、使用しようとしている 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 メソッドを使用)、3 回試行するまで実行されます。