2015-11-07 176 views
1

这个程序本质上是一个游戏,用户必须输入数字来查看哪些数字是好的:偶数个偶数的数字,奇数奇数数字。爪哇,偶数偶数,奇数奇数

因此,首先,程序结束时,我输入一个数字,这不是故意的。我认为这与这段时间有关(n > 0)。 if(numEven % 2 == 0 ......)也可能存在问题,因为打印结果看起来几乎是随机的,数字很好,而且有时候这个数字不太好。

老实说,我迷失在这一点上。提前感谢您的帮助。

UPDATE:此代码正在运行,我希望如此,我只想感谢所有帮助过的人!这是我的计算机科学课的第一学期,所以我还是比较新的,在此......原谅我的错误,很可能非常愚蠢的:)

package quackygame; 
import java.util.Scanner; 
public class QuackyGame 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Welcome to the Number Game!" 
       + " Try to figure out the pattern " 
       + "in the numbers that Wallace likes!"); 

     Scanner scan = new Scanner (System.in); 
     int n; 
     int numEven = 0; 
     int numOdd = 0; 
     boolean isEven; 

     do 
     { 
      System.out.print("Enter a number > 0: "); 
      n = scan.nextInt(); 
      while (n > 0) 
      { 
       if (n % 2 == 0) 
       { 
        //n is even 
        isEven = true; 
        numEven++; 
       } 
       else 
       { 
        //n is odd 
        isEven = false; 
        numOdd++; 
       } 
       n /= 10; 
      } 
      //if numEven is even and numOdd is odd 
      if (numEven % 2 == 0 && numOdd % 2 == 1) 
       System.out.println("Wallace liked your number!"); 
      else 
      { 
       System.out.println("Wallace didn't like your number."); 
      } 
      numEven = 0; 
      numOdd = 0; 

     } 

     while (n >= 0); 
    } 

} 
+0

如果您的要求是“程序在输入1位数字时结束”,那么为什么条件是'n> 0'?它应该是正确的? – Rehman

+0

检查'n = 10;' – Sekula1991

+0

如果您想确保人们知道您的问题已得到解答,请接受当前答案之一或自己做出答案并接受。这将添加一个绿色的复选标记,以便人们看到你满意,解决了你的问题。您可以通过点击答案旁边的复选标记来接受答案。 –

回答

1

根据您所描述的预期结果,代码中存在一些核心问题。我看到的最明显的问题是,你打算在每轮开始时基本上“从头开始”,但是你从来没有真正重置numEven和numOdd变量。这是您随机显示结果的来源。例如,如果你开始游戏,输入数字:

游戏将处理的数量,并说,这是一个良好的数字,因为它是奇数,有奇数个奇数位数字(3 ),偶数个偶数(2)。然而,在一次玩游戏,就没有设置变量执行相同的代码回0,这意味着在进入:

游戏将处理这个数字是一个坏的数字,因为奇数的累计值将是6而不是3(因为第一次是3 +第二次结果是6),并且6是偶数。因此,我们希望做的是这样的:

... 

int n; 

do 
{ 
    int numEven = 0; 
    int numOdd = 0; 

    System.out.print("Enter a number: "); 
    n = scan.nextInt(); 

... 

通过将numEven和numOdd声明的“做”块内,他们是局部变量只存在了做块的持续时间。我们还可以做这么简单的东西:

... 

    else 
    { 
     System.out.println("Wallace didn't like your number."); 
    } 
    numEven = 0; 
    numOdd = 0; 
} 
while (n > 0); 

... 

只是重置价值将帮助我们跟踪numOdd和numEven的实际预期值更一致。

关于输入单个数字时关闭的程序,我不确定。这是没有意义的,因为,因为它是一个do-while循环应该在至少执行一次,并发出打印语句之一。我现在将这段代码加载到我的IDE中,以便让它通过。如果我找到了某些东西,我会更新我的答案。

-EDIT-:在再次阅读您的问题时,似乎您可能不会建议程序在实际完成其任何功能之前关闭,而只是简单地关闭它。程序关闭的原因是你正在执行一个整数除法算术函数,你可能想要使用不同类型的数字。让我来解释:

在正常的人类计数,我们有天然的一套没有小数点的数字。他们通常这样开始:

1,2,3,4,5 ...

然后我们有一组独立的,我们更精确地操作的数学数字:

