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

📄 reportdlg.cpp

📁 内容包括从VC++的基本范例到项目开发的许多典型的例子。是VC++初学者不可多得的好资料
💻 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 + -