java 上是否有允许两个 if 语句和一个独立的运费语句的代码?

Is there a code on java that allows for two if statements with one independent statement for Shipping Charges?

我是 java 的新手,一直被困在我一直试图创建的程序上。出于背景知识的目的,该程序适用于一家名为“Ship It”的包裹运输公司。用户输入包裹的重量和运输距离。根据重量,公司每 200 英里收取费用

0 < 重量 <= 3 磅 $1.00 费用

3 < 重量 <= 6 磅 $2.00 费用

6 < 重量 <= 10 磅 $3.00 费用

10 < 重量 <= 20 磅 $4.00 费用

20 < 重量 <= 30 磅 $5.00 费用

到目前为止,这是我的代码:

public static void main(String[] args) 
{   
    Scanner kb = new Scanner (System.in);
    
    //Variables
    double costWithoutCharge = 0, weight, distance = 0;
    
    //Introduction to ShipIt
    System.out.print("\t\t******Welcome to ShipIt******\n");
    System.out.print("***We are a low-charge, secure shipping company for packages" +
                        "up to 30 pounds***");

    //User Enters Weight of Package
    System.out.print("\n\nEnter the weight of the package (1.0 - 30.0 pounds): ");
    weight = kb.nextDouble();
    System.out.print("");
    

    // User Enters distance the package will travel
    System.out.print("Enter the miles to the destination (1 - 2000 miles): ");
    distance = kb.nextInt();
    System.out.print("");
    
    //Weight If-else Statement
    if (weight >30.0)
        System.out.println ("\nSorry, you have entered invalid data - program terminated");
    if (weight >30.0)
        System.exit((int) weight);
    
    //Distance Restriction if-else
    if (distance >2000)
        System.out.println ("\nSorry, you have entered invalid data - program terminated");
    if (distance >2000)
        System.exit((int) distance);    
    
    costWithoutCharge = distance / 200;
    
    //If else 
    if (weight <0 || weight <=3)
    {
        System.out.println ("The cost to ship the package is: "+ "$" + (costWithoutCharge)*1.00);
    }

    else if (weight <3 || weight <= 6)
    {
        System.out.println ("The cost to ship the package is: "+ "$" + (costWithoutCharge)*2.00);
    }

    else if (weight <6 || weight <= 10)
    {
        System.out.println ("The cost to ship the package is: "+ "$" + (costWithoutCharge)*3.00);
    }

    else if (weight <10 || weight <= 20)
    {
        System.out.println ("The cost to ship the package is: "+ "$" + (costWithoutCharge)*4.00);
    }
    else {
        System.out.println ("The cost to ship the package is: "+ "$" + (costWithoutCharge)*5.00);
    }

    kb.close();

}

}

截至目前,如果我输入 1001 这样的值,运费为 15.015 美元,但应该是 18 美元,因为费用是每 200 英里乘以的。如果我需要为每 200 英里的困境做一个新的方程式,或者是否可以用另一个 if 语句来支持它,我会犹豫不决?

我觉得好像我已经尝试了一切,但我似乎无法解决这个问题 ):我非常需要帮助!请!

第一个

if (weight <0 || weight <=3)

应该是

if (0 < weight && weight <=3)

但是代码应该更易于维护,使用 table 的限制:

double[][] weightsAndCharges = {
    {3, 1.00},
    {6, 2.00},
    {10, 3.00},
    {20, 4.00},
    {30, 5.00}
};

double charge = 10.00;
for (double[] weightAndCharge : weightAndCharges) {
    if (weight <= weightAndCharge[0]) {
        charge = weightAndCharge[1];
        break;
    }
}
System.out.printf("The cost to ship the package is: $%0.2f%n", charge*distanceRatio);

答案是一些基础数学。

您正在考虑的是组合爆炸:如果您在每个权重 if 语句中分层整批 if/elseif 语句,例如if (miles < 200) ... else if (miles >= 200 && miles < 400) - 然后按维度考虑:您有 'miles' 维度,当前添加 10 个选项(1-200、200-399、400-599 等),权重维度添加 5 .

这里你需要的 ifs 数量是 A*B:50 ifs。

那是一大堆,显然不是你想要的。

数学来拯救!

你真的只想计算costPerSegment * segments

分别计算这 2 个值,现在只有 A + B:15 个 ifs。鉴于您实际上可以使用数学本身将英里数转换为您需要收费的路段数量(对于英里部分,它只是除以 200,不涉及查找 table),我们减少到 5 个 ifs .

另请注意,您的代码存在错误。您的体重 if 声明的 >< 颠倒了。但是 else if 隐藏了问题。我在下面的代码片段中解决了这个问题。

double costPerSegment;

if (weight <=3) {
  costPerSegment = 1.0;
} else if (weight <= 6) {
  costPerSegment = 2.0;
} else if (weight <= 10) {
  costPerSegment = 3.0;
} else if (weight <= 20) {
  costPerSegment = 4.0;
} else {
  costPerSegment = 5.0;
}

// Casting a positive double to an int automatically rounds down.
int segments = (int) miles / 200;

double cost = costPerSegment * segments;

您的示例中缺少权重。 在你的例子中听起来你有:

  • 距离1001
  • 重量在 6 到 10 之间,导致每“开始 200 英里”收取 3 美元的费用

根据您的代码,返回 15.015。

您似乎想计算“开始的 200 英里”,因此您可以通过四舍五入来实现:

costWithoutCharge = Math.ceil( distance / 200 );

另一方面,您可能希望从 if/then/else 块中删除公共部分。即只计算每个子句中的System.out.println。

此行导致输入距离 1001 出现问题

costWithoutCharge = distance / 200; // result = 5,005

据我所知,你只想在这里拥有 5

所以最简单的解决方案是将 costWithoutCharge 声明为 int 比

costWithoutCharge = (int) distance / 200; // result = 5

或者如果您想将 costWithoutCharge 保持为双倍,您可以使用数学库对其进行舍入

costWithoutCharge = Math.round(distance / 200); // result = 5

逻辑似乎没问题。如果您的权重为 10 且距离为 1001,则很明显它将是 (1001/200) = 5.005 然后 (5.005*3) = 15.015。 虽然你的代码很笨拙,但是你放错了“>”,“<”符号,而且你不需要在里面多次提到打印语句,只需为所有情况放一个通用的。另外,如果你想四舍五入这个值,如果你把 1001 作为距离,它在任何情况下都不会是 18。无论如何,如果你想将它四舍五入,你可以将它转换为 int。

double charge;

if (weight <=3) {
  charge = 1.0;
} else if (weight >3 || weight <= 6) {
  charge = 2.0;
} else if (weight >6 || weight <= 10) {
  charge = 3.0;
} else if (weight >10 || weight <= 20) {
  charge = 4.0;
} else {
  charge = 5.0;
}


costWithoutCharge = (int) distance / 200; // Casting double to int

double total_cost = costWithoutCharge * charge;