📄 studentdlg.cpp
字号:
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 + -