using System;
using System.Data;namespace SchoolOA
{
/// <summary>
/// 排课类
/// Author:松鼠
/// Email:[email protected]
/// </summary>
public class CPaike
{
DataTable CourseTable;
public CPaike(){} #region 获取排课结果
/// <summary>
/// 获取排课结果
/// </summary>
/// <returns></returns>
DataTable GetData()
{
this.InitCourseTable();
this.InitCourseClass(8);
for(int i = 0 ; i < 8 ; ++i)
{
this.SortWeeksCourses(i);
}
return this.CourseTable;
}
#endregion #region 排星期的课
/// <summary>
/// 排星期的课
/// </summary>
/// <param name="ci">班级索引</param>
void SortWeeksCourses(int ci)
{
//所有星期
for(int i = 0 ; i < 5 ; ++i)
{
this.SortDayCourses(ci,i);
}
}
#endregion #region 排当前天的课
/// <summary>
/// 排当前天的课
/// </summary>
/// <param name="ci">班级索引</param>
/// <param name="wi">星期</param>
void SortDayCourses(int ci,int wi)
{
//所有节数
for(int i = 0; i < 8 ; ++i)
{
this.SortFestivalCourses(wi,ci,i);
}
}
#endregion #region 排每一节课
/// <summary>
/// 排每一节课
/// 说明:共有八节课
/// </summary>
/// <param name="wi">星期</param>
/// <param name="ci">班级索引</param>
/// <param name="fi">节数</param>
void SortFestivalCourses(int wi,int ci,int fi)
{
bool insert = false;
while(!insert)
{
string cn = this.GetCoursesName();
//同一天同一班级课程未超过范围
if(!this.MoreThanDayClassCourseScope(wi,ci,cn))
{
//同一天所有教师的课程未超过范围
if(!this.MoreThanDayCourseScope(fi,wi,cn))
{
this.CourseTable.Rows[ci][fi + wi * 8] = cn;
insert = true;
}
}
}
}
#endregion #region 课程名称
/// <summary>
/// 课程名称
/// </summary>
string[] CourseName = new string[]{"语文","数学","英语","音乐","美术","品德","体育"};
#endregion #region 获取课程名
/// <summary>
/// 获取课程名
/// </summary>
string GetCoursesName()
{
Random rm = new Random();
return CourseName[rm.Next(CourseName.Length)];
}
#endregion #region 是否超过同一天课程范围
/// <summary>
/// 是否超过同一天课程范围
/// </summary>
/// <param name="fi">节数</param>
/// <param name="wi">星期</param>
/// <param name="cn">课程名称</param>
/// <returns></returns>
bool MoreThanDayCourseScope(int fi,int wi,string cn)
{
int c1 = this.GetClassCount(cn); //课程总数
int c2 = this.GetSameDayCourseCount(fi,wi,cn);//相同课程总数
return c2 < c1 ? false : true;
}
#endregion #region 获取同一天相同总数课程
/// <summary>
/// 获取同一天相同总数课程
/// </summary>
/// <param name="fi">节数</param>
/// <param name="wi">星期</param>
/// <param name="cn">课程名称</param>
/// <returns></returns>
int GetSameDayCourseCount(int fi,int wi,string cn)
{
int i = 0;
int l = this.CourseTable.Rows.Count;
int count = 0;
while(i < l)
{
if(this.CourseTable.Rows[i++][wi * 8 + fi].ToString().Equals(cn))
{
count++;
}
}
return count;
}
#endregion #region 获取每门课程总数
/// <summary>
/// 获取每门课程总数
/// </summary>
/// <param name="cn">课程名称</param>
/// <returns></returns>
int GetClassCount(string cn)
{
return 3;
}
#endregion #region 是否超过同一天同一班级课程范围
/// <summary>
/// 是否超过同一天同一班级课程范围
/// </summary>
/// <param name="wi">星期</param>
/// <param name="ci">班级索引</param>
/// <param name="cn">课程名称</param>
/// <returns></returns>
bool MoreThanDayClassCourseScope(int wi,int ci,string cn)
{
int c1 = this.GetSameDayClassCoursesCount(wi,ci,cn);
int c2 = this.GetClassCourseCount(cn);
return c1 < c2 ? false : true;
}
#endregion #region 获取同一天,同一班级相同课程总数
/// <summary>
/// 获取同一天,同一班级相同课程总数
/// </summary>
/// <param name="wi">星期</param>
/// <param name="ci">班级索引</param>
/// <param name="cn">课程名称</param>
int GetSameDayClassCoursesCount(int wi,int ci,string cn)
{
int count = 0; //共有八节课
for(int i = 0; i < 8 ; ++i)
{
if(this.CourseTable.Rows[ci][wi * 8 + i].ToString().Equals(cn))
{
count++;
}
}
return count;
}
#endregion #region 获取班级课程总数
/// <summary>
/// 获取班级课程总数
/// </summary>
/// <returns></returns>
int GetClassCourseCount(string cn)
{
return 2;
}
#endregion #region 初始化课程表
/// <summary>
/// 初始化课程表
/// </summary>
void InitCourseTable()
{
this.CourseTable = new DataTable();
//五天
for(int i = 0 ; i < 5 ; i++)
{
this.InitTableColumn(i);
}
this.InitCourseClass(8);
}
#endregion #region 初始化课表节数
/// <summary>
/// 初始化课表节数
/// </summary>
/// <param name="wi">星期</param>
void InitTableColumn(int wi)
{
this.CourseTable.Columns.Add(string.Format("{0}一",wi));
this.CourseTable.Columns.Add(string.Format("{0}二",wi));
this.CourseTable.Columns.Add(string.Format("{0}三",wi));
this.CourseTable.Columns.Add(string.Format("{0}四",wi));
this.CourseTable.Columns.Add(string.Format("{0}五",wi));
this.CourseTable.Columns.Add(string.Format("{0}六",wi));
this.CourseTable.Columns.Add(string.Format("{0}七",wi));
this.CourseTable.Columns.Add(string.Format("{0}八",wi));
}
#endregion #region 初始化班级数
/// <summary>
/// 初始化班级数
/// </summary>
/// <param name="tb"></param>
/// <param name="l"></param>
void InitCourseClass(int l)
{
int i = 0;
while(i < l)
{
this.CourseTable.Rows.Add(this.CourseTable.NewRow());
i++;
}
}
#endregion
}
}