alxmke
alxmke

Reputation: 334

Inputting Array Data into a method within a separate class from another method in another class

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

Answers (2)

PakkuDon
PakkuDon

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

Duleeka Gunatilake
Duleeka Gunatilake

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

Related Questions