简体   繁体   中英

Java - Calling methods from other classes with calculated fields

So I've been looking at this piece of code all afternoon and I can't see the error(s). Here is what I'm supposed to do:

Create a Delivery class for a delivery service. The class contains fields to hold the following:

  • A delivery number that contains eight digits. The first four digits represent the year, and the last four digits represent the delivery number.
  • A code representing the delivery area. A local delivery is code 1, and a long distance delivery is code 2.
  • A weight, in pounds, of the item to be delivered.
  • The fee for the delivery, as follows:

Create a constructor for the Delivery class that accepts arguments for the year, delivery number within the year, delivery distance code, and weight of the package. The constructor determines the eight-digit delivery number and delivery fee. Also include a method that displays every Delivery object field. Save the file as Delivery.java.

Next, create an application that prompts the user for data for a delivery. Keep prompting the user for each of the following values until they are valid:

  • A four-digit year between 2001 and 2025 inclusive
  • A delivery number for the year between 1 and 9999 inclusive
  • A package weight between 0.10 pound and 100 pounds inclusive
  • A delivery distance code that is either 1 or 2

When all the data entries are valid, construct a Delivery object, and then display its values. Save the file as CreateDelivery.java .

So here is my delivery Class

import javax.swing.*;
import java.util.*;


class Delivery 
{
    //variables
    private int year;
    private int deliveryNumber; //deliveryNo
    private double weight;
    private int distanceCode; //code

        //constructor
        //Delivery()
        //{
        //  year = year;
        //  deliveryNumber = deliveryNumber;
        //  weight = weight;
        //  distanceCode = distanceCode;
        //}

    //get year
    public int getYear()
    {
        return year;
    }
    //set year
    public int setYear (int newYear)
    {
        year = newYear;
        return year;
    }

    //get deliveryNumber
    public int getDeliveryNumber()
    {
        return deliveryNumber;
    }
    //set deliveryNumber
    public int setDeliveryNumber (int newDeliveryNumber)
    {
        deliveryNumber = newDeliveryNumber;
        return deliveryNumber;
    }

    //get weight
    public double getWeight()
    {
        return weight;
    }
    //set Weight
    public double setWeight (double newWeight)
    {
        weight = newWeight;
        return weight;
    }   


    //get distanceCode
    public int getDistanceCode()
    {
        return distanceCode;
    }
    //set distanceCode
    public int setDistanceCode (int newDistanceCode)
    {
        distanceCode = newDistanceCode;
        return distanceCode;
    }   

    //calculate fee
    public double displayFees(int distance, double w) //distance = c
    {
        double fees = 0;

    if(distance == 1)
    {
            if(w < 5)
        {
            fees = 12;
        }
        else if((w < 20)&&(w > 5))
        {
            fees = 16.50;
        }
        else if(w > 20)
        {
            fees = 22;
        }
    }
    else if(distance == 2)
    {
        if(w < 5)
        {
            fees = 35;
        }
        else if(w >= 5)
        {
            fees = 47.95;
        }
    }
        return fees;
    }

    //display method
    public void display(int year, int deliveryNumber, double weight, int distanceCode)
        {
        System.out.println("Year: " + year + '\n' 
            + "Delivery Number: " + deliveryNumber + '\n' 
            + "Weight of the package: " + weight + '\n'
            + "Delivery code: " + distanceCode);
        }
}

And here is my CreateDelivery Class

 import javax.swing.JOptionPane;
import java.util.Scanner;

