📄 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;
m_str100 = _T("");
m_str50 = _T("");
m_str60 = _T("");
m_str70 = _T("");
m_str80 = _T("");
m_str90 = _T("");
//}}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);
DDX_Text(pDX, IDC_EDIT_R100, m_str100);
DDX_Text(pDX, IDC_EDIT_R50, m_str50);
DDX_Text(pDX, IDC_EDIT_R60, m_str60);
DDX_Text(pDX, IDC_EDIT_R70, m_str70);
DDX_Text(pDX, IDC_EDIT_R80, m_str80);
DDX_Text(pDX, IDC_EDIT_R90, m_str90);
//}}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);
//查询课程信息的SQL命令
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中的Avg关键字。
sql.Format("SELECT Avg(Score) FROM ScoreTab WHERE ClassID IN ( SELECT ClassID FROM ClassTab WHERE CourseID='%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 ClassID IN ( SELECT ClassID FROM ClassTab WHERE CourseID='%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;
}
//计算出各分数段所占人数比例,因为整型相除还是整型,所以先把其中一个转化为浮点型即可
if(m_nCount>0){
m_str100.Format("%3.1f%%",(float)m_n100/m_nCount*100);
m_str90.Format("%3.1f%%",(float)m_n90/m_nCount*100);
m_str80.Format("%3.1f%%",(float)m_n80/m_nCount*100);
m_str70.Format("%3.1f%%",(float)m_n70/m_nCount*100);
m_str60.Format("%3.1f%%",(float)m_n60/m_nCount*100);
m_str50.Format("%3.1f%%",(float)m_n50/m_nCount*100);
}
else
{
m_str100="0%";
m_str90="0%";
m_str80="0%";
m_str70="0%";
m_str60="0%";
m_str50="0%";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -