简体   繁体   English

Java - 从具有计算字段的其他类调用方法

[英]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.为交付服务创建Delivery类。 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.本地派送代码1,长途派送代码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.Delivery类创建一个构造函数,该构造函数接受年份、年内交付数量、交付距离代码和包裹重量的参数。 The constructor determines the eight-digit delivery number and delivery fee.构造器确定八位数的送货编号和送货费用。 Also include a method that displays every Delivery object field.还包括一个显示每个Delivery对象字段的方法。 Save the file as Delivery.java.将文件另存为 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 2001 年至 2025 年(含)之间的四位数年份
  • A delivery number for the year between 1 and 9999 inclusive 1 到 9999(含)之间的年份的交付编号
  • A package weight between 0.10 pound and 100 pounds inclusive包裹重量介于 0.10 磅和 100 磅(含)之间
  • A delivery distance code that is either 1 or 2 1 或 2 的交货距离代码

When all the data entries are valid, construct a Delivery object, and then display its values.当所有数据条目都有效时,构造一个Delivery对象,然后显示其值。 Save the file as CreateDelivery.java .将文件另存为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这是我的 CreateDelivery 类

 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.从那里,我会避免使用set方法。 Instead, store all the values into respective fields as you load them from the System.in .相反,当您从System.in加载它们时,将所有值存储到相应的字段中。 Once you have all the fields, create the Delivery object.拥有所有字段后,创建Delivery对象。

I think you are missing () at the end of the methods such as getDeliveryNumber , getYear etc. in the while loop.我认为您在 while 循环中的getDeliveryNumbergetYear等方法的末尾缺少() and you are also using undeclared variables at the end such as getDeliveryNumber , getYear etc.并且您还在最后使用了未声明的变量,例如getDeliveryNumbergetYear等。

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:和 CreateDelivery 类:

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并从用户读取另一个名为 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;
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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