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