读书人

先道歉停车场算法这次自己认真写了

发布时间: 2013-12-04 17:21:01 作者: rapoo

先道歉,停车场算法,这次自己认真写了。还是有一些问题


大家给了我很多代码,非常非常的感谢。想了想还是自己写代码好一点,是个锻炼尽量不做伸手党。实在解决不了再请教大家。回家认真的写了一下,现在TextBox1.Text返回的值是0,请教大家我的思路对不对?是什么地方出问题呢?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using my_cardclass;
using System.Data.SqlClient;

namespace carpark_fee_system
{
public partial class test : Form
{
public test()
{
InitializeComponent();
}

private static int staff_times(DateTime start_time,
DateTime end_time, int fee_standard)
{
/*
* 停车时间收费算法;周一到周五,早点~23点免费。
* 其他时段收费(标准为 fee_standard元 每小时)
* 周六,日无免费时段(标准为 fee_standard元 每小时);
*/
int totalhours = 0;//停车总时间
int totalfee = 0;//总停车费
TimeSpan ts = end_time.Date - start_time.Date;//停车日期和离开日期的时间差
if ((int)ts.Days > 0)//如果停车时间和离开时间不是同一天
{
totalhours = long_time(start_time, end_time);//调用多日停车时间算法
}
else
{
totalhours = same_day(start_time, end_time);//调用当日停车时间算法
}
totalfee = totalhours * fee_standard;//总费用 = 总时间 * 收费标准
return totalfee;//返回总费用
}


private static int long_time(DateTime dateTime1, DateTime dateTime2)
{
//多日停车时间算法
int total_hours = 0;//总时间
int hours = 0;//单日时间
TimeSpan ts = dateTime2.Date - dateTime1.Date;//进入和离开的时间做差,求天数
for (int day = (int)ts.Days; day < 0; day--)//循环得到每日的时间
{
var wx = dateTime1.DayOfWeek;//判断为周几
switch (wx)
{
case DayOfWeek.Saturday://停车时间为周六日,则调用周六日算法
case DayOfWeek.Sunday:
hours = rest_day(dateTime1, dateTime2);//调用休息日周六日算法
break;
default:
hours = same_day(dateTime1, dateTime2);//调用平常单日
break;


}

total_hours += hours;//单次循环停车时间
dateTime1.Date.AddDays(1);//时间点想后推移一天,为下次判断用
}
return total_hours;//多日停车总时间
}


private static int rest_day(DateTime dateTime1, DateTime dateTime2)
{
//休息日周六日算法
int hours = 0;
TimeSpan ts = dateTime2 - dateTime1;//停车总时间
hours = (int)ts.TotalHours;//停车小时数
if (ts.Minutes < 15)//不满15分钟
{
hours = 0;//免费
}
else
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;//停车时间
}


private static int same_day(DateTime dateTime1, DateTime dateTime2)
{
//当日单日正常停车时间
int hours = 0;//停车时间
DateTime dt1 = dateTime1.Date.AddHours(7);//早晨7点
DateTime dt2 = dateTime2.Date.AddHours(23);//晚间23点

//当天来算法
if ((dateTime1 > dt1) && (dt2 > dateTime2)
&& dateTime2.Date == dateTime1.Date)//7点之后来23点之前走的车
{
return hours = 0;//在免费时间段内,免费
}
else if (dateTime1 < dt1)//7点之后来的车
{
if (dt2 < dateTime2)//23点之后走的车
{
TimeSpan ts = dateTime2 - dt2;//离开时间-23点,计算时间小时数
hours = (int)ts.TotalHours;
if (ts.Minutes < 15)//不满15分钟
{
hours = 0;//免费
}
else
{
hours = hours + 1;//超过15分钟按一小时收费
}
}
}
else if (dateTime1 > dt1)//7点之前来的车
{


if (dateTime2 < dt2)//23点前就走的车
{
TimeSpan ts = dateTime2 - dt1;//离开时间-7点,计算时间小时数
hours = (int)ts.TotalHours;
if (ts.Minutes < 15)//不满15分钟
{
hours = 0;//免费
}
else
{
hours = hours + 1;//超过15分钟按一小时收费
}
}
if (dateTime2 > dt2)//如果23点后才走
{
TimeSpan ts = (dt1 - dateTime1) + (dateTime2 - dt2);
//离开时间-7点,计算时间小时数
hours = (int)ts.TotalHours;
if (ts.Minutes < 15)//不满15分钟
{
hours = 0;//免费
}
else
{
hours = hours + 1;//超过15分钟按一小时收费
}
}

}
return hours;//停车时间
}


private void button1_Click(object sender, EventArgs e)
{
//调用函数体staff_times()
textBox1.Text = (staff_times(DateTime.Parse("2013-11-24 7:00:00"),
DateTime.Parse("2013-11-25 8:20:00"), 2)).ToString();
}
}
}



