租车里程超额计算功能
Rental car mileage overage calculation function
我正在尝试为我正在编写的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;
}
您的问题包括:
- 除非有 if 条件,否则您永远不会中断每个开关外壳标签。
- 您的 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 语句,从而导致不同的行为。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 递归函数计算序列中的平方和(并输出过程)
- 以小于一毫秒的精度计算时间的功能
- 在 OpenCV 中计算 SURF 功能之间的距离
- 是否有C 功能来计算两个索引之间的距离
- 如何使用不同的功能计算三个数字的总和,平均值和产物
- (指针)降低测试分数后计算平均功能的问题
- 编译后如何计算某些二进制功能(或基本块)的校验和
- 使用功能计算总和和平均值的程序
- C++的最后一个位置是否有计算单元的标准功能
- opencv 断言在计算 HOG 功能时失败错误 438
- 是否有类比升压计算功能
- 租车里程超额计算功能
- 通过变异模板计算功能
- 创建循环功能以计算成本
- 一个简单的C 功能,在不同的计算机上具有不同的答案
- 编译时间递归函数以计算两个整数的下一个功能
- 如何停止仍在使用按钮停止计算的功能