我正在研究的程序的一部分实现了一个功能,该功能将包裹重量作为参数,并根据该重量计算运输成本。成本/磅的标准如下:

        Package Weight              Cost
        --------------              ----
        25 lbs & under              $5.00 (flat rate)
        26 - 50 lbs                 above rate + 0.10/lb over 25
        50 + lbs                    above rate + 0.07/lb over 50

我使用if-if else-if进行计算,但感觉有点重复:
const int TIER_2_WEIGHT = 25;
const int TIER_3_WEIGHT = 50;

const float TIER_1_RATE = 5.00;
const float TIER_2_RATE = 0.10;
const float TIER_3_RATE = 0.07;

float shipPriceF;


if(shipWeightF <= TIER_2_WEIGHT)
{
    shipPriceF = TIER_1_RATE;
}
else if(shipWeightF <= TIER_3_WEIGHT)
{
    shipPriceF = ((shipWeightF - TIER_2_WEIGHT) * TIER_2_RATE) +
                   TIER_1_RATE;
}
else
{
    shipPriceF = ((shipWeightF - TIER_3_WEIGHT) * TIER_3_RATE)   +
                 ((TIER_3_WEIGHT - TIER_2_WEIGHT) * TIER_2_RATE) +
                   TIER_1_RATE;
}

return shipPriceF;

因此,问题是……这是完成此任务的最佳方法,还是我应该寻找其他解决方案?

最佳答案

首先,您的代码看起来清晰,可以。

当然,您可以使用累积方法对公式中多余的部分进行重复数据删除:

float shipPriceF = TIER_1_RATE; // to be paid anyway

if (shipWeightF > TIER_2_WEIGHT) // add the tier 2 if necessary
{
    shipPriceF += (min(shipWeightF, TIER_3_WEIGHT) - TIER_2_WEIGHT) * TIER_2_RATE;
}
if(shipWeightF > TIER_3_WEIGHT)  // add the tier 3 if really necessary
{
    shipPriceF += (shipWeightF - TIER_3_WEIGHT) * TIER_3_RATE);
}

好吧,这甚至可以进一步简化:
float shipPriceF = TIER_1_RATE
                     + max(min(shipWeightF,TIER_3_WEIGHT)-TIER_2_WEIGHT,0) * TIER_2_RATE
                     + max(shipWeightF-TIER_3_WEIGHT,0) * TIER_3_RATE;

对于3个刻度,此合成公式可能没问题。但是,如果需要更大的灵活性,可以考虑遍历一个速率 vector 而不是使用常量。这将允许可变数量的秤。如果您确定公式始终是渐进式的(例如,“高于+新单价”),则使用累积方法。

关于c++ - C++根据重量计算运输成本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40569159/

10-11 00:53