1

这些是我的问题:

  1. 我在 "public static boolean validNumCheck(String num){" - "illegal start of expression", "';' 预期”和“')'预期”。

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

5 回答 5

3

我认为首先创建问题的伪代码或算法很重要,然后如果它有效,则稍后处理编程。否则,您将同时解决两件事 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 代码中传递会很简单。因为你已经明白了你想做什么(分析),以及你想怎么做(设计)。

当然,如果有经验,这会更容易。

概括

从问题传递到代码的步骤是:

  1. 阅读问题并理解它(当然)。

  2. 识别可能的“功能”和变量。

  3. 写下我将如何一步一步做(算法)

  4. 把它翻译成代码,如果有什么你不能做的,创建一个为你做的函数并继续前进。

于 2009-02-25T20:39:58.367 回答
2

方法签名(即“ 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[]intString[]String都是不同的。您似乎可以互换使用它们(可能是由于您对代码所做的更改量)。同样,IDE 会标记所有这些问题。


响应您的最新代码(修订版 12):您越来越近了。您似乎使用MAX_TRIES了两个不同的目的:输入三个数字,以及每个数字的三个机会。虽然这两个数字相同,但最好不要对两者使用相同的常数。NUM_INPUTS并且MAX_TRIES是我所说的。

而且您还没有}为 while 循环添加缺失的内容。

修复这些之后要做的下一件事就是查看if (getNumber == false). getNumber是 a String[],所以这种比较是非法的。您应该将 的返回值validNumCheck放入变量中,例如:

boolean isValidNum = validNumCheck(getNumber[0]);

而且,没有理由getNumber成为一个数组。你一次只需要一个String,对吧?

于 2009-02-25T18:46:05.753 回答
2

方法定义中的每个参数都需要一个类型:

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 方法)或使用他的三次尝试。

于 2009-02-25T18:49:33.483 回答
2

该线程可能会有所帮助。这些是从“问题描述”到“实际编码”的提示

根据您的具体问题:

如何让用户有三次机会为每个号码输入有效号码?(我不想要“答案”只是一些想法/提示。

如果你是现实生活中的收银员(记性不好),你会怎么做?我的意思是非常非常糟糕的记忆力,以至于你不记得你是第一次还是第二次拒绝客户?

我会把它写在一张纸上,每次我拒绝客户时,我都会添加一个“|”

“|||”

当纸上有三行时,我会报警。.. :)

这里也是类似的。如果您没有一些可能会有所不同的东西, 您将陷入无限循环;)

validNumCheck 是否假设返回一个值,然后在 void main 方法中退出

...或者我可以让它在那个主要方法中退出程序吗?

是的。

于 2009-02-25T19:08:29.660 回答
2

当您计数(在现实生活中)时,您不需要将数字存储在盒子中,您只需更改计数的值并设置限制。

例如,您可以替换它:

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

选一个。

请记住,数组就像可以存储值的盒子。

于 2009-02-25T19:54:23.077 回答