1.题目要求
学期末,班级要统计该学期考试成绩,计算每个人的学分绩点,并按照学分绩点、平均分进行排序。假设本学期开设的课程共有n门课程,每门课程均有名称、学分数;学生考试成绩的学分绩点根据考试成绩核对如下:
100分 5绩点;95-99分 4.5绩点;90-94分 4个绩点;
85-89分 3.5绩点 80-84分 3绩点,以此类推。
学生学期绩点计算方法如下:
∑(课程获取的绩点数 * 学分数)/∑学分数
提示:
1、学期所学课程的记录文件为lesson.txt,该文件共三列,第一列为课程编号,第二列为课程名称,第三列为课程学分;
2、考试成绩记录文件为grade.txt,该文件第一行为标题行,记录考生学号、姓名、考试课程;从第二行开始记录考生对应课程的考试成绩,形式如下:
请编写程序完成如下界面与功能:
1)读取课程时,对课程文件进行读取;
2)读取成绩时对成绩文件进行读取;
3)在课程信息列表中显示所有课程的基本信息;
4)在学生考试成绩信息列表中显示学生考试信息;
5)在学会考试信息列表中可对学生成绩进行修改,修改完成后,点击修改,则完成修改工作;点击保存时,将学生考试信息保存;
6)当点击查询时,对学生考试情况进行查询,弹出如下对话框
可以以学号或姓名查询,在学号或者姓名编辑框中输入学号或者姓名,点击查询,在下方的列表框中显示学生考试信息。
7)点击上个界面中的计算绩点按钮时,弹出如下界面
计算出每个学生的绩点;选择一种排序方法(生序排序或者降序排序),点击排序后,对列表中的数据进行排序;
点击保存按钮时,将排序后的结果输出到一个文件中,该文件中共有三列数据,如列表框中所示。
2.需求分析
用户利用此学生成绩管理系统,应得以实现以下主要功能:
(1)、“读取课程”:将既定lesson.txt中的课程信息读入系统,并在课程信息列表中显示出来;
(2)、“读取成绩”:将既定grade.txt中的学生成绩读入系统,并在学生考试信息列表中显示出来;
(3)、“修改”:对考试信息列表中学生成绩进行修改,并将改动保存至grade.txt;
(4)、“计算绩点”:对各学生平均绩点进行计算,在绩点统计列表中显示出来,并能根据需要,依照平均绩点进行升序或降序排列;
(5)、“查询”:能通过学生的姓名或学号,查询其各科考试成绩,并在信息查询列表中显示出来。
3.总体设计
为实现上述功能,应按照以下流程图构建系统:
主要的类:
(1)欢迎界面对话框的类
// WelcomeDlg 对话框
class WelcomeDlg : public CDialogEx
{
DECLARE_DYNAMIC(WelcomeDlg)
public:
WelcomeDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~WelcomeDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG_WELCOME };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};
(2)登录界面对话框的类
// LoginDlg 对话框
class LoginDlg : public CDialogEx
{
DECLARE_DYNAMIC(LoginDlg)
public:
LoginDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~LoginDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG_LOGIN };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CString m_szUsername;//Edit control控件值的变量,用于存储用户输入的“用户名”
CString m_szPassward;//Edit control控件值的变量,用于存储用户输入的“密码”
(3)课程的类
class course
{
public:
//cstr
course() :code(""),cname(""), credit(0)
{
}
course(CString _cname, CString _code, float _credit) :cname(_cname), code(_code), credit(_credit)
{
}
//copy-cstr
course(const course & c)
{
cname = c.cname;
code = c.code;
credit = c.credit;
}
//dstr
virtual~course()
{
}
//member of data
public:
CString code; //课程编号
CString cname; //课程名称
float credit; //课程学分
};
(4)学生的类
class student
{
public:
//cstr
student() :sname(""), number(""), averpoint(0.0f), spoint(0.0f)
{
grade[3] = {
0 };
}
student(CString _sname, CString _number, int _grade[3],float _averpoint, float _spoint) :sname(_sname), number(_number), averpoint(_averpoint), spoint(_spoint)
{
grade[0] = _grade[0];
grade[1] = _grade[1];
grade[2] = _grade[2];
}
//dstr
virtual~student()
{
}
//member of data
public:
CString sname;//学生姓名
CString number;//学生学号
int grade[3];//假设共有三门考试科目,存储成绩的数组
float averpoint;//学生的平均学分绩点GPA
float spoint;//学生所有考试科目的总学分
};
(5)系统主界面对话框的类
// MainDlg 对话框
class MainDlg : public CDialogEx
{
DECLARE_DYNAMIC(MainDlg)
public:
MainDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~MainDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG_MAIN };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl CourseList;//课程信息列表Listctrl的控件变量
CListCtrl GradeList;//学生考试信息列表Listctrl的控件变量
CEdit m_edit;//供成绩修改用的Edit control
protected:
CalPointDlg*cdlg;
SearchDlg*sdlg;
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonGetcourse();//按“读取课程”时的操作
afx_msg void OnBnClickedButtonGetscore();//按“读取成绩”时的操作
afx_msg void OnBnClickedButtonCalculatepoint();//按“计算绩点”时的操作
afx_msg void OnBnClickedButtonSearch();//按“查询”时的操作
afx_msg void OnBnClickedButtonChange();//按“修改”时的操作
afx_msg void OnBnClickedButtonSave();//按“保存”时的操作
afx_msg void OnLvnItemchangedListDisplayscore(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkListDisplayscore(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnEnKillfocusEditChange();//使供成绩修改用的Edit control失焦的操作
};
(6)“计算绩点”子界面对话框的类
// CalPointDlg 对话框
class CalPointDlg : public CDialogEx
{
DECLARE_DYNAMIC(CalPointDlg)
public:
CalPointDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CalPointDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG_CALPOINT };
#endif
public:
void calaverpoint();//计算学生平均学分绩点的函数
float calgradepoint(int i);//计算单科绩点的函数
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl PointList;//绩点统计列表Listctrl的控件变量
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonSaverank();//按“保存”时的操作
afx_msg void OnBnClickedRadioUp();//选择“升序排列”时的操作
afx_msg void OnBnClickedRadioDown();//选择“降序排列”时的操作
afx_msg void OnBnClickedButtonRamk();//按“排序”时的操作
};
(7)“查询”子界面对话框的类
// SearchDlg 对话框
class SearchDlg : public CDialogEx
{
DECLARE_DYNAMIC(SearchDlg)
public:
SearchDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~SearchDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG_SEARCH };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl SearchList;//信息查询列表Listctrl的控件变量
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonSearch();//按“查询”时的操作
public:
CString SearchNumber;//Edit control控件值的变量,用于存储待查询学生的“学号”
CString SearchName;//Edit control控件值的变量,用于存储待查询学生的“姓名”
};
4.详细设计
具体函数代码:
(1)MFCApplication(学生成绩管理系统).cpp
BOOL CMFCApplication学生成绩管理系统App::InitInstance()