所以问题是: 编写一个程序,读取一系列输入值,并使用星号显示值的条形图。您可以假设所有值都是正数。首先找出最大值。该值的条形应该用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的星星,而不是其余的。基本上它会打印星形值,直到最大数字。
我无法找到我的代码有什么问题。任何帮助将不胜感激!
感谢阅读&lt; 3
答案 0 :(得分:6)
首先,你不需要count
变量 - 它对你没有任何帮助,你出于某种原因限制自己(每当你找到一个更大的元素时你就增加,所以你只增加一次,因为没什么大于8)。
你应该做的是找到最大值,就像你一样,然后在整个数组上运行并显示与该值成比例的每个元素,就像你做的那样(但没有实际最大值的特殊情况 - 那个是残暴的。)
另外,你应该注意两个整数的除法会产生integer
,这不是你想要的,所以你必须将其中一个强制转换为float
或{{1 }}
double
所以你会发现最大的值是8。
然后对于5,你将做5/8,这是0.625,而//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();
}
(40)将是25,所以你将打印25 MAX
。
然后是8 - *
所以你打印整个40 8/8 = 1.0 * MAX = 40
。
对于6 - *
,您将打印30 6/8 = 0.75 * MAX = 30
,依此类推。
请注意,如果要对其进行微调,可以使用*
而不是简单地将Math.round
强制转换为int(这只是截断浮点数)。