Reputation: 334
These classes are meant to work together in order to produce an output like this: https://i.sstatic.net/FPYwn.png I have a logic error which is disallowing me to produce output and data for the variables which are shown and/or declared as 0's. I've been working desperately for hours trying to fix this error--to no avail. I would much appreciate if someone could shed any light on me as to how I may fix the issues within my code to produce the output I desire.
This is the class
/**
* This class instantiates car objects with ten private instance variables.
* It contains eight mutator methods to calculate mi/gal, distance (mi), gal/mi,
* total cost; minimum/maximum, total, and annual values for these variables within a car object.
* There are getter methods for each private instance variable.
*
* @author A. Mackey
* @version 01/02/14
*/
public class AnnualFuelUse
{
//private instance variables
private double gallonsUsed, pricePerGallon, totalCost,
minSpeed, maxSpeed,
minVariable, maxVariable, minMaxVariable,
galPerMi, miPerGal,
startingMiles, endingMiles, distance,
totalVariable[], totalValue;
//constructor with two parameters
AnnualFuelUse(int FillUpNumber, double eMiles, double sMiles, double galsUsed, double pricePerGal)
{
startingMiles = sMiles;
endingMiles = eMiles;
gallonsUsed = galsUsed;
pricePerGallon = pricePerGal;
}
//mutator method which calculates the distance drive
public void calcDistance()
{
distance = endingMiles - startingMiles;
}
//getter method to return the value of distance traveled by the object on one trip
public double getDistance()
{
return distance;
}
//mutator method which calculates gallons used per mile driven
public void calcMPG(double dist, double gallons)
{
miPerGal = dist / gallons;
}
//getter method to return the value of the miles per gallon of the object on one trip
public double getMPG()
{
return miPerGal;
}
//mutator method which calculates miles driven per gallons used
public void calcGPM(double gallons, double dist)
{
galPerMi = gallons / dist;
}
//getter method to return the value of the gallons per mile of the object on one trip
public double getGPM()
{
return galPerMi;
}
//mutator method which calculates total cost of filling up
public void totalCost()
{
totalCost = pricePerGallon * gallonsUsed;
}
//getter method to return the value of the total gasoline purchases on one trip
public double getTotalCost()
{
return totalCost;
}
//mutator method which calculates the minimum value of a given array
public void min(double minMaxVariable[])
{
minVariable = Double.MAX_VALUE;
for(int i = 0; i < minMaxVariable.length; i ++)
{
if((minMaxVariable[i]) < minVariable)
{
minVariable = minMaxVariable[i];
}
}
}
//getter method to return the minimum value of a given array
public double getMin()
{
return minVariable;
}
//mutator method which calculates the minimum value of a given array
public void max(double minMaxVariable[])
{
maxVariable = Double.MIN_VALUE;
for(int i = 0; i < minMaxVariable.length; i ++)
{
if((minMaxVariable[i]) > maxVariable)
{
maxVariable = minMaxVariable[i];
}
}
}
//getter method to return the minimum value of a given array
public double getMax()
{
return maxVariable;
}
//mutator method which calculates the total value of a given array
public void totalOf(double totalVariable[])
{
totalValue = 0;
for(double newValue : totalVariable)
{
totalValue += newValue;
}
}
//getter method to return the total value of a given array
public double getTotalOf()
{
return totalValue;
}
}
and its tester class
/**
* This class tests the AnnualFuelUse class.
*
* An array of car objects is created to hold some of the private instance variables.
*
* A for loop is used to call the variables' methods on each object.
* A second for loop is used to print an output header identifying the variables for the instance
* A third for loop is used to print the values of the instance variables for each object.
*
* @author A. Mackey
* @version 01/02/14
*/
public class AnnualFuelUseTester
{
//main method
public static void main(String[] args)
{
//declaring and initialising variables
String header = "Annual Gas Mileage Calculations",
headerLine = "===============================";
String[] headerInfo = { "Fill Up" , " Days" , " Start Miles" , " End Miles" , "Distance" , "Gallons" , " Price" , "Cost" , " Miles/Gal" , "Gal/Mile" };
int[] fillUpNumber = {1, 2, 3, 4},
daysSinceFill = {1, 4, 8, 13};
double[] startMiles = {24963, 25437, 25937, 26221},
endMiles = { 25437, 25937, 26221, 26794},
gallonsUsed = { 21.4, 21.2, 12.2, 23.7},
milesPerGallon = new double[startMiles.length],
gallonsPerMile = new double[startMiles.length],
pricePerGallon = {3.52, 3.45, 3.39, 3.41},
totalCost = new double[startMiles.length],
distance = new double[startMiles.length];
int minDistance,
maxDistance,
totalDistance,
annualDistance;
double minMPG, minCost,
maxMPG, maxCost,
totalGallonsUsed, totalCostSum,
annualGallonsUsed, annualCost, annualMPG;
//initialization of array of objects
AnnualFuelUse[] car = {new AnnualFuelUse(fillUpNumber[0], endMiles[0], startMiles[0], gallonsUsed[0], pricePerGallon[0]),
new AnnualFuelUse(fillUpNumber[1], endMiles[1], startMiles[1], gallonsUsed[1], pricePerGallon[1]),
new AnnualFuelUse(fillUpNumber[2], endMiles[2], startMiles[2], gallonsUsed[2], pricePerGallon[2]),
new AnnualFuelUse(fillUpNumber[3], endMiles[3], startMiles[3], gallonsUsed[3], pricePerGallon[3])};
//call methods
for(int index = 0; index < car.length; index++)
{
distance[index] = car[index].getDistance();
milesPerGallon[index] = car[index].getMPG();
gallonsPerMile[index] = car[index].getGPM();
totalCost[index] = car[index].getTotalCost();
}
//I desire to invoke the methods which relate to these particular variables in order to define them
minDistance = 0;
minMPG = 0;
minCost = 0;
maxDistance = 0;
maxMPG = 0;
maxCost = 0;
totalDistance = 0;
totalGallonsUsed = 0;
totalCostSum = 0;
annualDistance = 0;
annualGallonsUsed = 0;
annualCost = 0;
annualMPG = 0;
//print results
System.out.printf("%74s%n", header);
System.out.printf("%74s%n", headerLine);
for(String info : headerInfo)
{
System.out.print(info + "\t");
}
System.out.println("\n=========================================================================================================================");
for(int index = 0; index < car.length; index++)
{
System.out.printf("%4d%10d%14.0f%14.0f%12.0f%16.1f%11.2f%12.2f%12.2f%13.3f%n", fillUpNumber[index], daysSinceFill[index], startMiles[index], endMiles[index], distance[index], gallonsUsed[index], pricePerGallon[index], totalCost[index], milesPerGallon[index], gallonsPerMile[index]);
}
System.out.println("=========================================================================================================================\n");
System.out.printf("Minimum:%46d%27.2f%24.2f%n", minDistance, minMPG, minCost);
System.out.printf("Maximum:%46d%27.2f%24.2f%n%n", maxDistance, maxMPG, maxCost);
System.out.printf("Totals:%47d%16.1f%35.2f%n", totalDistance, totalGallonsUsed, totalCostSum);
System.out.printf("Annual Projection:%36d%16.1f%11.2f%24.2f%n", annualDistance, annualMPG, annualGallonsUsed, annualCost);
}
}
I appreciate the help, thank you.
EDIT (03:00 EST 1/3/2014)
pastebin.com/BRJunSvS and pastebin.com/kRRb0dmu Any idea why my MPG isn't the projected yearly average???
Upvotes: 0
Views: 559
Reputation: 1615
The fields for distance, cost, miles per gallon and gallons per mile have not been initialised because you haven't called any of the methods to calculate those values.
I don't think it makes much sense to store any values that are calculated based on other instance variables anyway. Why not just, say, calculate distance when calling getDistance()
and then return the calculated value? That way you'll have one less field to maintain.
Here's your class again, this time with a few instance variables and setters removed as well as some changed getters. I took the liberty of changing your min
, max
and totalOf
methods to static methods. I don't know if it's good practice but they don't seem to require access to instance-level variables or methods anyway.
public class AnnualFuelUse
{
//private instance variables
private double gallonsUsed, pricePerGallon, startingMiles, endingMiles;
//constructor with two parameters
AnnualFuelUse(int FillUpNumber, double eMiles, double sMiles, double galsUsed, double pricePerGal)
{
startingMiles = sMiles;
endingMiles = eMiles;
gallonsUsed = galsUsed;
pricePerGallon = pricePerGal;
}
//getter method to return the value of distance traveled by the object on one trip
public double getDistance()
{
return endingMiles - startingMiles;
}
//getter method to return the value of the miles per gallon of the object on one trip
public double getMPG()
{
return getDistance() / gallonsUsed;
}
//getter method to return the value of the gallons per mile of the object on one trip
public double getGPM()
{
return gallonsUsed / getDistance();
}
//getter method to return the value of the total gasoline purchases on one trip
public double getTotalCost()
{
return pricePerGallon * gallonsUsed;
}
//mutator method which calculates the minimum value of a given array
public static double min(double minMaxVariable[])
{
double minVariable = Double.MAX_VALUE;
for(int i = 0; i < minMaxVariable.length; i ++)
{
if((minMaxVariable[i]) < minVariable)
{
minVariable = minMaxVariable[i];
}
}
return minVariable;
}
//mutator method which calculates the minimum value of a given array
public static double max(double minMaxVariable[])
{
double maxVariable = Double.MIN_VALUE;
for(int i = 0; i < minMaxVariable.length; i ++)
{
if((minMaxVariable[i]) > maxVariable)
{
maxVariable = minMaxVariable[i];
}
}
return maxVariable;
}
//mutator method which calculates the total value of a given array
public static double totalOf(double totalVariable[])
{
double totalValue = 0;
for(double newValue : totalVariable)
{
totalValue += newValue;
}
return totalValue;
}
}
That should take care of the zeroes in the upper-portion of your table. As for the minimum, maximum and total values they're obviously going to be zero anyway because you've set them as such. Assuming that you've made the aforementioned methods static you could call them like this. Note the casting since min
, max
and totalOf
return a value of type double
.
minDistance = (int)AnnualFuelUse.min(distance);
minMPG = AnnualFuelUse.min(milesPerGallon);
minCost = AnnualFuelUse.min(totalCost);
maxDistance = (int)AnnualFuelUse.max(distance);
maxMPG = AnnualFuelUse.max(milesPerGallon);
maxCost = AnnualFuelUse.max(totalCost);
totalDistance = (int)AnnualFuelUse.totalOf(distance);
totalGallonsUsed = AnnualFuelUse.totalOf(gallonsUsed);
totalCostSum = AnnualFuelUse.totalOf(totalCost);
Upvotes: 1
Reputation: 366
There is a method by the name public void calcDistance() in the AnnualFuelUse class. But it is never invoked. Therefore the getDistance method always returns 0.
Invoking the calcDistance before calling getDistance() populates the distance column.
//call methods
for(int index = 0; index < car.length; index++)
{
car[index].calcDistance();
distance[index] = car[index].getDistance();
milesPerGallon[index] = car[index].getMPG();
gallonsPerMile[index] = car[index].getGPM();
totalCost[index] = car[index].getTotalCost();
}
The same goes for public void calcGPM(double gallons, double dist) method as well.
Upvotes: 0