[解决办法]
这个问题,你真该自己调试,代码不复杂,为什么返回空,跟踪I下不就清楚了
[解决办法]
真替你的老板感到悲哀。
[解决办法]
童鞋,你这不是在请教问题,而是让大家帮你分担工作,对伐?
------解决方案--------------------


给五万,帮你写!
[解决办法]
尼玛,你一天发一点代码出来 让人家给你写一大串 你回来整合起来 ! 那有个文员就行了啊
[解决办法]


[解决办法]
哈哈,楼主有点意思哈
[解决办法]
这个返回值问题,断点自己调试,如果连这个能力都不会,那还是建议LZ是否考虑换行
[解决办法]
for (int day = (int)ts.Days; day< 0; day--)//循环得到每日的时间

这里应该不是<了吧,应该是大于吧?
[解决办法]
Up 楼上,看了下

进入long_time() 这个方法的前提是 if ((int)ts.Days > 0)//如果停车时间和离开时间不是同一天

既然ts.Days > 0,你在循环中:for (int day = (int)ts.Days; day < 0; day--) day<0不成立,则不进循环。
[解决办法]
希望楼主自己设置断点看下,是不是不进循环。这样更明确一些。
[解决办法]
1. ”早点~23点免费“啥意思?到底是几点到几点免费(周一到周五),后边看到你注释是早晨7点
2. for (int day = (int)ts.Days; day < 0; day--)//循环得到每日的时间 这一句算出来应该多一天吧,应该改成day<=0吧
3. 你的long_time算法完全错了,很严重的逻辑错误,时间的累加算法不对。
4. if ((dateTime1 > dt1) && (dt2 > dateTime2) && dateTime2.Date == dateTime1.Date)//7点之后来23点之前走的车,其中最后一个判断不需要,加不加都无所谓,但是加上有点重复的嫌疑,影响效率。
5. 看到目前,我已经看够了,你这程序在设计逻辑上就有问题,哎,本来还想给你改,看来连改也不用改了,得直接重新设计了。

[解决办法]
由于你那个时间计算方式很乱,我重新写了一下 ,理了一下头绪。
问题的关键在于你判断小于15分钟的地方。你把hours=0了,就是这一步导致出错的。其实可以直接注释掉这一句的,基本上没用,注释掉以后就能用了。
[解决办法]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
///<summary>
///停车时间收费算法;周一到周五,早7-23点免费。
///其他时段收费(标准为 fee_standard元/每小时)
///周六,日无免费时段(标准为 fee_standard元/每小时)
///</summary>

namespace 停车场算法
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private static int staff_times(DateTime start_time,DateTime end_time, int fee_standard)
{
//变量声明
int totalhours = 0; //停车总时间
int totalfee = 0; //总停车费
TimeSpan ts = end_time.Date - start_time.Date;//停车日期和离开日期的时间差

if ((int)ts.Days > 0)//如果停车时间和离开时间不是同一天
{
totalhours = long_time(start_time, end_time);//调用多日停车时间算法
}
else
{
totalhours = same_day(start_time, end_time);//调用当日停车时间算法
}

totalfee = totalhours * fee_standard;//总费用 = 总时间 * 收费标准
return totalfee;//返回总费用
}

//多日停车时间算法
private static int long_time(DateTime dateTime1, DateTime dateTime2)
{
int total_hours = 0; //总时间
int hours = 0; //单日时间

TimeSpan ts = dateTime2.Date - dateTime1.Date;//进入和离开的时间做差,求天数
for (int day = (int)ts.Days; day <= 0; day--)//循环得到每日的时间
{


var wx = dateTime1.DayOfWeek;//判断为周几
switch (wx)
{
case DayOfWeek.Saturday://停车时间为周六日,则调用周六日算法
case DayOfWeek.Sunday:
hours = rest_day(dateTime1, dateTime2);//调用休息日周六日算法
break;
default:
hours = same_day(dateTime1, dateTime2);//调用平常单日
break;
}

total_hours += hours;//单次循环停车时间
dateTime1.Date.AddDays(1);//时间点想后推移一天,为下次判断用
}
return total_hours;//多日停车总时间

}

