【问题标题】:Having issues with generating 1 to 300 numbers between 1 to 100 and placing each number in a String在生成 1 到 100 之间的 1 到 300 个数字并将每个数字放在字符串中时遇到问题
【发布时间】:2015-01-10 13:33:14
【问题描述】:

我试图从用户那里接受一个 1 到 300 范围内的数字,然后生成输入的随机数的数量。然后,如果生成的数字在 1 到 10 的范围内,我在字符串中添加一个星号,然后我对 11 到 20 等执行相同操作,一直到 100。尽管我不断收到错误说“;预期”在我的代码的结果部分。我想要实现的输出是:

1 到 10 ****************

11 到 20 ******

21 到 30 ***************

31 到 40 ********************

41 到 50

51 到 60 ***********

61 到 70 ****************

71 到 80 ****

81 到 90 *******

91 到 100 **

上面的星号加起来可能不等于 100,但我试图在输出中显示 100 个星号,每个星号代表 __ 到 __ 范围内的随机生成数。

我的代码如下。

import java.util.*;
public class histogramAsterisks
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Please enter a number between the range 1 to 300: ");
        int input = Integer.parseInt(in.nextLine());
        int aNumber;
        String 1to10 = "", 11to20 = "", 21to30= "", 31to40 = "", 41to50 = ""; 51to50 = ""; 61to70 = ""; 71to80 = ""; 81to90 = ""; 91to100 = "", results = "";
        if(input < 1 || input > 300 || input == null)
            results = "Please enter a valid input in the range 1 to 300.";
        else
        {
            for(int i = 0; i < input; i++)
            {
                aNumber = (int) (Math.random() * 100 + 1);
                if(aNumber <= 10)               1to10   += "*";
                else if(aNumber <= 20)          11to20  += "*";
                else if(aNumber <= 30)          21to30  += "*";
                else if(aNumber <= 40)          31to40  += "*";
                else if(aNumber <= 50)          41to50  += "*";
                else if(aNumber <= 60)          51to60  += "*";
                else if(aNumber <= 70)          61to70  += "*";
                else if(aNumber <= 80)          71to80  += "*";
                else if(aNumber <= 90)          81to90  += "*";
                else                            91to100 += "*";
            }
        }
        results  = "1 to 10\t\t\t" + 1to10;
        results += "\n11 to 20\t\t\t" + 11to20;
        results += "\n21 to 30\t\t\t" + 21to30;
        results += "\n31 to 40\t\t\t" + 31to40;
        results += "\n41 to 50\t\t\t" + 41to50;
        results += "\n51 to 60\t\t\t" + 51to60;
        results += "\n61 to 70\t\t\t" + 61to70;
        results += "\n71 to 80\t\t\t" + 71to80;
        results += "\n81 to 90\t\t\t" + 81to90;
        results += "\n91 to 100\t\t\t" + 91to100;
        System.out.println(results);
    }
}

【问题讨论】:

  • 如果您的范围是从 1 到 100000 而不是 1 到 100,您会使用 1to10、11to20、...、99991 到 100000 吗?想想你如何在这个问题中使用数组,这样你就不需要为if else

标签: java loops if-statement random output


【解决方案1】:

“;预期”是由您声明“XtoY”字符串的行引起的:

String 1to10 = "", 11to20 = "", 21to30= "", 31to40 = "", 41to50 = ""; 51to50 = ""; 61to70 = ""; 71to80 = ""; 81to90 = ""; 91to100 = "", results = "";

出现两个问题:

  • 如其他答案所述,变量名称可能不以数字 (0-9) 开头。您可以以下划线开头,但不鼓励,或者将其更改为其他名称。
  • 始终使用逗号分隔多个变量声明。在上面的行中,一些变量已经用分号(;)分隔

您的程序有很大的改进空间。我建议你也看看以下链接:

Scanner.nextInt() - 从流中读取整数的方法。

StringBuilder - 更适合多个字符串连接的类。

希望对你有所帮助;)

【讨论】:

    【解决方案2】:

    https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html 所述,变量名必须:

    变量的名称可以是任何合法标识符 — 长度不限的 Unicode 字母和数字序列,以字母、美元符号“$”或下划线字符“_”开头。

    您正在尝试创建一堆以数字开头的变量,例如 1to10,它们是无效的。


    您可以通过使用数组来更轻松地解决这个问题。因此,使用您期望的结果的“桶”创建一个数组,并将结果放入其中。我已经编辑了您的代码并将其插入下面以进行演示。目前你得到的是一个数字而不是星号,但是一旦你理解了代码,你就可以很容易地改变它。

    import java.util.*;
    public class histogramAsterisks
    {
        public static void main(String[] args)
        {
            Scanner in = new Scanner(System.in);
            System.out.print("Please enter a number between the range 1 to 300: ");
            int input = Integer.parseInt(in.nextLine());
            double aNumber;
            int[] results = new int[10];
            for ( int i = 0; i < 10; ++i) { results[i] = 0; }
            if (input < 1 || input > 300)
            {
                System.out.println("Please enter a valid input in the range 1 to 300.");
                return;
            }
            for(int i = 0; i < input; i++)
            {
               aNumber = (Math.random() * 100 + 1);
               int bucket = (int)(aNumber / 10);
               ++results[bucket];
            }
    
            for (int i = 0 ; i < 10; ++i)
            {
                System.out.println(i + "1 to " + i + "0\t\t\t" + results[i]);
            }
        }
    }
    

    输入 10,打印:

    Please enter a number between the range 1 to 300: 10
    01 to 00          2
    11 to 10          0
    21 to 20          1
    31 to 30          2
    41 to 40          2
    51 to 50          0
    61 to 60          2
    71 to 70          0
    81 to 80          0
    91 to 90          1
    

    【讨论】:

    • 最好也使用StringBuilder 而不是String
    【解决方案3】:

    在您的字符串声明代码中,您使用分号 (;) 而不是逗号 (,) 来分隔变量声明。更改为下一行。也请更改变量名。

    字符串 1to10 = "", 11to20 = "", 21to30 = "", 31to40 = "", 41to50 = "", 51to50 = "", 61to70 = "", 71to80 = "",81to90 = "", 91to100 = "", 结果 = "";

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多