所以问题是:编写一个程序,用于读取输入值序列并使用星号显示值的条形图。您可以假设所有值都是正数。首先计算出最大值。该值的条形图应绘制 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
,这不是您想要的,因此您必须将其中一个转换为 float
或 double
。
//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(这只会截断浮点数)。