//休息日周六日算法
private static int rest_day(DateTime dateTime1, DateTime dateTime2)
{
int hours = 0;
TimeSpan ts = dateTime2 - dateTime1;//停车总时间
hours = (int)ts.TotalHours;//停车小时数
if (ts.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;//停车时间
}

//当日单日正常停车时间
private static int same_day(DateTime dateTime1, DateTime dateTime2)
{
int hours = 0; //停车时间
DateTime dt1 = dateTime1.Date.AddHours(7); //早晨7点
DateTime dt2 = dateTime2.Date.AddHours(23); //晚间23点

//工作日计算时间
if (dateTime1 < dt1 && dateTime2 < dt1) //7点之前来,7点之前走
{
return hours = 0;
}
if (dateTime1 > dt2 && dateTime2 > dt2) //23点之后来,23点之后走(24点之前走)
{
return hours = 0;
}
if (dateTime1 < dt1 && dateTime2 > dt1 && dateTime2 < dt2) //7点之前来,7点和23点之间走
{
TimeSpan ts_1 = dateTime2 - dt1;
hours = (int)ts_1.TotalHours;


if (ts_1.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
if (dateTime1 < dt1 && dateTime2 > dt2) //7点之前来,23点之后走(24点之前走)
{
return 16;
}
if (dateTime1 > dt1 && dateTime2 < dt2) //7点之后来,23点之前走(绝大多数车是这样的,考虑放在判断的第一次,提高效率)
{
TimeSpan ts_2 = dateTime2 - dateTime1;
hours = (int)ts_2.TotalHours;
if (ts_2.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
if (dateTime1 > dt1 && dateTime1 < dt2 && dateTime2 > dt2) //7点之后来,23点之后走
{
TimeSpan ts_3 = dt2 - dateTime1;
hours = (int)ts_3.TotalHours;
if (ts_3.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
return hours; //停车时间
}

private void button1_Click_1(object sender, EventArgs e)
{
DateTime dt1 = DateTime.Now;
int fee = staff_times(dt1, dt1.AddHours(2), 5);
textBox1.Text = fee.ToString();
}

}
}



这是在你基础上修改的完整的能运行的程序,不要忘了给我分啊,大仙同学。
[解决办法]
像什么 清明,中秋 这些假日 有没有优惠啊!先道歉,停车场算法,这次自己认真写了。还是有一些有关问题

[解决办法]
引用:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
///<summary>
///停车时间收费算法;周一到周五,早7-23点免费。
///其他时段收费(标准为 fee_standard元/每小时)
///周六,日无免费时段(标准为 fee_standard元/每小时)
///</summary>

namespace 停车场算法
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private static int staff_times(DateTime start_time,DateTime end_time, int fee_standard)


{
//变量声明
int totalhours = 0; //停车总时间
int totalfee = 0; //总停车费
TimeSpan ts = end_time.Date - start_time.Date;//停车日期和离开日期的时间差

if ((int)ts.Days > 0)//如果停车时间和离开时间不是同一天
{
totalhours = long_time(start_time, end_time);//调用多日停车时间算法
}
else
{
totalhours = same_day(start_time, end_time);//调用当日停车时间算法
}

totalfee = totalhours * fee_standard;//总费用 = 总时间 * 收费标准
return totalfee;//返回总费用
}

//多日停车时间算法
private static int long_time(DateTime dateTime1, DateTime dateTime2)
{
int total_hours = 0; //总时间
int hours = 0; //单日时间

TimeSpan ts = dateTime2.Date - dateTime1.Date;//进入和离开的时间做差,求天数
for (int day = (int)ts.Days; day <= 0; day--)//循环得到每日的时间
{
var wx = dateTime1.DayOfWeek;//判断为周几
switch (wx)
{
case DayOfWeek.Saturday://停车时间为周六日,则调用周六日算法
case DayOfWeek.Sunday:
hours = rest_day(dateTime1, dateTime2);//调用休息日周六日算法
break;
default:
hours = same_day(dateTime1, dateTime2);//调用平常单日
break;
}

total_hours += hours;//单次循环停车时间
dateTime1.Date.AddDays(1);//时间点想后推移一天,为下次判断用
}
return total_hours;//多日停车总时间

}

//休息日周六日算法
private static int rest_day(DateTime dateTime1, DateTime dateTime2)
{
int hours = 0;
TimeSpan ts = dateTime2 - dateTime1;//停车总时间
hours = (int)ts.TotalHours;//停车小时数
if (ts.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}


return hours;//停车时间
}

//当日单日正常停车时间
private static int same_day(DateTime dateTime1, DateTime dateTime2)
{
int hours = 0; //停车时间
DateTime dt1 = dateTime1.Date.AddHours(7); //早晨7点
DateTime dt2 = dateTime2.Date.AddHours(23); //晚间23点

//工作日计算时间
if (dateTime1 < dt1 && dateTime2 < dt1) //7点之前来,7点之前走
{
return hours = 0;
}
if (dateTime1 > dt2 && dateTime2 > dt2) //23点之后来,23点之后走(24点之前走)
{
return hours = 0;
}
if (dateTime1 < dt1 && dateTime2 > dt1 && dateTime2 < dt2) //7点之前来,7点和23点之间走
{
TimeSpan ts_1 = dateTime2 - dt1;
hours = (int)ts_1.TotalHours;
if (ts_1.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
if (dateTime1 < dt1 && dateTime2 > dt2) //7点之前来,23点之后走(24点之前走)
{
return 16;
}
if (dateTime1 > dt1 && dateTime2 < dt2) //7点之后来,23点之前走(绝大多数车是这样的,考虑放在判断的第一次,提高效率)
{
TimeSpan ts_2 = dateTime2 - dateTime1;
hours = (int)ts_2.TotalHours;
if (ts_2.Minutes >= 15)//不满15分钟
{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
if (dateTime1 > dt1 && dateTime1 < dt2 && dateTime2 > dt2) //7点之后来,23点之后走
{
TimeSpan ts_3 = dt2 - dateTime1;
hours = (int)ts_3.TotalHours;
if (ts_3.Minutes >= 15)//不满15分钟


{
hours = hours + 1;//超过15分钟按一小时收费
}
return hours;
}
return hours; //停车时间
}

private void button1_Click_1(object sender, EventArgs e)
{
DateTime dt1 = DateTime.Now;
int fee = staff_times(dt1, dt1.AddHours(2), 5);
textBox1.Text = fee.ToString();
}

}
}



这是在你基础上修改的完整的能运行的程序,不要忘了给我分啊,大仙同学。
还是犯同样的错误,哎,我都说了 day > 0不是day<0
[解决办法]
引用:
for (int day = (int)ts.Days; day< 0; day--)//循环得到每日的时间

这里应该不是<了吧,应该是大于吧?


应该是小于等于,到这循环和正着循环式一样的,关键是看结束判断的条件
[解决办法]
你太有才了。
[解决办法]
引用:
Quote: 引用:

for (int day = (int)ts.Days; day< 0; day--)//循环得到每日的时间

这里应该不是<了吧,应该是大于吧?


应该是小于等于,到这循环和正着循环式一样的,关键是看结束判断的条件
你真牛啊,大神
[解决办法]
实在受不了你了,很简单的东西,搞几天去,一个小时写一个小时调试就可以了,给你个思路,应该代码也没有错


static int getHours(DateTime startTime, DateTime endTime)
{
TimeSpan ts = endTime - startTime;
int thisHouse = ts.Minutes >= 15 ? 1 : 0;
int endHours = startTime.Hour;
if ((int)ts.TotalHours < 1) return thisHouse;
while (true)//一个个小时判断
{
int week = (int)startTime.DayOfWeek;
if (week >= 1 && week <= 5)//周一至周五
{
int hours = startTime.Hour;
if (hours < 7)//0-7小时收费
thisHouse++;
}
else
thisHouse++;

startTime=startTime.AddHours(1);
if (startTime.Date == endTime.Date && startTime.Hour == endTime.Hour)
break;
}
return thisHouse;
}



DateTime startTime = DateTime.Now;
DateTime endTime = startTime.AddHours(16).AddMinutes(16);

Console.WriteLine(getHours(startTime, endTime));
Console.WriteLine(startTime);


Console.WriteLine(endTime);


startTime = Convert.ToDateTime("2013-11-26 07:00");
endTime = startTime.AddHours(24).AddMinutes(16);

Console.WriteLine(getHours(startTime, endTime));
Console.WriteLine(startTime);
Console.WriteLine(endTime);

读书人网 >C#

热点推荐