I've just started studying and I need help on one of my exercises.
I need the end user to input a rain fall number for each month. I then need to out put the average rainfall, highest month and lowest month and the months which rainfall was above average.
I keep getting the same number in the highest and lowest and I have no idea why. I am seriously pulling my hair out. Any help would be greatly appreciated.
This is what I have so far:
public class rainfall {
/**
* @param args
*/
public static void main(String[] args)
{
int[] numgroup;
numgroup = new int [13];
ConsoleReader console = new ConsoleReader();
int highest;
int lowest;
int index;
int tempVal;
int minMonth;
int minIndex;
int maxMonth;
int maxIndex;
System.out.println("Welcome to Rainfall");
for(index = 1; index < 13; index = index + 1)
{
System.out.println("Please enter the rainfall for month " + index);
tempVal = console.readInt();
while (tempVal>100 || tempVal<0)
{
System.out.println("The rating must be within 0...100. Try again");
tempVal = console.readInt();
}
numgroup[index] = tempVal;
}
lowest = numgroup[0];
for(minIndex = 0; minIndex < numgroup.length; minIndex = minIndex + 1);
{
if (numgroup[0] < lowest)
{
lowest = numgroup[0];
minMonth = minIndex;
}
}
highest = numgroup[1];
for(maxIndex = 0; maxIndex < numgroup.length; maxIndex = maxIndex + 1);
{
if (numgroup[1] > highest)
{
highest = numgroup[1];
maxMonth = maxIndex;
}
}
System.out.println("The average monthly rainfall was ");
System.out.println("The lowest monthly rainfall was month " + minIndex);
System.out.println("The highest monthly rainfall was month " + maxIndex);
System.out.println("Thank you for using Rainfall");
}
private static ConsoleReader ConsoleReader() {
return null;
}
}
Thanks,
Emily
First, since this is your homework, you should not be asking it on stackoverflow.com
Now let have a look at your code
lowest = numgroup[0];
Why? It seems that you trying to use this algorithm to find min:
1.1 Suppose first number (which you think is
numgroup[0]
) is min (named aslowest
in your code)
1.2. Compare it with all other numbers, if any of the numbers is smaller, replace min (ielowest
).
But, numgroup[0]
is not your first number! You started your first for loop like this
for(index = 1;...
So, your first number is numgroup[1]
.
Next, your second loop starts like
for(minIndex = 0;
whereas the element at index 0 is never even intended to be used by you (I guess)
Next, your condition for finding out if the number in current iteration is less than lowest
is
if (numgroup[0] < lowest)
which always compares element at index 0 with lowest
which (I guess) is not your intention.
instead of
if (numgroup[0] < lowest)
you have to write
if (numgroup[minIndex] < lowest)
the same goes for
if (numgroup[1] > highest)
which should be
if (numgroup[maxIndex] > highest)
You do
lowest = numgroup[0]
and then
if (numgroup[0] < lowest)
which will never be "true" as numgroup[0] is always equal to lowest. Rather your if-clause should be something like if (numgroup[minIndex] < lowest)
. The same thing applies for highest.
public static void main(String[] args)
{
int[] numgroup = new int [12]; // 12 months - 12 elements
ConsoleReader console = new ConsoleReader();
int highest;
int lowest;
int index;
int tempVal;
int minIndex;
int maxIndex;
System.out.println("Welcome to Rainfall");
// Input (index now 0-based)
for(index = 0; index < 12; index = index + 1)
{
System.out.println("Please enter the rainfall for month " + index + 1);
tempVal = console.readInt();
while (tempVal>100 || tempVal<0)
{
System.out.println("The rating must be within 0...100. Try again");
tempVal = console.readInt();
}
numgroup[index] = tempVal;
}
lowest = numgroup[0];
highest = numgroup[0];
int total = 0.0;
// Loop over data (using 1 loop)
for(index = 0; index < 12; index = index + 1)
{
int curr = numgroup[index];
if (curr < lowest) {
lowest = curr;
minIndex = index;
}
if (curr > highest) {
highest = curr;
maxIndex = index;
}
total += curr;
}
float avg = (float)total / numgroup.length;
System.out.println("The average monthly rainfall was " + agv);
// +1 to go from 0-based index to 1-based month
System.out.println("The lowest monthly rainfall was month " + minIndex + 1);
System.out.println("The highest monthly rainfall was month " + maxIndex + 1);
System.out.println("Thank you for using Rainfall");
}
Just try to use collections for min/max if there is no restriction in your homework.
Vector<Integer> rainfallData = new Vector<Integer>();
int avg = 0;
for(index = 1; index < 13; index = index + 1)
{
System.out.println("Please enter the rainfall for month " + index);
tempVal = console.readInt();
while (tempVal>100 || tempVal<0)
{
System.out.println("The rating must be within 0...100. Try again");
tempVal = console.readInt();
}
rainfallData.add(tempVal);
avg+=tempVal;
}
avg /= rainfallData.size();
int min = Collections.min(rainfallData);
int max = Collections.max(rainfallData);
Otherwise a min/max should look like this:
public int min(int[] vals) {
if( vals==null || vals.length==0} {
throw new IllegalArgumentException();
} else if( vals.length == 1 ) {
return vals[0];
}
int min = vals[0]; // Dont initialize with Integer.MAX_VALUE or so
for(int i = 1; i < vals.length; ++i ) {
if( vals[i] < min ) {
min = vals[i];
}
}
return min;
}
for (index = 0; index < 12; index++) {
}
change the first for loop and the following
lowest = numgroup[0];
for (minIndex = 0; minIndex < numgroup.length; minIndex = minIndex + 1)
{
if (numgroup[minIndex] < lowest) {
lowest = numgroup[minIndex];
}
}
highest = numgroup[0];
for (maxIndex = 0; maxIndex < numgroup.length; maxIndex = maxIndex + 1)
{
if (numgroup[maxIndex] > highest) {
highest = numgroup[maxIndex];
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.