0

我正在尝试用 C++ 制作一个通话计费程序。这个小程序的功能之一是能够根据输入的时间段更新折扣时间内的折扣分钟和营业时间内的正常价格分钟。

用户首先以字符串形式输入时间,例如 22:00

然后我有一个函数,它接受字符串并将其转换为整数。比如上面的 22:00 变成 2200

然后我有另一个帮助函数,它接受一个 int,上面的 int 并将其转换为十进制时间。

double turnTimeToDecimal(int timeRaw){

    double decimalTime;

    decimalTime = timeRaw * 0.01;

        return decimalTime;
 }

没有折扣的营业时间在上午 8 点到 18.30 点之间,为了处理这个功能,我更新了一个 for 循环中的两个计数器,从 0 到 1417 分钟(24 小时):

double myStartDecimal = 0.0;
double myStopDecimal = 0.0;

myStartDecimal = turnTimeToDecimal(myStartRaw);
myStopDecimal = turnTimeToDecimal(myStopRaw);


//hours and minutes start
int  hourStart = (int)floor(myStartDecimal);
int minuteStart = (int)round(100*(myStartDecimal - hourStart));

//hours and minutes stop
int hourStop = (int)floor(myStopDecimal);
int minuteStop = (int) round(100*(myStopDecimal - hourStop));

int totalMinutesPremium = 0;
int totalMinutesDiscount = 0;
int i = 0;

int k = 0;
for(k = (hourStart* 60) + minuteStart; k < (hourStop * 60) + minuteStop + round(((double)minuteStop/100)); k++){


    //will update the corresponding counter depending 
    //on the time stretch, business hours 8.00 - 18.30.
    if(hourStart >= 8 && hourStop < 18.5){
        totalMinutesPremium++;
    }else{
        totalMinutesDiscount++;
    }
}

//will give total minutes
cout << " k is: " << k << endl;

//will give the total number of minutes during the business hours and 
//the total number of minutes during the discount hours(non-bussiness hours)
cout << "Total minutes premium " << round(totalMinutesPremium) << 
        " Total Minutes discount " << round(totalMinutesDiscount) << endl;

但是,该程序确实会检测输入的时间段是否在营业时间内,但在一种情况下除外。例如,如果时间在 7:30 和 8:30 之间(营业时间在 7:59-18:30 之间),则它不会返回营业时间内的分钟组合,我预计营业时间内是 30 分钟和分钟我预计折扣时间也是 30 分钟,因为折扣时间在 07:59 结束,并在 18:31 再次开始。

希望我说清楚了。

4

3 回答 3

1

for循环内部,您根据hourStart和分配给定的分钟hourStop,而不是根据给定的分钟是否在工作时间。如果电话在折扣时间进行,则整个电话将被打折。

于 2013-04-08T13:28:17.683 回答
0

“但是 HourStop 是一个整数。对于 hourStart 也是如此”

那么它就行不通了,如果不能int像你在这里做的那样使用带 s 的十进制值:

hourStop < 18.5

好吧..你可以,但它不会按照你想要的方式工作。如果有,int hourStop = 18.5那么它将被截断为 18,因为它不能是小数。您需要使用不同的类型,例如double

此外,循环中的条件取决于hourStart并且hourStop在循环中永远不会改变:

if(hourStart >= 8 && hourStop < 18.5){

所以你总是会遇到同样的if情况(不管是什么情况)

于 2013-04-08T13:36:55.937 回答
0

为什么要使用循环?为什么不只是做数学?

虽然不是完整的代码答案...您可以填写空白...

if( startTime >= startOfPremiumPeriod && endTime <= endOfPremiumPeriod )
   totalMinutesPremimum = endTime - startTime;
else if( startTime < startOfPremiumPeriod && endTime < startOfPremimumPeriod )
   totalMinutesDiscount = endTime - startTime;
.... etc. etc. etc.

您可以通过在结束时间加上 24 小时来考虑开始时间在午夜之前和结束时间在午夜之后的情况......

if( endTime < startTime ) endTime += 1440;
于 2013-04-08T13:28:16.630 回答