先道歉,停车场算法,这次自己认真写了。还是有一些问题大家给了我很多代码,非常非常的感谢。想了想还是自己写
先道歉,停车场算法,这次自己认真写了。还是有一些问题 大家给了我很多代码,非常非常的感谢。想了想还是自己写代码好一点,是个锻炼尽量不做伸手党。实在解决不了再请教大家。回家认真的写了一下,现在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);