⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lessondoc.cpp

📁 为学校教导用的排课系统。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		pCmdUI->Enable(0);
}

void CLessonDoc::OnCl() 
{
	// TODO: Add your command handler code here
	switch(m_Info.m_ViewStatus)
	{
	case TEACHER_MISSION:
	case TEACHER_LESSON:
		m_Info.m_ViewStatus=CLASS_LESSON;
		UpdateAllViews(0);
		break;
	case CLASS_LESSON:
		break;
	default:
		m_Info.m_ViewStatus=CLASS_LESSON;
		UpdateAllViews(0);
	}	
}

void CLessonDoc::OnUpdateCl(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_Info.m_ViewStatus==CLASS_LESSON)
		pCmdUI->SetCheck();
	else
		pCmdUI->SetCheck(0);	

	if(m_Info.m_IsArrangeRight)
		pCmdUI->Enable();
	else
		pCmdUI->Enable(0);	
}

void CLessonDoc::OnSaveLesson() 
{
	// TODO: Add your command handler code here
	CLessonApp * pa=(CLessonApp *)AfxGetApp();
	if(!pa->m_IsRegistry)
	{
		MessageBox(GetListView()->m_hWnd,"对不起!\n\n未注册版本不享有此功能","未注册",MB_ICONERROR);
		return;
	}
	switch(m_Info.m_ViewStatus)
	{
	case TEACHER_LESSON:
		if(1)
		{
			CFileDialog dlg(0,".Txt",(LPCTSTR)m_Info.m_SelectTeacherName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文档(.txt)|*.txt|");
			if(dlg.DoModal()==IDOK)
			{
				CTeacher * Teacher=GetTeacher(m_Info.m_SelectTeacherName);
				if(Teacher==NULL)return;
				CFile txt;CString str;char buf[32768];
				txt.Open((LPCTSTR)(dlg.GetFileTitle()+".Txt"),CFile::modeCreate|CFile::modeWrite);
				for(int s=0;s<m_Info.m_Stanza;s++)
				{
					for(int w=0;w<m_Info.m_Week;w++)
					{
						str=GetSubject(Teacher,w,s);
						strcpy(buf,str);
						txt.Write(buf,4);
						buf[0]=32;
						txt.Write(buf,1);
					}
					buf[0]=13;buf[1]=10;
					txt.Write(buf,2);
				}
				txt.Close();
			}
		}
		break;
	case CLASS_LESSON:
		if(m_Info.m_SelectGrade<1)
		{
			CString str;
			CFileDialog dlg(0,".Txt","总课表", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文档(.txt)|*.txt|");
			if(dlg.DoModal()==IDOK)
			{
				CFile txt;char buf[32768];
				CMission * Mission;
				txt.Open((LPCTSTR)(dlg.GetFileTitle()+".Txt"),CFile::modeCreate|CFile::modeWrite);
				for(int s=0;s<m_Info.m_Stanza;s++)
				{
					for(int w=0;w<m_Info.m_Week;w++)
					{
					for(int g=0;g<GetGradeCount();g++)
					for(int c=0;c<GetClassCount(g+1);c++)
					{
						Mission=GetMission(g+1,c+1,w+1,s+1);
						if(Mission)
							str=Mission->m_Subject;
						else
							str="自习";
						strcpy(buf,str);
						txt.Write(buf,4);
						buf[0]=32;
						txt.Write(buf,1);
					}
					}
					buf[0]=13;buf[1]=10;
					txt.Write(buf,2);
				}
				txt.Close();
			}
		}
		else
		{
			if(m_Info.m_SelectClass<1)
			{
				CString str;
				str.Format("%d年级",m_Info.m_SelectGrade);
				CFileDialog dlg(0,".Txt",(LPCTSTR)str, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文档(.txt)|*.txt|");
				if(dlg.DoModal()==IDOK)
				{
					CFile txt;char buf[32768];
					CMission * Mission;
					txt.Open((LPCTSTR)(dlg.GetFileTitle()+".Txt"),CFile::modeCreate|CFile::modeWrite);
					for(int s=0;s<m_Info.m_Stanza;s++)
					{
						for(int w=0;w<m_Info.m_Week;w++)
						{
							for(int c=0;c<GetClassCount(m_Info.m_SelectGrade);c++)
							{
								Mission=GetMission(m_Info.m_SelectGrade,c+1,w+1,s+1);
								if(Mission)
									str=Mission->m_Subject;
								else
									str="自习";
								strcpy(buf,str);
								txt.Write(buf,4);
								buf[0]=32;
								txt.Write(buf,1);
							}
						}
						buf[0]=13;buf[1]=10;
						txt.Write(buf,2);
					}
					txt.Close();
			}
			}
			else
			{
				CString str;
				str.Format("%d(%d)班",m_Info.m_SelectGrade,m_Info.m_SelectClass);
				CFileDialog dlg(0,".Txt",(LPCTSTR)str, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文档(.txt)|*.txt|");
				if(dlg.DoModal()==IDOK)
				{
					CFile txt;char buf[32768];CMission * Mission;
					txt.Open((LPCTSTR)(dlg.GetFileTitle()+".Txt"),CFile::modeCreate|CFile::modeWrite);
					for(int s=0;s<m_Info.m_Stanza;s++)
					{
						for(int w=0;w<m_Info.m_Week;w++)
						{
							Mission=GetMission(m_Info.m_SelectGrade,m_Info.m_SelectClass,w+1,s+1);
							if(Mission)
								str=Mission->m_Subject.Left(4);
							else
								str="自习";
							strcpy(buf,str);
							txt.Write(buf,4);
							buf[0]=32;
							txt.Write(buf,1);
						}
						buf[0]=13;buf[1]=10;
						txt.Write(buf,2);
					}
					txt.Close();
				}
			}
		}
		break;
	default:
		MessageBox(GetListView()->m_hWnd,"请选择一种课表后再保存","错误",MB_ICONERROR);
	}
}

void CLessonDoc::OnUpdateSaveLesson(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_Info.m_IsArrangeRight)
		pCmdUI->Enable();
	else
		pCmdUI->Enable(0);
}

BOOL CLessonDoc::Isable(int nIndex)
{
	if(MISS(nIndex)->Isable()==FALSE)
		return FALSE;
	if(((CTeacher*)MISS(nIndex)->m_pTeacher)->Isable()==FALSE)
		return FALSE;
	for(int i=m_TempArray.GetSize()-1;i>=0;i--)
	{
		if(i==nIndex)continue;
		if(MISS(i)->m_Name.CompareNoCase(MISS(nIndex)->m_Name)&&MISS(i)->m_Grade==MISS(nIndex)->m_Grade&&MISS(i)->m_Class==MISS(nIndex)->m_Class)
		{
			for(int w=0;w<WEEK;w++)
				for(int s=0;s<STANZA;s++)
					if(MISS(i)->m_Sit[w][s]&&MISS(nIndex)->m_Sit[w][s])
						return FALSE;
		}
	}
	return TRUE;
}

BOOL CLessonDoc::Isable()
{
	CTeacher * Teacher,*T2;
	CMission * M1,*M2;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		Teacher=(CTeacher*)m_TeacherArray.GetAt(i);
		if(Teacher->Isable()==FALSE)
			return FALSE;
		for(int j=Teacher->m_MissionArray.GetSize()-1;j>=0;j--)
		{
			M1=(CMission*)Teacher->m_MissionArray.GetAt(j);
			if(M1->Isable()==FALSE)
				return FALSE;
			for(int m=m_TeacherArray.GetSize()-1;m>=0;m--)
			{
				if(m==i)continue;
				T2=(CTeacher*)m_TeacherArray.GetAt(m);
				for(int n=T2->m_MissionArray.GetSize()-1;n>=0;n--)
				{
					M2=(CMission*)T2->m_MissionArray.GetAt(n);
					if(M1->m_Grade==M2->m_Grade&&M1->m_Class==M2->m_Class)
					for(int w=0;w<WEEK;w++)
						for(int s=0;s<STANZA;s++)
						if(M1->m_Sit[w][s]&M2->m_Sit[w][s])
								return FALSE;
				}
			}
		}
	}
	return TRUE;
}

BOOL CLessonDoc::Full(int nIndex, int Depth)
{
	if(Depth==0)
	{
		for(int i=0;i<m_Info.m_Stanza;i++)
			for(int j=0;j<m_Info.m_Week;j++)
			{
//				if(MISS(nIndex)->m_Info.m_Num==MISS(nIndex)->m_Num)
				if(MISS(nIndex)->Compute()==MISS(nIndex)->m_Num)
					return TRUE;
				if(MISS(nIndex)->m_Sit[j][i]==FALSE)
				{
					ADDMISS(nIndex,j,i);
					if(Isable(nIndex)==FALSE)
					{
						KILLMISS(nIndex,j,i);
					}
					else
						if(MISS(nIndex)->Compute()==MISS(nIndex)->m_Num)
//						if(MISS(nIndex)->m_Info.m_Num==MISS(nIndex)->m_Num)
							return TRUE;
				}
			}
	}
	else
	{
		if(Full(nIndex,Depth-1)==TRUE)
			return TRUE;
		for(int i=0;i<m_Info.m_Stanza;i++)
			for(int j=0;j<m_Info.m_Week;j++)
			{
//				if(MISS(nIndex)->Compute()==MISS(nIndex)->m_Num)
				if(MISS(nIndex)->m_Info.m_Num==MISS(nIndex)->m_Num)
					return TRUE;
				if(MISS(nIndex)->m_Sit[j][i]==FALSE)
				{
					ADDMISS(nIndex,j,i);
					if(Isable(nIndex)==FALSE)
					{
						KILLMISS(nIndex,j,i);
						int H=GetMissionIndex(MISS(nIndex)->m_Grade,MISS(nIndex)->m_Class,j,i);
						if(H<0)
						{
							return FALSE;
						}
						else
						{
							ADDMISS(nIndex,j,i);
							KILLMISS(H,j,i);
							if(Isable(nIndex)==FALSE||Full(H,Depth-1)==FALSE)
							{//不行,还原
								KILLMISS(nIndex,j,i);
								ADDMISS(H,j,i);
							}
							else
//								if(MISS(nIndex)->Compute()==MISS(nIndex)->m_Num)
								if(MISS(nIndex)->m_Info.m_Num==MISS(nIndex)->m_Num)
									return TRUE;
						}
					}
					else
//						if(MISS(nIndex)->Compute()==MISS(nIndex)->m_Num)
						if(MISS(nIndex)->m_Info.m_Num==MISS(nIndex)->m_Num)
						{
							return TRUE;
						}
				}
			}
	}
	return FALSE;
}

void CLessonDoc::BuildTemp()
{
	m_TempArray.RemoveAll();
	for(int i=0;i<m_TeacherArray.GetSize();i++)
		m_TempArray.Append(((CTeacher*)m_TeacherArray.GetAt(i))->m_MissionArray);
	InitInstanceMissions();
}

void CLessonDoc::InitInstanceMissions()
{
	CMission * Mission;
	CString str;
	for(int i=0;i<m_TempArray.GetSize();i++)
	{
		Mission=(CMission*)m_TempArray.GetAt(i);
		Mission->m_Info.InitInstance();
		for(int Week=0;Week<WEEK;Week++)
			for(int Stanza=0;Stanza<STANZA;Stanza++)
				Mission->m_Sit[Week][Stanza]=FALSE;
		for(int RequestIndex=0;RequestIndex<Mission->m_Request.GetSize();RequestIndex++)
		{
			str=Mission->m_Request.GetAt(RequestIndex);
			if(!str.Left(2).CompareNoCase("固"))
			{
				str.Delete(0,6);
				int w=atoi(str);
				str.Delete(0,3);
				int s=atoi(str);
				Mission->m_Sit[w-1][s-1]=TRUE;
				Mission->m_Info.m_StanzaLesson[s-1]++;
				Mission->m_Info.m_WeekLesson[w-1]++;
				Mission->m_Info.m_Num++;
			}
		}
	}
}

int CLessonDoc::GetTeacherCount()
{
	return m_TeacherArray.GetSize();
}

int CLessonDoc::GetMissionCount()
{
	int count=0;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		count+=((CTeacher*)m_TeacherArray.GetAt(i))->m_MissionArray.GetSize();
	}
	return count;
}

int CLessonDoc::GetMissionIndex(int Grade, int Class, int Week, int Stanza)
{
	for(int i=m_TempArray.GetSize()-1;i>=0;i--)
		if(MISS(i)->m_Grade==Grade&&MISS(i)->m_Class==Class&&MISS(i)->m_Sit[Week][Stanza]==TRUE)
			return i;
	return -1;
}

void CLessonDoc::Test() 
{
	// TODO: Add your command handler code here
	CString str="没有冲突";
	CTeacher * Teacher;
	CMission * Mission,*M2;
	for(int i=0;i<m_TeacherArray.GetSize();i++)
	{
		Teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		if(Teacher->Isable())
		{
			for(int tn=0;tn<Teacher->m_MissionArray.GetSize();tn++)
			{
				Mission=(CMission *)Teacher->m_MissionArray.GetAt(tn);
				if(Mission->Isable())
				{
					int wt=0,st=0;Mission->Compute();
					for(int w=0;w<WEEK;w++)
						wt+=Mission->m_Info.m_WeekLesson[w];
					for(int s=0;s<STANZA;s++)
						st+=Mission->m_Info.m_StanzaLesson[s];
					if(wt<Mission->m_Num)
					{
						str.Format("%s%d年级%d班只有%d节课",Mission->m_Name,Mission->m_Grade,Mission->m_Class,wt);
					}
					else if(st<Mission->m_Num)
					{
						str.Format("%s%d年级%d班只有%d节课(行总不等于列总)",Mission->m_Name,Mission->m_Grade,Mission->m_Class,st);
					}
				}
			}
		}
		else
		{
			str.Format("%s 课务冲突",Teacher->m_Name);
			for(int tn=0;tn<Teacher->m_MissionArray.GetSize();tn++)
			{
				Mission=(CMission *)Teacher->m_MissionArray.GetAt(tn);
				for(int tm=tn+1;tm<Teacher->m_MissionArray.GetSize();tm++)
				{
					M2=(CMission *)Teacher->m_MissionArray.GetAt(tm);
					for(int w=0;w<WEEK;w++)
						for(int s=0;s<STANZA;s++)
							if(Mission->m_Sit[w][s]&M2->m_Sit[w][s])
							{
								str.Format("%s\n星期d%第%d节\n  %d年级%d班%s课\n  %d年级%d班%s课",str,w+1,s+1,Mission->m_Grade,Mission->m_Class,Mission->m_Subject,M2->m_Grade,M2->m_Class,M2->m_Subject);
							}
				}
			}
		}
	}
	MessageBox(GetListView()->m_hWnd,str,"冲突信息",MB_OK);
	return;
}

void CLessonDoc::OnNew() 
{
	// TODO: Add your command handler code here
	UpdateAllViews(0);
}

CMission * CLessonDoc::GetMission(int Grade, int Class, int Week, int Stanza)
{
	if(Grade<1||Class<1||Week<1||Stanza<1)return NULL;
	CTeacher * Teacher;
	CMission * Mission;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -