📄 reportdlg.cpp
字号:
// ReportDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ExMIS.h"
#include "ReportDlg.h"
#include "Math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CReportDlg dialog
CReportDlg::CReportDlg(CWnd* pParent /*=NULL*/)
: CDialog(CReportDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CReportDlg)
m_strName = _T("");
m_fLow = 0.0f;
m_fHigh = 0.0f;
m_fDelta = 0.0f;
m_fCredit = 0.0f;
m_strCollege = _T("");
m_fAvg = 0.0f;
m_n90 = 0;
m_n80 = 0;
m_n70 = 0;
m_n60 = 0;
m_n50 = 0;
m_n100 = 0;
m_nCount = 0;
//}}AFX_DATA_INIT
//为树指定图标
m_TreeBootImage.Create(IDB_BITMAP_TREE,20,1,ILC_COLOR32);
}
void CReportDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReportDlg)
DDX_Control(pDX, IDC_TREE, m_ctrlTree);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Text(pDX, IDC_EDIT_LOW, m_fLow);
DDX_Text(pDX, IDC_EDIT_HIGH, m_fHigh);
DDX_Text(pDX, IDC_EDIT_DELTA, m_fDelta);
DDX_Text(pDX, IDC_EDIT_CREDIT, m_fCredit);
DDX_Text(pDX, IDC_EDIT_COLLEGE, m_strCollege);
DDX_Text(pDX, IDC_EDIT_AVG, m_fAvg);
DDX_Text(pDX, IDC_EDIT_90, m_n90);
DDX_Text(pDX, IDC_EDIT_80, m_n80);
DDX_Text(pDX, IDC_EDIT_70, m_n70);
DDX_Text(pDX, IDC_EDIT_60, m_n60);
DDX_Text(pDX, IDC_EDIT_50, m_n50);
DDX_Text(pDX, IDC_EDIT_100, m_n100);
DDX_Text(pDX, IDC_EDIT_COUNT, m_nCount);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReportDlg, CDialog)
//{{AFX_MSG_MAP(CReportDlg)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReportDlg message handlers
BOOL CReportDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//初始化树形控件,设置图标
m_ctrlTree.SetImageList(&m_TreeBootImage,TVSIL_NORMAL);
//打开数据集
m_pRS.ADOOpen();
//添加院系、课程到树控件中
m_pRS.ADOExcute("SELECT * FROM CourseTab");
//增加树结点
AddTreeNodes();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CReportDlg::AddTreeNodes()
{
//删除所有结点控件中的项目
m_ctrlTree.DeleteAllItems();
//添加根结点即学生表的信息
hRootItem=m_ctrlTree.InsertItem("学生成绩基本信息",0,2,TVI_ROOT,TVI_LAST);
m_pRS.MoveFirst(); //指向第一条
while(!m_pRS.ADOEOF())
{
//添加院系到根节点中
HTREEITEM hCollege=AddDistinctNode(hRootItem,m_pRS.GetFieldString("CollegeID"));
//添加课程名称到院系节点中,因为可能有重复的课程名,所有将课程编号也加到结点值中
CString nodeCourse=m_pRS.GetFieldString("CourseID")+":"+m_pRS.GetFieldString("CourseName");
HTREEITEM hClass=AddDistinctNode(hCollege,nodeCourse);
m_pRS.MoveNext();
}
}
HTREEITEM CReportDlg::AddDistinctNode(HTREEITEM hParent,CString strValue)
{
HTREEITEM hItem=m_ctrlTree.GetChildItem(hParent);
while(hItem)
{
CString strItemText = m_ctrlTree.GetItemText(hItem);
if(strItemText == strValue)
return hItem; //已经存在该值的子结点,则返回
hItem = m_ctrlTree.GetNextSiblingItem(hItem);
}
//遍历了所有子结点,没有找到该值,则添加并返回
return m_ctrlTree.InsertItem(strValue,1,2,hParent,TVI_LAST);
}
void CReportDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
*pResult = 0;
//取得当前选中的节点
HTREEITEM hSelItem=m_ctrlTree.GetSelectedItem();
//取得先中节点的根节点
HTREEITEM hParentItem=m_ctrlTree.GetParentItem(hSelItem);
//判断选中的的是根节点,还是学院二级子节点。并取回根节点
CString str,strSql,strCondition; //SQL语句
//只有当选中课程结点时才开始计算
if(hParentItem!=NULL)
{
HTREEITEM hOldParent=m_ctrlTree.GetParentItem(hParentItem);
if(hOldParent!=NULL)
{
//选中的是课程结点,添加课程条件即可
//提取课程编号
CString s=m_ctrlTree.GetItemText(hSelItem);
int nPos;
nPos=s.Find(_T(":"),0);
if(nPos>0)
{
str=s.Mid(0,nPos);
//查询课程信息
strSql.Format("SELECT * FROM CourseTab WHERE CourseID='%s'",str);
m_pRS.ADOExcute(strSql);
m_strName=m_pRS.GetFieldString("CourseName");
m_fCredit=m_pRS.GetFieldFloat("CourseCredit");
m_strCollege=m_pRS.GetFieldString("CollegeID");
//开始统计
Calculate(str);
//更计数据
UpdateData(false);
}
}
}
}
//计算
void CReportDlg::Calculate(CString courseID)
{
//先清空所有
m_fLow = 0.0f;
m_fHigh = 0.0f;
m_fDelta = 0.0f;
m_fCredit = 0.0f;
m_fAvg = 0.0f;
m_n90 = 0;
m_n80 = 0;
m_n70 = 0;
m_n60 = 0;
m_n50 = 0;
m_n100 = 0;
m_nCount = 0;
CString sql;
//先提出某门课程的平均分
sql.Format("SELECT Avg(Score) FROM ScoreTab Where ScoreCourseID='%s'",courseID);
m_pRS.ADOExcute(sql);
//因为ACCESS中提取的平均数是字符类型
m_fAvg=atof(m_pRS.GetFieldString(0));
m_fHigh=m_fAvg;
m_fLow=m_fAvg;
//再算出标准差
float sum,score;
sum=0;
sql.Format("SELECT Score FROM ScoreTab Where ScoreCourseID='%s'",courseID);
m_pRS.ADOExcute(sql);
m_nCount=m_pRS.nFieldRows;
while(!m_pRS.ADOEOF())
{
score=m_pRS.GetFieldFloat(0);
if(score>m_fHigh) m_fHigh=score;
if(score<m_fLow) m_fLow=score;
sum+=(score-m_fAvg)*(score-m_fAvg);
if(score<50)
m_n50++;
else if(score<60)
m_n60++;
else if(score<70)
m_n70++;
else if(score<80)
m_n80++;
else if(score<90)
m_n90++;
else if(score<=100)
m_n100++;
m_pRS.MoveNext();
}
if(m_pRS.nFieldRows>1){
m_fDelta=sqrt(sum/(m_pRS.nFieldRows-1));
}else{
m_fDelta=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -