📄 mystudentdoc.cpp
字号:
// MyStudentDoc.cpp : implementation of the CMyStudentDoc class
//
#include "stdafx.h"
#include "MyStudent.h"
#include "MainFrm.h"
#include "MyStudentSet.h"
#include "MyStudentDoc.h"
#include "SetDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyStudentDoc
IMPLEMENT_DYNCREATE(CMyStudentDoc, CDocument)
BEGIN_MESSAGE_MAP(CMyStudentDoc, CDocument)
//{{AFX_MSG_MAP(CMyStudentDoc)
ON_COMMAND(ID_EDIT_SET, OnEditSet)
ON_COMMAND(ID_EDIT_RECAL, OnEditRecal)
ON_COMMAND(ID_FILE_OPENDATABASE, OnFileOpendatabase)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyStudentDoc construction/destruction
CMyStudentDoc::CMyStudentDoc()
{
m_classnumber=0; // 数据库中班级的个数
m_passrate=0.0f;
m_average=0.0f;
m_90_100=0;
m_80_89=0;
m_70_79=0;
m_60_69=0;
m_50_59=0;
m_50=0;
m_recordcount=0;
m_endterm_coef=m_setdialog.m_endterm_coef;//赋对话的初值
m_midterm_coef=m_setdialog.m_midterm_coef;
m_normal_coef=m_setdialog.m_normal_coef;
//获取表中所有班级的基本信息
m_loaded=0;
}
CMyStudentDoc::~CMyStudentDoc()
{
//删除文档中生成的班级信息对象。通过对像数组。
ResetClassInfo();
}
BOOL CMyStudentDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMyStudentDoc diagnostics
#ifdef _DEBUG
void CMyStudentDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CMyStudentDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyStudentDoc commands
// 计算最终成绩子函数 最终=平时+期中*0.2+期末*0.8
void CMyStudentDoc::FigureOutFinal()//
{
if(m_loaded==0)return;
m_myStudentSet.MoveFirst();//复位记录指针
for(;;)
{
m_myStudentSet.Edit();
m_myStudentSet.m_final=(int)(m_myStudentSet.m_normal*m_normal_coef+
m_myStudentSet.m_midterm*m_midterm_coef+
m_myStudentSet.m_endterm*m_endterm_coef+0.5);//四舍五入,加入0.5再取整。
if(m_myStudentSet.m_final<60 && m_myStudentSet.m_endterm>=60)
m_myStudentSet.m_final=m_myStudentSet.m_endterm;
m_myStudentSet.Update();
m_myStudentSet.MoveNext();
if(m_myStudentSet.IsEOF())break;
}
m_myStudentSet.MoveFirst();//复位记录指针
}
// 获取数据库中班级个数和名称,和总记录数
void CMyStudentDoc::GetClassInfo()
{
CClassAnalysis* temclass=NULL; //中间班级指针对象
m_myStudentSet.MoveFirst(); //复位记录指针
if(m_myStudentSet.m_class!="")
{
temclass=new CClassAnalysis(m_myStudentSet.m_class);
m_classanalysis.Add(temclass);
}
for(;;)
{
m_recordcount++;
if(m_myStudentSet.m_class!="")
{ //判断当前记录的班级名称是否已经存储
int tag=0;//判断有没有存储
for(int j=0;j<m_classanalysis.GetSize();j++)
{
if(((CClassAnalysis*)(m_classanalysis.GetAt(j)))->m_classname==m_myStudentSet.m_class)
{
tag=1;// 如果存储了tag赋1
break;
}
}
if(tag==0)
{
temclass=new CClassAnalysis(m_myStudentSet.m_class);
m_classanalysis.Add(temclass);
}
}
m_myStudentSet.MoveNext();
if(m_myStudentSet.IsEOF())break;
}
//-----------对分析情况表排序冒泡排序---
int i,pass,n; //用于遍历子表的下标
CClassAnalysis* ptemp;
CClassAnalysis* arr_1;
CClassAnalysis* arr_2;
n=m_classanalysis.GetSize();
//开始遍历过程,以下标i构成子表,共有n-1个子表
for (pass=0;pass<n-1;pass++) //pass从后往后扩大0~n-1,以构成子表0~n-1,0~n-2,0~n-3..0~1
{
arr_1=(CClassAnalysis*)(m_classanalysis.GetAt(pass));
for (i=pass+1;i<n;i++) //遍历子表范围0~n-pass
{
arr_2=(CClassAnalysis*)(m_classanalysis.GetAt(i));
if (arr_1->m_classname>arr_2->m_classname)
{
m_classanalysis.SetAt(pass,arr_2);
m_classanalysis.SetAt(i,arr_1);
ptemp=arr_1;
arr_1=arr_2;
arr_2=ptemp;
}
}
}
//++++备注:使用memcpy()会出现一个问题。使用之后的temp变量一旦销去,会
//同时销去以前的一个内存区,使之无法指向。以后少用memcpy()函数。寻找替代者。
// memcpy(temp,arr_1,sizeof(CClassAnalysis));
// memcpy(arr_1,arr_2,sizeof(CClassAnalysis));
// memcpy(arr_2,temp,sizeof(CClassAnalysis));
// 无论temp是堆变量还是局部变量。
/* look out
for(i=0;i<5;i++)
{
arr_1=(CClassAnalysis*)(m_classanalysis.GetAt(i));
}
*/
//-------------------------------------
m_myStudentSet.MoveFirst();//把记录指针复位
//delete pTemp;
}
//分析成绩求出各分数段的人数及平均成绩,通过率
void CMyStudentDoc::AnalysisData()
{
//求各分数段的人数
CString temstr,note;
int final;
int sumfinal; //各班成绩总和
int sumnum; //班级总有效人数
int notpassnum; //末通过的人数
for(int i=0;i<m_classanalysis.GetSize();i++)
{
sumfinal=0; //对各个班将总和初置零
sumnum=0; //班级总人数初始置零
notpassnum=0;
temstr=((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_classname;
//复位班级信息数据,这次重新开始统计。
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->ResetClassData();
m_myStudentSet.MoveFirst(); //复位记录指针
for(;;)
{
//----------
note=m_myStudentSet.m_note;
note.Replace(" ",""); //去除空格
note.Replace(" ","");
//----------
if(m_myStudentSet.m_class==temstr&¬e==_T(""))//排除留级生留学生及转系生
{ //begin if
sumnum++;
final=m_myStudentSet.m_final;
sumfinal+=final;
if(final<50)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_50++;
notpassnum++;
}
else if(final>=50&&final<=59)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_50_59++;
notpassnum++;
}
else if(final>=60&&final<=69)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_60_69++;
}
else if(final>=70&&final<=79)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_70_79++;
}
else if(final>=80&&final<=89)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_80_89++;
}
else if(final>=90&&final<=100)
{
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_90_100++;
}
else{}
}//end if
m_myStudentSet.MoveNext();
if(m_myStudentSet.IsEOF())break;
}
//求平均成绩
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_average=((float)sumfinal)/sumnum;
//求通过率
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_passrate=((float)(sumnum-notpassnum))/sumnum;
//求班级总人数
((CClassAnalysis*)(m_classanalysis.GetAt(i)))->m_classnum=sumnum;
m_myStudentSet.MoveFirst();//复位记录指针
}
//((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_mainview->UpdateData();//更新显示
}
// 设置当前显示的分析的班级
void CMyStudentDoc::SetCurrentClassData(CString classname)
{
CClassAnalysis* currentclass;
for(int i=0;i<m_classanalysis.GetSize();i++)
{
currentclass=(CClassAnalysis*)(m_classanalysis.GetAt(i));
if(classname==currentclass->m_classname)
{
m_50=currentclass->m_50;
m_50_59=currentclass->m_50_59;
m_60_69=currentclass->m_60_69;
m_70_79=currentclass->m_70_79;
m_80_89=currentclass->m_80_89;
m_90_100=currentclass->m_90_100;
m_passrate=currentclass->m_passrate;
m_average=currentclass->m_average;
break;//如果找到所要的班级信息,则跳出循环
}
}
}
void CMyStudentDoc::OnEditSet()
{
// TODO: Add your command handler code here
// 更新文档及数据源基本数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -