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

📄 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;
	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 + -