0.5,1.4232 ,3.142 ...

当我们谈论与正常的人类语言的数字,我们假设1除以2结果0.5。但是,计算机不会隐式知道这一点。为了使计算机从1除以2得出结论“0.5”,你需要明确地告诉它它应该使用某种类型的数字来产生该输出。

前面引用的“正常”数字与编程中的整数最为松散。它基本上是一个没有小数点的数字。这也就意味着,只要你把两个整数在一起,你总是另一个整数作为结果。因此,如果您要将1除以2,则计算机不会将结果解释为0.5,因为该数字有小数。相反,它会四舍五入下来到最接近的整数,在这种情况下是0

因此,对于更具体的例子引用手头的实际问题,让我们说,我们输入数字5到我们的节目。它经历了所有的赔率和平衡计算,但最终得到这一行:

n /= 10 

这是事情变得时髦的地方。我们将两个整数分开,但其结果并不是一个完美的整数。在这种情况下,5/10的结果也是0.5。 但对于计算机,因为我们将两个整数,结果0.5是不会做的,所以四舍五入到最接近的整数后,我们得到0。此时,有一个致命的错误:

(while n > 0); 

当我们进行这样的检查,我们得到和while循环结束。为什么?因为在执行n/= 10之后,n变为0.并且0是而不是大于0.

我们该如何解决这个问题?最好的做法可能只是使用浮点数来执行计算。在Java中,这很简单。我们真正需要做的是:

n /= 10.0 

一旦Java看到我们被除以10.0,这是不是一个整数,它会自动“N”转换为浮点数10.0分。那么在这种情况下,如果n是5,我们除以10.0得到的结果将是0.5。然后,当我们运行时:

(while n > 0); 

这成为事实!循环不会中断。

我打算将所有这些更改放到我的IDE中,以确认所有内容都按照我的意图工作。我建议你试一试,看看它是否能解决你的问题。

希望这会有所帮助。

+0

我实际上打算使用n/= 10而不是n/= 10.0,因为我正在执行该操作以摆脱数字的最后一位以检查下一个数字是偶数还是奇数。它除以10,将最后一位数字作为小数保留,并且小数点会被整数斩掉。所以,我有numEven和numOdd重置为零后,像你说的else语句,现在我的程序是说,偶数是坏的,奇数是好的...再次不是我所希望的。如果你想确保你正在执行正确的条件检查,请使用括号:(((numEven%2 == 0 && numOdd%2 == 1) – mjamev10

+0

@ mjamev10) %2)== 0)&&((numOdd%2)== 1))我的例子有点矫枉过正,但你明白了。至于/ = 10操作,只需添加一个单独的条件,当n已经小于10时,只执行n/= 10.0:if(n <10)n /=10.0 else if(n> = 10)n/= 10. –

+0

好吧,我现在已经按计划运行了代码; if语句实际上是可以的,n/= 10也是我想要的。谢谢您的帮助!这是我第一个学习计算机科学的学期,所以我在这方面还很新颖:) – mjamev10

0

您正在增加numEven或numOdd每次算你输入编号,然后你使用if (numEven % 2 == 0 && numOdd % 2 == 1),这是随机的,因为如果你第一次把数字33 => numOdd = 1; => true =>“华莱士喜欢”,但下一次第二次放置33 => numOdd = 2; => false =>“华莱士不喜欢”。

编辑*也许你想要这样的事情?

public static void main(String[] args) 
{ 
     System.out.println("Welcome to the Number Game!" 
       + " Try to figure out the pattern " 
       + "in the numbers that Wallace likes!"); 

     Scanner scan = new Scanner (System.in); 
     int n; 
     boolean isEven; 

     do 
     { 
      System.out.print("Enter a number: "); 
      n = scan.nextInt(); 

      //if 0, you leave the loop 
      if(n==0) { 
       System.out.println("You pressed 0, have a nice day"); 
       break; 
      } 
      if (n % 2 == 0) 
      { 
       //it is even 
       isEven = true; 
      } 

      else 
      { 
       //it is not even 
       isEven = false; 
      } 


      //if even then he likes it, otherwise he does not 
      if (isEven) 
       System.out.println("Wallace liked your number!"); 
      else 
      { 
       System.out.println("Wallace didn't like your number."); 
      } 

     } 
     //put any contition here, lets say if you press 0 , you leave the loop 
     while (n != 0); 
    }