租车里程超额计算功能

Rental car mileage overage calculation function

本文关键字:计算 功能 程超额      更新时间:2023-10-16

我正在尝试为我正在编写的C++程序创建一个里程超额计算函数。我在让此功能在 switch 语句中正常工作时遇到问题。我试图实现(或计算)的是超过汽车大小里程限制*租用天数的里程数。每个车辆尺寸都有下面提供的不同超额/英里计算费率。

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

double calcMilesFee(int miles, int days, char carSize)
{
    double milesFee = 0;
    double compactOverageCharge = .05;
    double midSizeOverageCharge = .07;
    double fullSizeOverageCharge = .09;
    int compactDailyMilesLimit = 20;
    int midSizeDailyMilesLimit = 25;
    int fullSizeDailyMilesLimit = 30;
    switch (carSize)
    {
        case 'c':
        case 'C':
        {
            while (miles > compactDailyMilesLimit * days)
            {
                milesFee =  (miles * days) / compactDailyMilesLimit;
            }
            if (milesFee > compactDailyMilesLimit)
            {
                milesFee = milesFee * compactOverageCharge;
                cout << "Overage Fee is " << milesFee << endl;
                break;
            }
        }

        case 'm':
        case 'M':
        {
            while (miles > midSizeDailyMilesLimit * days)
            {
                milesFee =  (miles * days) / midSizeDailyMilesLimit;
            }
            if (milesFee > midSizeDailyMilesLimit)
            {
                milesFee = milesFee * midSizeOverageCharge;
                cout << "Overage Fee is " << milesFee << endl;
                break;
            }
        }
        case 'f':
        case 'F':
        {
            while (miles > fullSizeDailyMilesLimit * days)
            {
                milesFee =  (miles * days) / fullSizeDailyMilesLimit;
            }
            if (milesFee > fullSizeDailyMilesLimit)
            {
                milesFee = milesFee * fullSizeOverageCharge;
                cout << "Overage Fee is " << milesFee << endl;
                break;
            }
        }
    }
    return milesFee;

}

您的问题包括:

  1. 除非有 if 条件,否则您永远不会中断每个开关外壳标签。
  2. 您的 while 循环永远不会结束。while-loops 的主体中没有任何内容会改变条件。

也就是说,这个问题比你想象的要简单得多:

#include <iostream>
#include <cmath>
double calcMilesFee(int miles, int days, char carSize)
{
    const double compactOverageCharge = .05;
    const double midSizeOverageCharge = .07;
    const double fullSizeOverageCharge = .09;
    const int compactDailyMilesLimit = 20;
    const int midSizeDailyMilesLimit = 25;
    const int fullSizeDailyMilesLimit = 30;
    double overageCharge = 0.0;
    int dailyMilesLimit = 0;
    double milesFee = 0;
    switch (carSize)
    {
        case 'c':
        case 'C':
            dailyMilesLimit = compactDailyMilesLimit;
            overageCharge = compactOverageCharge;
            break;
        case 'm':
        case 'M':
            dailyMilesLimit = midSizeDailyMilesLimit;
            overageCharge = midSizeOverageCharge;
            break;
        case 'f':
        case 'F':
            dailyMilesLimit = fullSizeDailyMilesLimit;
            overageCharge = fullSizeOverageCharge;
            break;
    }
    milesFee = std::max(0, miles - (days * dailyMilesLimit)) * overageCharge;
    std::cout << "Overage Fee is " << milesFee << std::endl;
    return milesFee;
}

正如我在评论中提到的,我建议不要使用浮点数进行货币计算,除非您的任务是强制性的。您可以将最终结果作为浮点值,但是如果我写这篇文章,我会使用整数精度达到一些硬限制(如十分之一便士)并执行点转换一次,最后一次

每个 case 语句都应以 break 结尾。在您的情况下,如果任何内部 if 语句失败,则不会中断执行下一个 case 语句,从而导致不同的行为。