我正在尝试用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再次开始。
希望我能说清楚。
答案 0 :(得分:1)
在for
循环内,您可以根据hourStart
和hourStop
,不分配给定的分钟,以确定给定的分钟是否在营业时间内。如果通话侵犯了折扣小时数,那么整个通话将被打折。
答案 1 :(得分: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;
答案 2 :(得分:0)
“然而,HourStop是一个int。同样的事情适用于hourStart”
然后它不会起作用,如果不能像int
那样使用小数值,就像你在这里一样:
hourStop < 18.5
嗯..你可以但它不会按你想要的方式工作。如果你有int hourStop = 18.5
那么它将被截断为18,因为它不能是一个小数。您需要使用其他类型,例如double
此外,循环中的条件取决于hourStart
和hourStop
,它们在循环中永远不会改变:
if(hourStart >= 8 && hourStop < 18.5){
因此,您将始终达到相同的if
条件(无论如何)