首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

停车场收费算法,思路卡住了求补完!该如何处理

2013-11-27 
停车场收费算法,思路卡住了求补完!!public int staff_times(DateTime start_time, DateTime end_time)//开

停车场收费算法,思路卡住了求补完!!


        public int staff_times(DateTime start_time, DateTime end_time)//开始停车时间,
停车结束时间 
        {
            int fee = 0;//总收费数
            int day = 0;//一共间隔了几天
            DateTime dt1 = start_time.Date.AddHours(7);//取得入场时间当日7点
            DateTime dt2 = start_time.Date.AddHours(23).AddMinutes(1);//取得入场时间当日23点
            staff_card staff_week = new staff_card();
            string today_week = staff_week.Weeks_time().ToString();//返回数据库时间为周几
            int Total_hour = 0;//总停车收费小时数

            if (today_week != "周六" && today_week != "周日")//如果不是周六日
            {
                if (start_time >= dt1 && end_time <= dt2)//如果在免费时段内
                {
                    Total_hour = 0;//收费小时为0
                }
                else
                {
                    //如果在免费时段外
                    TimeSpan ts = (dt1 - start_time) + (end_time - dt2);
                    if (ts.Minutes > 15)
                    {
                        Total_hour = (int)(ts.Hours) + 1;
                        //超出15分钟算1小时
                    }
                    else
                    {
                        Total_hour = (int)(ts.Hours);
                        //未超出15分钟算0小时
                    }
                }
            }
            else //如果是周六日,没有免费时间
            {
                TimeSpan ts =  end_time - start_time;
                if (ts.Minutes > 15)
                {
                    Total_hour = (int)(ts.Hours) + 1;
                    //超出15分钟算1小时
                }
                else
                {
                    Total_hour = (int)(ts.Hours);
                    //未超出15分钟算0小时


                }
            }
            fee = Total_hour * 2;//收费小时数每小时2元,算总费用
            return fee;//函数返回总费用
        }


[解决办法]
不要被跨天搞混!

不管他跨步跨天,进入停车场开始计费,每隔一小时,根据日期和时间收取一次费用!

出停车场结束计费!



[解决办法]


+1,主要是提取出该收钱的时间和不收钱的时间分为2类。
[解决办法]
直接按小时循环,然后判断是不是周一到周五,7:00~23:00,不是就+2元,计算机这么快,1000年也就一瞬间

不需要任何算法





[解决办法]
private static int staff_times(DateTime dateTime1, DateTime dateTime2)
{
    if (dateTime1 >= dateTime2)
        return 0;

    var wk = dateTime1.DayOfWeek;
    switch (wk)
    {
        case DayOfWeek.Saturday:
        case DayOfWeek.Sunday:
            return staff_times1(dateTime1, dateTime2);
        default:
            return staff_times2(dateTime1, dateTime2);
    }
}

/// <summary>
/// 开始时间是周一到周五处理
/// </summary>
/// <param name="dateTime1"></param>
/// <param name="dateTime2"></param>
/// <returns></returns>
private static int staff_times2(DateTime dateTime1, DateTime dateTime2)
{
    var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0);
    var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0);
    if (dateTime1 < t1)
        return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2);    //早晨这段时间收费+晚上这段时间收费
    else if (dateTime2 < t2)         //7点到23点之间免费
        return 0;
    else
        return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}

/// <summary>
/// 开始时间是周六日处理
/// </summary>
/// <param name="dateTime1"></param>
/// <param name="dateTime2"></param>
/// <returns></returns>
private static int staff_times1(DateTime dateTime1, DateTime dateTime2)
{
    return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}

[解决办法]
有 bug,重新修改了一下
private static int staff_times(DateTime dateTime1, DateTime dateTime2)
{
    if (dateTime1 >= dateTime2)
        return 0;

    var wk = dateTime1.DayOfWeek;
    switch (wk)
    {
        case DayOfWeek.Saturday:
        case DayOfWeek.Sunday:
            return staff_times1(dateTime1, dateTime2);
        default:
            return staff_times2(dateTime1, dateTime2);
    }
}

/// <summary>
/// 开始时间是周一到周五处理
/// </summary>