public class CreateDelivery
    {
        public static void main(String []args)

        {

            Delivery delivery1 = new Delivery();

            //scanner year
            Scanner input = new Scanner(System.in);
            System.out.print("Please enter the current year, format (yyyy) >>> ");
            delivery1.setYear(input.nextInt());

            //loop year
                    while((delivery1.getYear() <= 2000)||(delivery1.getYear() >= 2026))
                    {
                        System.out.println('\n'+ "Error, year should be in the range of (2010 - 2025). Please enter a valid option >> ");
                        delivery1.setYear(input.nextInt());
                    }

            //scanner for delivery number
            System.out.print('\n'+ "Please enter a delivery number: ");
            delivery1.setDeliveryNumber(input.nextInt());

            //loop for delivery number
                    while((delivery1.getDeliveryNumber() <= 0001)||(delivery1.getDeliveryNumber() >= 10000))
                    {
                        System.out.println("Error, the delivery number is a 4 digit number between 0001 and 9999, please enter a valid option >> ");
                        delivery1.setDeliveryNumber(input.nextInt());
                    }

            //scanner for weight
            System.out.print("Please enter the weight of the package (in pounds): ");
            delivery1.setWeight(input.nextDouble());

                    //loop for weight
                    while((delivery1.getWeight() <= .09)||(delivery1.getWeight() >= 101))
                    {
                        System.out.println("Error, the minimum allowed weight is 0.10 pounds and the maximum is 100 pounds. Please enter a valid weight >> ");
                        delivery1.setWeight(input.nextDouble());
                    }

            //scanner for delivery code
            System.out.print("Please enter 1 for local or 2 for long distance deliveries >> ");
            delivery1.setDistanceCode(input.nextInt());

                    //loop for delivery code
                    while((delivery1.getDistanceCode() == 1) && (delivery1.getDistanceCode() == 2))
                    {
                        System.out.println("Error, please enter a valid distance code (1 for local deliveries and 2 for long distance deliveries) >> ");
                        delivery1.setDistanceCode(input.nextInt());
                    }

            //turn int to string
            String n = Integer.toString(delivery1.getDeliveryNumber());
            String y = Integer.toString(delivery1.getYear());

            String trackingNumber = n + y;
            System.out.println(delivery1.getDistanceCode() + " " 
            + trackingNumber + " " + delivery1.getWeight() + " " + fees);

    }

}

So I made the changes you guys suggested, but now I can't pull fees from the Delivery class. Any thoughts?

Delivery()
    {
        year = year;
        deliveryNumber = deliveryNumber;
        weight = weight;
        distanceCode = distanceCode;
    }

Replace it with something along the lines of:

Delivery(int year, int deliveryNumber, int weight, int distanceCode)
    {
        this.year = year;
        this.deliveryNumber = deliveryNumber;
        this.weight = weight;
        this.distanceCode = distanceCode;
    }

From there, I would avoid using the set methods. Instead, store all the values into respective fields as you load them from the System.in . Once you have all the fields, create the Delivery object.

I think you are missing () at the end of the methods such as getDeliveryNumber , getYear etc. in the while loop. and you are also using undeclared variables at the end such as getDeliveryNumber , getYear etc.

or we can do that simply like Delivery class

public class Delivery {
private int year,deliveryNumber,distanceCode;
private double weight;
private double fees=0;

//delivery class constructor
public Delivery(int year,int deliveryNumber,int distanceCode,double weight)
{
    this.year=year;
    this.deliveryNumber=deliveryNumber;
    this.distanceCode=distanceCode;
    this.weight=weight;
}    
//calculate  delivery fee
public void displayFees(int distanceCode, double weight)
{
    if(distanceCode == 1)
        {
        if(weight<5)
        {
            fees = 12;
        }
        else if((weight < 20)&&(weight >=5))
        {
            fees = 16.50;
        }
        else if(weight > 20)
        {
            fees = 22;
        }
    }
    else if(distanceCode == 2)
    {
        if(weight <5)
        {
            fees = 35;
        }
        else if(weight >= 5)
        {
            fees = 47.95;
        }
    }
}
public double getFee()
{
    return fees;
}

}

and CreateDelivery class:

public class CreateDelivery {

public static void main(String[] args) {
            

    int year=(int)ReadValues.readValue("Year", 1999,2026);
    int deliveryNumber=(int)ReadValues.readValue("Delivery Number (1 to 10000)", 0,10000);
    int distanceCode=(int)ReadValues.readValue("DistanceCode (1 or 2)",0, 3);
    double weight=ReadValues.readValue("weight",0, 20);

    Delivery delivery=new Delivery(year, deliveryNumber, distanceCode, weight);
    delivery.displayFees(distanceCode, weight);
    double fee=delivery.getFee();

    System.out.println("\n\n*****Delivery Fees Details*****\n\nTrackingNumber:"+year+deliveryNumber+"\nDistanceCode:"+distanceCode+"\nFee :"+fee);
}

}

and for reading values from user another class called ReadValue

import java.util.Scanner;

public class ReadValues {

public static double readValue(String prompt, int min, int max) {
    Scanner scan = new Scanner(System.in);
    double value;
    System.out.print(prompt + " :");
    while (true) {
        value = scan.nextDouble();
        if (value < min || value > max)
            System.out.println("Enter value between " + min + " & " + max);
        else
            break;
    }
    return value;
}

}

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM