📄 lessondoc.cpp
字号:
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 + -