对于打印多个值的循环麻烦



所以问题是:编写一个程序,用于读取输入值序列并使用星号显示值的条形图。您可以假设所有值都是正数。首先计算出最大值。该值的条形图应绘制 40 个星号。较短的条形应按比例使用较少的星号。例如。

***********************
*********
****************************************
****
*******************

这是我下面的代码:

    int count = 0;
    //Finds largest Value
    int largestValue = numbersArray[0];
    for (int i = 1; i < numbersArray.length; i++) {
        if (numbersArray[i] > largestValue) {
            largestValue = numbersArray[i];
            count++;
        }
    }
    //Prints number of asterisks
    final int MAX = 40;
    String asterisks = "****************************************";
    for (int i = 0; i < count + 2; i++) {
        System.out.print(numbersArray[i]);
        if (numbersArray[i] == largestValue) {
            System.out.print(asterisks);
        } //if (numbersArray[i] != largestValue) {
        else {
            for (int j = 0; j < (40 * numbersArray[i] / largestValue); j++) {
                System.out.print("*");
            }
        }
        System.out.println();
  }

这段代码似乎无法正常运行。如果我按顺序输入值:5 8 6 4 7,它只会打印 5 和 8 的星星,而不是其余的。基本上,它会打印值的星星,直到最大数字。

我找不到我的代码有什么问题。任何帮助将不胜感激!

感谢您阅读<3

首先,你不需要count变量 - 它对你没有任何帮助,并且你出于某种原因限制了自己(每次找到更大的元素时你都会递增,所以你只递增一次,因为没有大于 8 的东西)。

你应该做的是找到最大值,就像你所做的那样

,然后运行整个数组并显示与该值成比例的每个元素,就像你所做的那样(但没有实际最大值的特殊情况 - 这是残酷的)。

另外,您应该注意,两个整数的除法会导致 integer ,这不是您想要的,因此您必须将其中一个转换为 floatdouble

//finds largest Value
int largestValue = numbersArray[0];
for (int i = 1; i < numbersArray.length; i++) {
    if (numbersArray[i] > largestValue) {
        largestValue = numbersArray[i];
    }
}
//Prints number of asterisks
final int MAX = 40;
for (int i = 0; i < numbersArray.length; i++) {
    int portion = (int)(MAX * (numbersArray[i] / (float)largestValue));
    for (int j = 0; j < portion; j++) {
        System.out.print("*");
    }
    System.out.println();
}

所以你会发现最大值是 8。

然后对于 5,您将执行 5/8,即 0.625,乘以 MAX (40) 即 25,因此您将打印 25 *

然后对于 8 - 8/8 = 1.0 * MAX = 40,您将打印整个 40 *.

对于 6 - 6/8 = 0.75 * MAX = 30,您将打印 30 *,依此类推。

请注意,如果要对其进行微调,可以使用Math.round而不是简单地将portion转换为 int(这只会截断浮点数)。

最新更新