?? 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 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;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -