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

📄 studentdlg.cpp

📁 学生成绩管理系统 使用C++语言加access数据库的一个小型软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		i ++;
	}
	n = i;

	// 如果记录集不空,则逐个取出记录,将字段转储到变量,然后用变量对对象数组元素进行赋值
	if (n > 0)
	{
		m_pRecordset_Std->MoveFirst();
		Student2* pStudent = new Student2[n];			// 创建一个Student派生类对象数组
		for (i = 0; i < n; i++)
		{
			nTemp=m_pRecordset_Std->GetCollect("学号");		// 取出记录
			id = (LPCSTR)_bstr_t(nTemp);					// 转储到C++字符串变量,下同
			nTemp=m_pRecordset_Std->GetCollect("姓名");
			name = (LPCSTR)_bstr_t(nTemp);
			nTemp=m_pRecordset_Std->GetCollect("平时作业");	// 取出记录
			exercise = nTemp;								// 转储到浮点变量,下同
			nTemp=m_pRecordset_Std->GetCollect("实验报告");
			report = nTemp;
			nTemp=m_pRecordset_Std->GetCollect("期中考试");
			midterm = nTemp;
			nTemp=m_pRecordset_Std->GetCollect("期末考试");
			terminal = nTemp;
			pStudent[i].SetStudent(id, name, exercise, report, midterm, terminal);			// 用变量为对象数组元素赋值
			m_Mark=pStudent[i].CalcMark();													// 对数组元素计算总评成绩
			m_pRecordset_Std->MoveNext();
		}
		m_pRecordset_Std->Close();							// 关闭记录集
		m_studentlist.SetStudentList(pStudent, n);		// 用数组为Student派生类对象的线性表赋值
		delete[] pStudent;								// 删除Student派生类对象数组
	}

	UpdateGrid();										// 显示学生数据在表格控件中

	// 清空统计控件
	m_ID = "";
	m_Name = "";
	m_Exercise = 0.;
	m_Report = 0.;
	m_Midterm = 0.;
	m_Terminal = 0.;
	m_Mark = 0.;
	m_Average = 0.;
	m_StdDev = 0.;
	m_CountA = 0;
	m_CountE = 0;
	UpdateData(FALSE);	
	m_Update.EnableWindow(TRUE);
	m_Insert.EnableWindow(TRUE);
	m_Sort.EnableWindow(FALSE);							// 使“排序”按钮变灰
	m_Period.EnableWindow(TRUE);						// 使“阶段”按钮变灰
	m_Period.SetCurSel(-1);								// 让“阶段”组合框变空
	m_Locate.EnableWindow(true);
	m_Delete.EnableWindow(true);
}

void CStudentDlg::OnSelchangeComboCourse() 
{
	// TODO: Add your control notification handler code here
	int i, n;
	CString ClassName, CourseName;
	CString id, name;
	float exercise, report, midterm, terminal;
	CString str;
	CString strSQL;										// 声明MFC之字符串类的对象,存放用于数据库查询的SQL语句
	_variant_t nTemp;

	Student2* pStudent = new Student2[64];				// 声明并创建64个元素的学生对象数组
	CEdit* pEdit[6];
	pEdit[0]=(CEdit*)GetDlgItem(IDC_EDIT_ID);
	pEdit[1]=(CEdit*)GetDlgItem(IDC_EDIT_NAME);
	pEdit[3]=(CEdit*)GetDlgItem(IDC_EDIT_MIDTERM);
	pEdit[4]=(CEdit*)GetDlgItem(IDC_EDIT_TERMINAL); 
	pEdit[5]=(CEdit*)GetDlgItem(IDC_EDIT_REPORT);
	pEdit[6]=(CEdit*)GetDlgItem(IDC_EDIT_EXERCISE);

	if (m_Class.GetCurSel() < 0)
	{		
    pEdit[0]->SetReadOnly();
	pEdit[1]->SetReadOnly();
	pEdit[3]->SetReadOnly();
	pEdit[4]->SetReadOnly();
	pEdit[5]->SetReadOnly();
	pEdit[6]->SetReadOnly();
	return;
	}

	else
	{
    pEdit[0]->SetReadOnly(false);
	pEdit[1]->SetReadOnly(false);
	pEdit[3]->SetReadOnly(false);
	pEdit[4]->SetReadOnly(false);
	pEdit[5]->SetReadOnly(false);
	pEdit[6]->SetReadOnly(false);
	}				

	m_Class.GetLBText(m_Class.GetCurSel(), ClassName);	// 得到所选班级名称文本
	m_Course.GetLBText(m_Course.GetCurSel(),CourseName);// 得到所选课程名称文本

	// 创建查询所需数据的SQL语句
	strSQL = "SELECT 学生.学号, 学生.姓名, 成绩.平时作业, 成绩.实验报告, 成绩.期中考试, 成绩.期末考试 ";
	strSQL += "FROM (班级 INNER JOIN 学生 ON 班级.班级ID = 学生.班级ID) INNER JOIN (课程 INNER JOIN 成绩 ON 课程.课程ID = 成绩.课程ID) ON 学生.学生ID = 成绩.学生ID ";
	strSQL += "WHERE 班级.班级名称='";
	strSQL += ClassName;
	strSQL += "' AND 课程.课程名称='";
	strSQL += CourseName;
	strSQL += "'";

	try
	{

		m_pRecordset_Std->Open(_bstr_t(strSQL), m_pConnection_Std.GetInterfacePtr(),ADODB::adOpenDynamic,ADODB::adLockOptimistic,ADODB::adCmdText);
	}
	catch (_com_error e)
	{
		CString strError;
		strError.Format("警告:打开数据表时发生异常。错误信息:%s",e.ErrorMessage());
	}												
	m_pRecordset_Std->MoveFirst();
	// 对记录集进行扫描以确定记录数
	i = 0;
	while (!m_pRecordset_Std->adoEOF)
	{
		m_pRecordset_Std->MoveNext();
		i ++;
	}
	n = i;
	// 如果记录集不空,则逐个取出记录,将字段转储到变量,然后用变量对对象数组元素进行赋值
	if (n > 0)
	{	
		m_pRecordset_Std->MoveFirst();
		Student2* pStudent = new Student2[n];			// 创建一个Student派生类对象数组
	
		for (i = 0; i < n; i++)
		{
			nTemp=m_pRecordset_Std->GetCollect("学号");		// 取出记录
			id = (LPCSTR)_bstr_t(nTemp);									// 转储到C++字符串变量,下同
			nTemp=m_pRecordset_Std->GetCollect("姓名");
			name = (LPCSTR)_bstr_t(nTemp);
			nTemp=m_pRecordset_Std->GetCollect("平时作业");	// 取出记录
			exercise = nTemp;								// 转储到浮点变量,下同
			nTemp=m_pRecordset_Std->GetCollect("实验报告");
			report = nTemp;
			nTemp=m_pRecordset_Std->GetCollect("期中考试");
			midterm = nTemp;
			nTemp=m_pRecordset_Std->GetCollect("期末考试");
			terminal = nTemp;
			pStudent[i].SetStudent(id, name, exercise, report, midterm, terminal);			// 用变量为对象数组元素赋值
			m_Mark=pStudent[i].CalcMark();													// 对数组元素计算总评成绩
			m_pRecordset_Std->MoveNext();
		}
		m_pRecordset_Std->Close();							// 关闭记录集
		m_studentlist.SetStudentList(pStudent, n);		// 用数组为Student派生类对象的线性表赋值
		delete[] pStudent;								// 删除Student派生类对象数组
	}

	UpdateGrid();										// 显示学生数据在表格控件中

	// 清空统计控件
	m_ID = "";
	m_Name = "";
	m_Exercise = 0.;
	m_Report = 0.;
	m_Midterm = 0.;
	m_Terminal = 0.;
	m_Mark = 0.;
	m_Average = 0.;
	m_StdDev = 0.;
	m_CountA = 0;
	m_CountE = 0;
	UpdateData(FALSE);	
	m_Update.EnableWindow(TRUE);
	m_Insert.EnableWindow(TRUE);
	m_Sort.EnableWindow(FALSE);							// 使“排序”按钮变灰
	m_Period.EnableWindow(TRUE);						// 使“阶段”按钮变灰
	m_Period.SetCurSel(-1);								// 让“阶段”组合框变空
	m_Locate.EnableWindow(true);
	m_Delete.EnableWindow(true);
}

void CStudentDlg::OnSelchangeComboPeriod() 
{
	// TODO: Add your control notification handler code here

	int i = m_Period.GetCurSel();						// 得到阶段列表框中光标所指阶段
	

	// 从线性表中获得该阶段最高分得主资料
	m_ID = m_studentlist.FindMax(i).GetID().data();		// 学号
	m_Name = m_studentlist.FindMax(i).GetName().data();	// 姓名
	m_Exercise = m_studentlist.FindMax(i).GetExercise();// 平时
	m_Report = m_studentlist.FindMax(i).GetReport();	// 实验
	m_Midterm = m_studentlist.FindMax(i).GetMidterm();	// 期中
	m_Terminal = m_studentlist.FindMax(i).GetTerminal();// 期末
	m_Mark = m_studentlist.FindMax(i).GetMark();		// 总评

	// 计算该阶段成绩统计数据
	m_Average = m_studentlist.Average(i);				// 平均分数
	m_StdDev = m_studentlist.StdDev(i);					// 标准偏差
	m_CountA = m_studentlist.CountA(i);					// 优秀人数
	m_CountE = m_studentlist.CountE(i);					// 挂科人数

	UpdateData(FALSE);									// 将变量中的数据显示在控件中

	UpdateGrid();										// 刷新电子表格(为非排序状态)
	
	m_Sort.EnableWindow(TRUE);							// 使“排序”按钮变亮


}

