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

📄 mystudentdoc.cpp

📁 自编的一个实用的学生成绩处理管理系统。支持.dbf文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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&&note==_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 + -