/// <param name="dateTime1"></param>
/// <param name="dateTime2"></param>
/// <returns></returns>
private static int staff_times2(DateTime dateTime1, DateTime dateTime2)
{
    var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0);
    var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0);
    if (dateTime1 < t1)
        return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2);    //早晨这段时间收费+晚上这段时间收费
    else if (dateTime2 < t2)         //7点到23点之间免费
        return 0;
    else if (dateTime1 < t2)
        return staff_times(t2, dateTime2);
    else
        return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}

/// <summary>
/// 开始时间是周六日处理
/// </summary>
/// <param name="dateTime1"></param>
/// <param name="dateTime2"></param>
/// <returns></returns>
private static int staff_times1(DateTime dateTime1, DateTime dateTime2)
{
    return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}


[解决办法]
return staff_times(t2, dateTime2);

写为

return staff_times2(t2, dateTime2);

更直接一些。虽然这样写也不会有任何bug出现。
[解决办法]
还是有 bug,呵呵,再修改一下

[解决办法]
显然,就是这个“周一到周五”最麻烦。

我没有做任何优化,因为这样写最清楚。简单说明一下
private static int staff_times2(DateTime dateTime1, DateTime dateTime2)
{
    var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0);


    var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0);
    if (dateTime1 < t1)
    {
        if (dateTime2 < t1)
            return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours);
        else
            return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2);    //早晨这段时间收费+晚上这段时间收费
    }
    else if (dateTime2 < t2)         //7点到23点之间免费
        return 0;
    else if (dateTime1 < t2)
        return staff_times2(t2, dateTime2);
    else
        return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}



需要考虑5种情况:

1. datetime1早于7点,datatime2早于7点
2. datetime1早于7点,datatime2晚于7点
3. datetime1晚于7点,datatime2早于当天的23点
4. datetime1晚于7点但是早于23点,datatime2晚于当天的23点
5. datetime1晚于当天23点,datatime2晚于当天的23点

[解决办法]
厉害,小弟实在佩服啊
[解决办法]
停车场收费老大爷表示这种费用看看天就能算出来。
[解决办法]
引用:
建3个类,每个类都继承ICalc
A1--周一到周五,7:00~23:00
A2--周一到周五,其余
A3--周六日

从start_time到end_time,按天实例化A1---A3存到数组


寻欢调用ICalc,sum

  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
建三个类。。。越简单越好啊。。。
[解决办法]
引用:
求大神,大神来呀...


引用:
停车场收费老大爷表示这种费用看看天就能算出来。

看到没?去问问停车场收费的老大爷!
[解决办法]
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
[解决办法]
引用:
这个算法基本可行了 就是差免费时段外超过15分钟算一小时费用这个问题了
Quote: 引用:

如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。


那你说超过多长时间按一小时算?
[解决办法]
我感觉就是来抢分的,哎,但这个方法太好用了,返回分钟数:
public long getShiChang(DateTime startdate, DateTime enddate)
{
    long res = 0;
    TimeSpan ts24 = TimeSpan.Parse("1.00:00:00");
    TimeSpan[] ts = new TimeSpan[]{
        TimeSpan.Parse("00:00"), TimeSpan.Parse("07:00"),  
        TimeSpan.Parse("23:00"), ts24,  
    };
    for (; startdate < enddate; startdate = startdate.Date.AddDays(1))
    {
        TimeSpan ts0 = startdate.TimeOfDay;
        TimeSpan ts1 = (startdate.Date.Equals(enddate.Date)) ? enddate.TimeOfDay : ts24;
        switch (startdate.DayOfWeek)
        {
            case DayOfWeek.Saturday:
            case DayOfWeek.Sunday:
                res += (long)(ts1 - ts0).TotalSeconds;
                break;

            default:
                for (int i = 0; i < ts.Length; i += 2)
                {
                    if (ts0 < ts[i + 1] && ts1 > ts[i])
                    {
                        TimeSpan tsa = ts0 < ts[i] ? ts[i] : ts0;
                        TimeSpan tsb = ts1 > ts[i + 1] ? ts[i + 1] : ts1;
                        res += (long)(tsb - tsa).TotalSeconds;


                    }
                }
                break;
        }
    }
    return res / 60;
}


[解决办法]
全场收费。
免费时段,赠送。
[解决办法]
引用:
15分钟啊,比如:周一到周五期间。6:50来23:10走;总共在免费时段外时间超过了15分钟(已经20分钟了),算一小时

那你为什么不一刻钟收一次费呢?
[解决办法]
这个不涉及到什么高深算法,之所以写不出来是楼主没厘清计费情况到底有几种.

热点排行