void CStudentDlg::OnButtonSort() 
{
	// TODO: Add your control notification handler code here
	StudentList studentlist = m_studentlist;			// 保存非排序状态线性表
	m_studentlist.BubSort(m_Period.GetCurSel());		// 按分数自高到低的顺序对学生排序
	UpdateGrid();										// 刷新电子表格(为排序状态)
	m_studentlist = studentlist;						// 恢复非排序状态线性表
}

void CStudentDlg::OnButtonExit() 
{
	// TODO: Add your control notification handler code here
	m_pConnection_Std->Close();
	CDialog::OnOK();
}

void CStudentDlg::UpdateGrid()
{
	// 显示学生数据于表格控件
	char str[32];
	int m=m_studentlist.GetnStudent();
	for (int i = 0; i < m; i ++)
	{
		m_Grid.SetRow(i + 1);							// 定位在第i行
		m_Grid.SetCol(0);								// 定位到第一列(列号为0)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		m_Grid.SetText(itoa(i + 1, str, 10));			// 设置单元格文本(序号)
		m_Grid.SetCol(1);								// 定位到第二列(列号为1)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		m_Grid.SetText(m_studentlist.GetpStudent()[i].GetID().data()); // 显示学号
		m_Grid.SetCol(2);								// 定位到第三列(列号为2)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		m_Grid.SetText(m_studentlist.GetpStudent()[i].GetName().data()); // 显示姓名
		m_Grid.SetCol(3);								// 定位到第四列(列号为3)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		sprintf(str, "%4.0f", m_studentlist.GetpStudent()[i].GetExercise()); // 转化浮点数为字符串
		m_Grid.SetText(str);							// 显示平时作业平均分
		m_Grid.SetCol(4);								// 定位到第五列(列号为4)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		sprintf(str, "%4.0f", m_studentlist.GetpStudent()[i].GetReport());	// 转化浮点数为字符串
		m_Grid.SetText(str);							// 显示实验报告平均分
		m_Grid.SetCol(5);								// 定位到第六列(列号为5)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		sprintf(str, "%4.0f", m_studentlist.GetpStudent()[i].GetMidterm()); // 转化浮点数为字符串
		m_Grid.SetText(str);							// 显示期中考试分数
		m_Grid.SetCol(6);								// 定位到第七列(列号为6)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		sprintf(str, "%4.0f", m_studentlist.GetpStudent()[i].GetTerminal()); // 转化浮点数为字符串
		m_Grid.SetText(str);							// 显示期末考试分数
		m_Grid.SetCol(7);								// 定位到第八列(列号为7)
		m_Grid.SetCellAlignment(3);						// 设置对齐方式(居中)
		sprintf(str, "%4.1f", m_studentlist.GetpStudent()[i].GetMark()); // 转化浮点数为字符串
		m_Grid.SetText(str);							// 显示总评分数
	}
	for(int n=m;n<49;n++)
	{
		m_Grid.SetRow(n+1);
		m_Grid.SetCol(0);
		m_Grid.SetText("");
		m_Grid.SetCol(1);
		m_Grid.SetText("");
		m_Grid.SetCol(2);
		m_Grid.SetText("");
		m_Grid.SetCol(3);
		m_Grid.SetText("");
		m_Grid.SetCol(4);
		m_Grid.SetText("");
		m_Grid.SetCol(5);
		m_Grid.SetText("");
		m_Grid.SetCol(6);
		m_Grid.SetText("");
		m_Grid.SetCol(7);
		m_Grid.SetText("");
		if(n+1==49)
		{
			m_Grid.SetTopRow(1);
			m_Grid.SetLeftCol(1);
		}
	}
}

BEGIN_EVENTSINK_MAP(CStudentDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CStudentDlg)
	ON_EVENT(CStudentDlg, IDC_MSFLEXGRID, -600 /* Click */, OnClickMsflexgrid, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
////////////////////////////////////////////////////////////
//计算器
void CStudentDlg::OnButtonClac() 
{
	// TODO: Add your control notification handler code here
	ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
}
//插入
void CStudentDlg::OnButtonInsert() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if(m_ID.GetLength()==0||m_Name.GetLength()==0)
	{
		AfxMessageBox("插入请同时输入学号和姓名!");
		return;
	}

	CString ClassName, CourseName;
	m_Class.GetLBText(m_Class.GetCurSel(), ClassName);	// 得到所选班级名称文本
	m_Course.GetLBText(m_Course.GetCurSel(),CourseName);// 得到所选课程名称文本

	CString strSQL,str;
	long StuID;
	strSQL="select 学生.学生ID,学生.学号 from 学生";
	_variant_t nTemp;
	int m=0;

	try
	{

		m_pRecordset_Std->Open(_bstr_t(strSQL), m_pConnection_Std.GetInterfacePtr(),ADODB::adOpenDynamic,ADODB::adLockOptimistic,ADODB::adCmdText);
	}
	catch (_com_error e)
	{
		CString strError;
		strError.Format("警告:打开数据表时发生异常。错误信息:%s",e.ErrorMessage());
	}
	m_pRecordset_Std->MoveFirst();
	while (!m_pRecordset_Std->adoEOF)
	{
		m_pRecordset_Std->MoveNext();
		m++;
	}
	if (m>0)
	{	
		m_pRecordset_Std->MoveFirst();
		for (int i=0;i<m;i++)
		{
			
			nTemp=m_pRecordset_Std->GetCollect("学号");
			str=(LPCSTR)_bstr_t(nTemp);
			if (m_ID==str)
			{
				break;
			}
			else
			m_pRecordset_Std->MoveNext();
		}
		m_pRecordset_Std->Close();
	}
	if(m_ID==str)
	{
		AfxMessageBox("此学号已经存在!");
		return;
	}	
	strSQL ="SELECT 班级.班级ID, 学生.学生ID, 学生.班级ID, 学生.学号, 学生.姓名 ";
	strSQL+="FROM 班级 INNER JOIN 学生 ON 班级.班级ID = 学生.班级ID";


	try
	{
		m_pRecordset_Std->Open(_bstr_t(strSQL), m_pConnection_Std.GetInterfacePtr(),ADODB::adOpenDynamic,ADODB::adLockOptimistic,ADODB::adCmdText);
	}
	catch (_com_error e)
	{
		CString strError;
		strError.Format("警告:打开数据表时发生异常。错误信息:%s",e.ErrorMessage());
	}									// 用SQL查询数据库,将数据存放于记录集中

	long temp_Class,temp_Course;
	temp_Class=m_Class.GetCurSel()+1;
	temp_Course=m_Course.GetCurSel()+1;
	

	m_pRecordset_Std->AddNew();
	m_pRecordset_Std->PutCollect("学生.班级ID",_variant_t(temp_Class));
	m_pRecordset_Std->PutCollect("学号",_variant_t(m_ID));
	m_pRecordset_Std->PutCollect("姓名",_variant_t(m_Name));
	m_pRecordset_Std->Update();
	m_pRecordset_Std->MoveLast();
	nTemp=m_pRecordset_Std->GetCollect("学生ID");
	StuID=nTemp;
	m_pRecordset_Std->Close();


	strSQL="SELECT 成绩.学生ID, 成绩.课程ID, 学生.学生ID, 课程.课程ID, 成绩.平时作业, 成绩.实验报告, 成绩.期中考试, 成绩.期末考试,成绩.总评成绩 ";
	strSQL+="FROM 学生 INNER JOIN (课程 INNER JOIN 成绩 ON 课程.课程ID = 成绩.课程ID) ON 学生.学生ID = 成绩.学生ID";
	try
	{
		m_pRecordset_Std->Open(_bstr_t(strSQL), m_pConnection_Std.GetInterfacePtr(),ADODB::adOpenDynamic,ADODB::adLockOptimistic,ADODB::adCmdText);
	}
	catch (_com_error e)
	{
		CString strError;
		strError.Format("警告:打开数据表时发生异常。错误信息:%s",e.ErrorMessage());
	}	
	m_pRecordset_Std->AddNew();
	m_pRecordset_Std->PutCollect("成绩.学生ID",_variant_t(StuID));
	m_pRecordset_Std->PutCollect("成绩.课程ID",_variant_t(temp_Course));
	m_pRecordset_Std->PutCollect("平时作业",_variant_t(m_Exercise));
	m_pRecordset_Std->PutCollect("实验报告",_variant_t(m_Report));
	m_pRecordset_Std->PutCollect("期中考试",_variant_t(m_Midterm));
	m_pRecordset_Std->PutCollect("期末考试",_variant_t(m_Terminal));
	m_pRecordset_Std->PutCollect("总评成绩",_variant_t(m_Mark));
	m_pRecordset_Std->Update();
	m_pRecordset_Std->Close();
	MessageBox("插入成功!");
	OnSelchangeComboCourse();
	UpdateData(false);
	
}

//删除

void CStudentDlg::OnButtonDelete() 
{
	// TODO: Add your control notification handler code here

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -