精华内容
下载资源
问答
  • 学生成绩管理系统JAVA课程设计 目录 1设计题目1 2 设计目的2 3设计分析 3 4 概念结构设计 6 5 逻辑结构设计 11 6 表结构设计 13 装 7 具体功能实现15 8 总结26 9 附录 27 订 线 共 39 页 第 0 页 1.设计题目 学生...
  • 仲恺农业工程学院 仲 恺 农 业 工 程 学 院 课 程 设 计 报 告 题目员工管理系统 课程名称 数据结构与算法 信息科学与技术学院 院 系 专业班级 学 号 名 姓 3 仲恺农业工程学院 目 ... 12 五课程设计总结 . 错误未定义
  • 学生宿舍管理系统课程设计报告=代码
  • JAVA学生成绩管理系统课程设计报告
  • 本系统采用eclipse开发,数数据库采用my sql2008,使用Navicat可视化软件编辑,tomcat9作为服务器,文件中包含课程设计文档,学生信息管理系统压缩包,数据库文件ssms,以及my sql+Navicat包,将数据库通过Navicat...
  • 选 目 录 TOC \o "1-3" \h \z \u 1 引言.2 3 需求分析.3 2.1 问题陈述 3 2.2 需求分析 4 2.3 可行性研究 4 3 系统总体设计 5 3.1 数据需求设计 5 3.2 功能模块设计 7 4 详细设计与实现 8 4.1 开发环境 9 4.2 功能...
  • 软件工程课程设计 学生成绩管理系统 需求分析 详细设计 概要设计 测试 总结
  • MFC课程设计 --学生成绩管理系统

    万次阅读 多人点赞 2018-07-26 21:12:55
    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...

    MFC课程设计 ,C++课程设计 --学生成绩管理系统

    ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。

     

     

    • 实验目的
    1. 使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。
    2. 了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。
    3. 熟悉Microsoft Visual Studio2013的开发环境。
    4. 掌握在Microsoft Visual Studio2013开发环境调试程序的方法。
    5. 掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。
    6. 对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

    二、实验内容

     

    本次c++课设的学生成绩管理系统是面向学生和教师的。该系统有三种身份账号,其中学生账号可以在里面查询自己的成绩,而教师账号可以添加,删除和修改学生的成绩,而管理员账号可以添加,删除和修改学生的成绩外,还能可以添加,删除和修改登录使用的账号。

    另外,用单文档设计的学生成绩分析图形绘制。并用该学生成绩管理系统调用该画图的exe文件,实现在该学生成绩管理系统中显示学生成绩的直方图和曲线图。

    登录界面:

     

     

    学生成绩管理界面:

    (1)、设计一个学生类Student,包括数据成员:姓名、学号、五门课程(高等数学,离散数学,C++课设,大学英语,大学体育)的成绩。

    (2)、创建一个基于对话框的MFC应用程序,程序窗口的标题上有你姓名、学号和应用程序名称。使用(1)的类,实现对学生信息和成绩的输入和管理。

    (3)、创建一个单文档的MFC应用程序,读取(2)中保存的文件中的学生成绩,分别用直方图和折线方式显示所有学生某课程的成绩分布图。

    (4)创建一个登录管理界面,学生可以用学生账号登录查看成绩,教师可以使用教师账号登录查看并添加,删除,修改学生的成绩。而管理员账号可以添加,删除和修改学生和老师的登录账号,老师和学生账号只能修改自身的登录密码。

    (5)创建一个学生成绩管理主界面,上面有list控件之间将存储在文件的学生信息显示在主界面上,另外还有查找控件,组合控件进行排序,添加,删除和修改控件。还有账号管理,重新登录和退出控件。

    (6)创建一个学生信息查找后显示的学生详细信息界面,拥有教师账号的用户可以通过对这个界面信息的修改,按下“修改保存”的控件进行信息的修改。

     

     

     

     

     

     

     

    (7)点击组合框排序,按确定键后,会通过list和文件的操作,进行对应的排序。可以进行的排序为:学号,高数成绩,离散成绩,c++课设成绩,英语成绩,体育成绩。排序后的内容会直接显示在学生成绩管理的主界面list中。

     

     

    (8)用单文档对学生成绩储存的文件进行操作,并进行直方图和折线图的绘画。在学生成绩管理住界面点击统计分析,可以直接调用该单文档exe.

     

     

    (8)创建一个重新登录界面,用户可以通过重新登录的方法进行该学生成绩管理系统用户的更换。该界面需要输入学号,旧密码,新密码,再次输入新密码才能修改该账号的密码。

    (9)创建一个登录账号管理界面,只有admin的管理员账号才能进行账号的添加,修改和删除。

    三实验设备

     

    Win7操作系统

    Microsoft Visual Studio2013

     

    四、实验要求

     

    1.  使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。

    2.  了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。

    3掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。

    4对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

     

    五、实验程序

    (1)登录界面

    LoginDlg.cpp的主要关键代码

              //在主界面调用之前在BOOL CMFC课设学生成绩管理系统App::InitInstance()

    中添加

    CLoginDlg dl;

             if (IDCANCEL == dl.DoModal())

                       return FALSE;

    功能是实现先调用登录窗口。

    void CLoginDlg::OnBnClickedOk()    //点击登录的响应函数
    {
    	if (CheckSuer())               //登录账号和密码的确定是否正确
    		CDialog::OnOK();	
    	else
    	{
    		AfxMessageBox("用户名或密码错误");   //密码错误则弹出窗口提示错误
    		SetDlgItemText(IDC_NAME, "");        //重置两个编辑框
    		SetDlgItemText(IDC_PASS, "");
    		this->SetFocus();
    	}
    }
    
    bool  CLoginDlg::CheckSuer()         //账户和密码确认
    {
    	CString szName, szPass;
    	GetDlgItemText(IDC_NAME, szName);
    	GetDlgItemText(IDC_PASS, szPass);
    	szName.MakeLower();
    	
    	if (szName == "admin"&&szPass == "123")    //是否为管理员账号
    	{
    		SUser u = { "admin", "123", 1 };
    		theApp.m_us = u;                    //将登录人员的信息记录在theApp中
    		return TRUE;
    
    	}
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead))
    	{
    		CreatUser();
    		if (!file.Open("./user.dat", CFile::modeRead))
    			return FALSE;
    	}
    	while (file.Read(&u, sizeof(u)))
    	{
    		if (szName == u.sName&&szPass == u.sPass)
    		{
    			theApp.m_us = u;
    			return TRUE;
    		}
    	}
    	return FALSE;
    }
    void CLoginDlg::CreatUser()          //如果不存在账号和密码存储的文件,则新建一个存储文件
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    }
    

    (2)学生成绩管理主界面

    BEGIN_MESSAGE_MAP(CMFC课设学生成绩管理系统Dlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_ManagePower, &CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower)
    	ON_BN_CLICKED(IDC_AGAIN_LOGIN, &CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin)
    	ON_BN_CLICKED(IDC_STUDENT_ADD, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd)
    	ON_BN_CLICKED(IDC_STUDENT_DEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel)
    	ON_BN_CLICKED(IDC_STUDENT_SEEK, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek)
    	ON_BN_CLICKED(IDC_STUDENT_CHANGE, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange)
    	ON_BN_CLICKED(IDC_BUTTON8, &CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8)
    	ON_BN_CLICKED(IDC_STUDENT_IDCANCEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel)
    	ON_BN_CLICKED(IDC_STUDENT_DIALOG_OKSORT, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort)
    	ON_BN_CLICKED(IDC_PICTURE_ANALYSIS, &CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis)
    END_MESSAGE_MAP()
    
    
    // CMFC课设学生成绩管理系统Dlg 消息处理程序
    
    BOOL CMFC课设学生成绩管理系统Dlg::OnInitDialog()  //初始化窗口
    {
    	CDialogEx::OnInitDialog();
    	CString str = "1606100*** 卟咚君 学生成绩管理系统           用户:";    //在窗口左上角设置自己的姓名和学号(课设要求),以及本次显示登录的账号
    	str += theApp.m_us.sName;
    	SetWindowText(str);
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);     // 初始化(IDC_STUDENT_DIALOG)ListCtrl控件
    	pList->InsertColumn(0, "体育", 0, 80);    
    	pList->InsertColumn(0, "英语", 0, 80);
    	pList->InsertColumn(0, " c++", 0, 80);
    	pList->InsertColumn(0, "离散", 0, 80);
    	pList->InsertColumn(0, "高数", 0, 80);
    	pList->InsertColumn(0, "姓名", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	SortStudent(0);
    	ReadStudent(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //设置(IDC_STUDENT_DIALOG)CComboBox控件
    	pComb->AddString("学号");   
    	pComb->AddString("高数");
    	pComb->AddString("离散");
    	pComb->AddString("c++");
    	pComb->AddString("英语");
    	pComb->AddString("体育");
    	pComb->SetCurSel(0);
    	CComboBox* pComb1 = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //获得排列组合控件的信息
    	int nSel = pComb1->GetCurSel();
    	GetDlgItem(IDC_STUDENT_ADD)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽添加权限
    	GetDlgItem(IDC_STUDENT_DEL)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽删除权限
    	GetDlgItem(IDC_STUDENT_CHANGE)->EnableWindow(theApp.m_us.nPrior);   //对应相应的身份权限设置是否屏蔽修改权限
    	//pComb->SetItemHeight(25,25);
    	//GetDlgItem(IDC_ManagePass)->EnableWindow(theApp.m_us.nPrior);
    	//GetDlgItem(IDC_ManagePower)->EnableWindow(theApp.m_us.nPrior);
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	// TODO:  在此添加额外的初始化代码
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CMFC课设学生成绩管理系统Dlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作区矩形中居中
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CMFC课设学生成绩管理系统Dlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower()    //“账号管理”控件响应函数,调用 CPower(管理权限)类的窗口
    {
    	CPower dl;
    	dl.DoModal();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin()   //“重新登录”控件响应函数
    {
    	CDialog::OnCancel();                                    //关闭当前的学生成绩管理系统窗口
    	CLoginDlg dl;                                          //调用登录窗口
    	if (IDOK == dl.DoModal())                              //成功登录返回IDOK,在调用新的学生成绩管理系统窗口
    	{                                                      //登录退出则返回IDCANCEL
    		CMFC课设学生成绩管理系统Dlg dlg;
    		dlg.DoModal();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd()    //“添加”控件响应函数,调用IDD_StudentSpecificAddDlg添加窗口,添加学号和相应成绩信息
    {
    	CStudentSpecificAddDlg dl;
    	if (IDCANCEL == dl.DoModal())
    	{
    		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //关闭IDD_StudentSpecificAddDlg添加窗口,读取储存学生成绩的文件刷新学生成绩管理系统窗口
    		CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    		OnBnClickedStudentDialogOksort();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::ReadStudent(CListCtrl* pList)    //读取储存学生成绩的文件,并加载在学生成绩管理系统窗口的CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		GreatStudentfile();
    		return;
    	}
    	pList->DeleteAllItems();
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sId);
    		pList->SetItemText(i, 1, u.sName);
    		pList->SetItemText(i, 2, u.sHigher_math);
    		pList->SetItemText(i, 3, u.sDiscrete_math);
    		pList->SetItemText(i, 4, u.sC_program);
    		pList->SetItemText(i, 5, u.sEnglish);
    		pList->SetItemText(i, 6, u.sSports);
    		i++;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatStudentfile()   //创建用户登录账号储存文件
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel()  // “删除”控件响应函数
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	Student ur;
    	int nSel = pList->GetSelectedCount();    //获取当前鼠标选择的学号数量
    	if (nSel < 1)
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	int nSelText = pList->GetSelectionMark();   //获取当前鼠标选择的一个学号位置
    	pList->GetItemText(nSelText, 0, ur.sId, sizeof(ur.sId));
    	pList->DeleteItem(nSelText);   //删除当前鼠标选择的学号位置
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	CFile temporaryfile;
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeCreate|CFile::modeWrite| CFile::shareDenyNone))
    	{
    		GreatTemporaryStudentfile();
    		return;
    	}
    	Student u;
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //读取学生成绩储存文件,将未删除的学生信息写入临时文件temporaryfile中
    	{
    		if ((CString)u.sId == (CString)ur.sId)
    			continue;
    		temporaryfile.Write(&u, sizeof(u));
    	}
    	file.Close();
    	temporaryfile.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeCreate|CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (temporaryfile.Read(&u, sizeof(u)) == sizeof(u))  //读取学生成绩储存文件,将临时文件temporarystudentfile.dat中学生信息写入真正存储学生信息的studentfile.dat中
    		file.Write(&u, sizeof(u));
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);  //更新学生成绩管理系统界面的信息
    	OnBnClickedStudentDialogOksort();
    	return;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek()   //“查找”控件对应的函数,查找学生的学号
    {
    	int nNum;
    	char str[20];
    	GetDlgItemText(IDC_STUDENT_DIALOG_ID, str, sizeof(str));  //获取编辑框的学号信息
    	if ((CString)str == "")
    	{
    		AfxMessageBox("请在学号框里输入学号!");
    		return;
    	}
    	nNum = Seek_Student(str);  //查询该学号是否存在
    	if (nNum == -1)
    	{
    		AfxMessageBox("该用户不存在!");
    	}
    	Student u;
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //查询该学号同学的详细信息
    	{
    		if ((CString)u.sId == (CString)str)
    		{
    			theApp.m_student = u;
    			file.Close();
    			CStudentSpecificSeekDlg dlg;  //将该学号同学的详细信息显示在详细信息窗口(IDD_STUDENT_SPECIFIC_DIALOG)
    			if (IDCANCEL == dlg.DoModal())
    			{
    				CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //更新学生成绩管理系统界面的信息
    				CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    			}
    			return;
    		}
    	}
    	file.Close();
    }
    
    
    int CMFC课设学生成绩管理系统Dlg::Seek_Student(char *str)   //查询该同学是否存在学生成绩管理系统的CListCtrl中
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	int nCount = pList->GetItemCount();
    	int i = 0;
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == (CString)str)
    		{
    			return i;
    		}
    		i++;
    	}
    	return -1;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange()  //"修改“控件响应的函数,修改学生的信息
    {
    	
    	OnBnClickedStudentSeek();                                  //调用查找函数,修改在查找函数中实现
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8()          //"退出”控件响应函数,退出学生成绩管理系统
    {
    	CDialog::OnCancel();
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel()
    {
    	CDialog::OnCancel();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatTemporaryStudentfile()    //创建临时存储学生信息的文件
    {
    	CFile file;
    	if (!file.Open("./temporarystudentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort()  //排序"确定”控件响应函数,进行(学号,高数,离散,c++课设,英语,体育成绩)的排序
    {
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);
    	int nSel = pComb->GetCurSel();
    	SortStudent(nSel);
    	
    }
    
    bool nsort_id(Student a, Student b)  //学号(ID)大小比较函数
    {
    	return _ttoi((CString)a.sId)<_ttoi((CString)b.sId);  //将char转换成CString,在转化成int
    }
    bool sort_higher_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sHigher_math)>_ttoi((CString)b.sHigher_math);  //高数(Higher_math)大小比较函数
    }
    bool sort_discrete_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sDiscrete_math) > _ttoi((CString)b.sDiscrete_math);  //离散(Discrete_math)大小比较函数
    }
    bool sort_c_program(Student a, Student b)
    {
    	return _ttoi((CString)a.sC_program) > _ttoi((CString)b.sC_program);   //c++(C_program)大小比较函数
    }
    bool sort_english(Student a, Student b)
    {
    	return _ttoi((CString)a.sEnglish) > _ttoi((CString)b.sEnglish); //英语(English)大小比较函数
    }
    bool sort_sports(Student a, Student b)
    {
    	return _ttoi((CString)a.sSports)> _ttoi((CString)b.sSports);   //英语(Sports)大小比较函数
    }
    void CMFC课设学生成绩管理系统Dlg::SortStudent(int nNum)    //对应排序对学生信息进行排序
    {
    	Student SomeStudent[1000];
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int i = 0;
    	while (file.Read(&SomeStudent[i], sizeof(SomeStudent[i])) == sizeof(SomeStudent[i]))
    	{
    		i++;
    	}
    	file.Close();
    	int b = (CString)SomeStudent[0].sId < (CString)SomeStudent[1].sId;
    	if (nNum == 0)    //0是学号成绩排序
    		std::sort(SomeStudent, SomeStudent+i, nsort_id);  //排序是直接调用STL中的快排
    	if (nNum == 1)     //1是高数成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_higher_math);
    	if (nNum == 2)    //2是离散成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_discrete_math);
    	if (nNum == 3)    //3是C++课设成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_c_program);
    	if (nNum == 4)    //4是英语成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_english);
    	if (nNum == 5)    //5是体育成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_sports);
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int t = 0;
    	while (t<i)  //将排好序的信息写入学生成绩存储文件
    	{
    		file.Write(&SomeStudent[t], sizeof(SomeStudent[t]));
    		t++;
    	}
    	file.Close();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList); //将排好序的学生信息更新到学生成绩管理系统的CListCtrl中
    
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis()  //"统计分析“控件响应的函数
    {
    	ShellExecute(NULL, "open", "E://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//MFCApplication1.exe", NULL, NULL, SW_SHOWNORMAL);
    	//用ShellExecute调用可以画直方图和折线图的exe文件
    }
    

    3)添加学生信息的窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificAddDlg, CDialog)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_SAVE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_INCANCE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificAddDlg 消息处理程序
    
    
    BOOL CStudentSpecificAddDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	return TRUE;
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave()  //"添加保存:控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ID, u.sId, sizeof(u.sId));  //将学号编辑框的内容写入u.sId
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_NAME, u.sName, sizeof(u.sName));  //将姓名编辑框的内容写入u.sName
    	if (IDC_STUDENG_SPECIFIC_ADD_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	//IDC_STUDENG_SPECIFIC_ADD_MALE为“男”控件ID,IDC_STUDENG_SPECIFIC_ADD_FEMALE为“女'控件的ID
    	//用GetCheckedRadioButton函数获取RadioButton控件的信息,GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE)返回
    	//IDC_STUDENG_SPECIFIC_ADD_MALE则为男,否则为女
    
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_AGE, u.sAge, sizeof(u.sAge));  //将年龄编辑框的内容写入u.sAge
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ADDRESS, u.sAddress, sizeof(u.sAddress));  //将地址编辑框的内容写入u.sAddress
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));  //将高数编辑框的内容写入u.sHigher_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));  //将离散编辑框的内容写入u.sDiscrete_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_CPROGRAM, u.sC_program, sizeof(u.sC_program));  //将C++课设编辑框的内容写入u.sC_program
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ENGLISH, u.sEnglish, sizeof(u.sEnglish));   //将英语编辑框的内容写入u.sEnglish
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_SPORTS, u.sSports, sizeof(u.sSports));   //将体育编辑框的内容写入u.sSports
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeReadWrite|CFile::shareDenyNone))
    	{
    		AfxMessageBox("添加失败,文件打不开!");
    		return ;
    	}
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))   //读取学生文件信息,看学号是否重复
    	{
    		if ((CString)ur.sId == (CString)u.sId)
    		{
    			AfxMessageBox("用户已存在!");
    			return;
    		}
    	}
    	file.SeekToEnd();   //将指针移到文件末尾
    	file.Write(&u, sizeof(u));  //在文件末尾写入新的学生信息
    	AfxMessageBox("添加保存成功!"); //提示保存成功
    	
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance()  //“退出”控件响应函数,退出添加窗口
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    4)查找和删除窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificSeekDlg, CDialog)
    	ON_BN_CLICKED(IDOK, &CStudentSpecificSeekDlg::OnBnClickedOk)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_CHANGE_SAVE, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_IDCACEL, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificSeekDlg 消息处理程序
    
    
    BOOL CStudentSpecificSeekDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_STUDENG_SPECIFIC_CHANGE_SAVE)->EnableWindow(theApp.m_us.nPrior); //获取账号的权限信息,是否屏蔽“删除”控件
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ID,theApp.m_student.sId);  //设置显示的学生的学号
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, theApp.m_student.sName);  //设置显示的学生的姓名
    	if (theApp.m_student.nSex==1)
    	    CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_MALE);
    	else
    		CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_FEMALE);
    	//设置显示的学生的性别
    	//用CheckRadioButton设置RadioButton的显示
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, theApp.m_student.sAge); //设置显示的学生的年龄
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, theApp.m_student.sAddress); //设置显示的学生的地址
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, theApp.m_student.sHigher_math);//设置显示的学生的高数成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, theApp.m_student.sDiscrete_math);//设置显示的学生的离散成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, theApp.m_student.sC_program);//设置显示的学生的c++课设成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, theApp.m_student.sEnglish);//设置显示的学生的英语成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, theApp.m_student.sSports);//设置显示的学生的体育成绩
    	return TRUE;
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedOk()  //"退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnOK();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave() //"修改”控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ID, u.sId, sizeof(u.sId));    //将新的信息写入u(Student)中
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, u.sName, sizeof(u.sName));
    
    	if (IDC_STUDENG_SPECIFIC_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, u.sAge, sizeof(u.sAge));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, u.sAddress, sizeof(u.sAddress));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, u.sC_program, sizeof(u.sC_program));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, u.sEnglish, sizeof(u.sEnglish));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, u.sSports, sizeof(u.sSports));
    	CFile file;
    	//file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone);
    	if ((CString)u.sId != (CString)theApp.m_student.sId)
    	{
    		AfxMessageBox("请输入同一学号!");
    		SetDlgItemText(IDC_STUDENG_SPECIFIC_ID, theApp.m_student.sId);
    		return;
    	}
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	int i = 0;
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))  //读取学生成绩储存文件,找到该学生信息储存的对应位置
    	{
    		if ((CString)theApp.m_student.sId == (CString)ur.sId)
    		{
    			break;
    		}
    		i++;
    	}
    	file.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	file.SeekToBegin(); // 重新设置file文件的写指针时期刚好在要修改的学生信息那里
    	file.Seek(i*sizeof(u), CFile::current);
    	file.Write(&u, sizeof(u));  //用新的信息对原来的信息进行覆盖,实现修改
    	AfxMessageBox("修改保存成功!");
    	file.Close();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel() // "退出“控件响应函数
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    (5)“账号管理”窗口

    BEGIN_MESSAGE_MAP(CPower, CDialog)
    	ON_BN_CLICKED(IDC_ManagePass, &CPower::OnBnClickedManagepass)
    	ON_BN_CLICKED(IDC_ChangePass, &CPower::OnBnClickedChangepass)
    	ON_BN_CLICKED(IDC_MANAGE_CHANGE_PASS, &CPower::OnBnClickedManageChangePass)
    	ON_BN_CLICKED(IDC_GENERAL_CHANGE_PASS, &CPower::OnBnClickedGeneralChangePass)
    	ON_BN_CLICKED(IDCANCEL, &CPower::OnBnClickedCancel)
    END_MESSAGE_MAP()
    
    
    // CPower 消息处理程序
    
    
    void CPower::OnBnClickedManagepass()  //“学号密码添加与删除”控件响应函数,调用管理员窗口,进行学号密码添加与删除
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CManagePower dl;  
    	dl.DoModal();
    }
    
    
    void CPower::OnBnClickedChangepass()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedManageChangePass() //“学号密码添加与删除”控件响应函数,调用管理员(CManagePower)窗口,进行学号密码的修改
    {
    	CManagePower dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedGeneralChangePass() //“学号密码修改”控件响应函数,调用密码修改(CChangePass)窗口,学生和教师权限的账号可通过这个进行学号密码的修改
    {
    	CChangePass dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    BOOL CPower::OnInitDialog()  //账号管理窗口的初始化,根据用户的权限是否屏蔽“学号密码添加与删除”控件
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_MANAGE_CHANGE_PASS)->EnableWindow((CString)theApp.m_us.sName=="admin");
    	return TRUE;
    }
    
    
    void CPower::OnBnClickedCancel() //“退出”控件响应函数,退出账号管理窗口
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnCancel();
    }
    

    (6)学号密码修改窗口

    BEGIN_MESSAGE_MAP(CChangePass, CDialog)
    	ON_BN_CLICKED(IDC_OKCHANGE_PASS, &CChangePass::OnBnClickedOkchangePass)
    END_MESSAGE_MAP()
    
    
    // CChangePass 消息处理程序
    
    
    BOOL CChangePass::Check_ChangePass() //修改“确定”控件响应函数
    {
    	CString szName, szOrdedPass, szNewPassOne, szNewPasstwo; //获取要修改的学号和密码
    	GetDlgItemText(IDC_CHANGEPASS_NAME, szName);
    	GetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, szOrdedPass);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, szNewPassOne);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, szNewPasstwo);
    	szName.MakeLower();
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeReadWrite))
    	{
    		return FALSE;
    	}
    	int i = 0;
    	while (file.Read(&u, sizeof(u)))   //两次输入新密码的确认
    	{
    		if (szName == (CString)u.sName&&szOrdedPass == (CString)u.sPass)
    		{
    			if (szNewPassOne != szNewPasstwo)
    			{
    				AfxMessageBox("新密码两次输入不正确!");
    				InitCCangePassDialog();
    			}
    			strcpy_s(u.sPass, szNewPassOne);
    			file.SeekToBegin();
    			file.Seek(i*sizeof(u), CFile::current);
    			file.Write(&u, sizeof(u));
    			AfxMessageBox("修改成功!");
    			InitCCangePassDialog();
    			return TRUE;
    		}
    		i++;
    	}
    	AfxMessageBox("该用户或旧密码不正确!");
    	InitCCangePassDialog();
    	return FALSE;
    }
    
    
    void CChangePass::OnBnClickedOkchangePass()  //修改“确定”控件响应函数
    {
    	Check_ChangePass();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CChangePass::InitCCangePassDialog()  //重置学号密码修改窗口的编辑框
    {
    	SetDlgItemText(IDC_CHANGEPASS_NAME, "");
    	SetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, "");
    	this->SetFocus();
    }
    (6)学号密码添加与删除窗口
    BEGIN_MESSAGE_MAP(CManagePower, CDialog)
    	ON_CBN_SELCHANGE(IDC_MANAGEPOWER_POWER, &CManagePower::OnCbnSelchangeManagepowerPower)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_PASS, &CManagePower::OnEnChangeManagepowerPass)
    	ON_BN_CLICKED(IDC_ADD, &CManagePower::OnBnClickedAdd)
    	ON_BN_CLICKED(IDCANCEL, &CManagePower::OnBnClickedCancel)
    	ON_BN_CLICKED(IDC_DEL, &CManagePower::OnBnClickedDel)
    	ON_BN_CLICKED(IDC_CHANGE, &CManagePower::OnBnClickedChange)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_NAME, &CManagePower::OnEnChangeManagepowerName)
    END_MESSAGE_MAP()
    
    
    // CManagePower 消息处理程序
    
    
    
    
    BOOL CManagePower::OnInitDialog() //学号密码添加与删除窗口的初始化
    {
    	CDialog::OnInitDialog();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	pList->InsertColumn(0, "身份", 0, 100); //学号密码添加与删除窗口中CListCtrl(IDC_MANAGEPOWER_LIST)初始化
    	pList->InsertColumn(0, "密码", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	ReadUser(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	pComb->AddString("学生");  学号密码添加与删除窗口中CComboBox(IDC_MANAGEPOWER_POWER)初始化
    	pComb->AddString("老师");
    	pComb->SetCurSel(0);
    	return TRUE;
    }
    
    
    void CManagePower::OnCbnSelchangeManagepowerPower()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnEnChangeManagepowerPass()
    {
    	// TODO:  如果该控件是 RICHEDIT 控件,它将不
    	// 发送此通知,除非重写 CDialog::OnInitDialog()
    	// 函数并调用 CRichEditCtrl().SetEventMask(),
    	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
    
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnBnClickedAdd()  //"添加“控件响应函数,添加新的用户账号
    {
    	// TODO:  在此添加控件通知处理程序代码
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName)); //获取账号编辑框的信息
    	strlwr(u.sName);    //u.sName大写转小写
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST); //获取密码编辑框的信息
    	int i = 0;
    	int nCount = pList->GetItemCount(); //获取权限的信息
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == u.sName)   //检验是否存在该用户
    		{
    			AfxMessageBox("用户已存在");
    			return;
    		}
    		i++;
    	}
    	pList->InsertItem(nCount, u.sName);  //将新用户的信息添加入列表
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	pList->SetItemText(nCount, 1, u.sPass);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	int nSel = pComb->GetCurSel();
    	if (nSel)
    		pList->SetItemText(nCount, 2, "老师");
    	else
    		pList->SetItemText(nCount, 2, "学生");
    }
    
    void CManagePower::OnBnClickedCancel() //”退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	OnDestroy();  //退出前进行保存
    	CDialog::OnCancel();
    }
    
    
    void CManagePower::OnDestroy()   //关闭学号密码添加与删除窗口,关闭之前先将列表的信息保存在账户信息文件中
    {
    	CDialog::OnDestroy();
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("保存文件时失败!");
    		return;
    	}
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	int i = 0;
    	int nCount = pList->GetItemCount();
    	SUser u;
    	while (i < nCount)
    	{
    		pList->GetItemText(i, 0, u.sName, sizeof(u.sName));
    		pList->GetItemText(i, 1, u.sPass, sizeof(u.sPass));
    		u.nPrior = pList->GetItemText(i, 2) == "老师";
    		file.Write(&u, sizeof(u));
    		i++;
    	}
    	file.Close();
    	AfxMessageBox("保存文件成功!");
    }
    
    
    
    
    
    void CManagePower::ReadUser(CListCtrl* pList)  //读取学生成绩存储文件,将其显示在学号密码添加与删除窗口CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead | CFile::shareDenyNone))
    		return;
    	pList->DeleteAllItems();
    	SUser u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sName);
    		pList->SetItemText(i, 1, u.sPass);
    		pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    		i++;
    	}
    	file.Close();
    }
    	
    	
    
    
    void CManagePower::OnBnClickedDel()  //”删除“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	strlwr(u.sName);
    	
    	int nSel = pList->GetSelectedCount(); //选择一个账户
    	if (nSel < 1&&u.sName=="")
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			pList->DeleteItem(nSelText);
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    				pList->DeleteItem(nSelText);
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    }
    
    
    void CManagePower::OnBnClickedChange() //"修改“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);//获取需要更改信息
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	strlwr(u.sName);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	u.nPrior = pComb->GetCurSel();
    	int nSel = pList->GetSelectedCount();
    	if (nSel < 1 && u.sName == "")
    	{
    		AfxMessageBox("请选择一个账户再!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")  //进行账户密码信息更改
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				pList->InsertItem(i, u.sName);
    				pList->SetItemText(i, 1, u.sPass);
    				pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			pList->DeleteItem(nSelText);
    			pList->InsertItem(nSelText, ur.sName);
    			pList->SetItemText(nSelText, 1, u.sPass);
    			pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(u.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    			{
    				pList->DeleteItem(nSelText);
    				pList->InsertItem(nSelText, ur.sName);
    				pList->SetItemText(nSelText, 1, u.sPass);
    				pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    			}
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    
    }
    

    (7)用单文档读取学生成绩文件,进行直方图和折线图的绘画

    void CMFCApplication1View::OnDraw(CDC* pDC)
    {
    	CMFCApplication1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    }
    
    // CMFCApplication1View 打印
    
    BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加额外的打印前进行的初始化过程
    }
    
    void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加打印后进行的清理过程
    }
    
    
    // CMFCApplication1View 诊断
    
    #ifdef _DEBUG
    void CMFCApplication1View::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CMFCApplication1View::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
    	return (CMFCApplication1Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CMFCApplication1View 消息处理程序
    
    
    void CMFCApplication1View::DrawScore(CDC* pDC, int * fScore, int nNum) //画直方图函数
    {
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	int nSegNum = sizeof(nScoreNum) / sizeof(int); // 计算有多少个分数段
    
    	// 求分数段上最大的人数 
    	int nNumMax = nScoreNum[0];
    	for (int i = 1; i < nSegNum; i++)
    	{
    		if (nNumMax < nScoreNum[i])
    			nNumMax = nScoreNum[i];
    	}
    	CRect rc;
    	GetClientRect(rc);
    	rc.DeflateRect(180, 40);      // 缩小矩形大小  
    	int nSegWidth = rc.Width() / nSegNum;   // 计算每段的宽度  
    	int nSegHeight = rc.Height() / nNumMax;   // 计算每段的单位高度  
    	COLORREF crSeg = RGB(0, 0, 192);  // 定义一个颜色变量   
    	CBrush brush1(HS_FDIAGONAL, crSeg);
    	CBrush brush2(HS_BDIAGONAL, crSeg);
    	CPen   pen(PS_INSIDEFRAME, 2, crSeg);
    	CBrush* oldBrush = pDC->SelectObject(&brush1);   // 将brush1选入设备环境   
    	CPen* oldPen = pDC->SelectObject(&pen);  // 将pen选 入设备环境  
    	CRect rcSeg(rc);
    	rcSeg.right = rcSeg.left + nSegWidth;   // 使每段的矩形宽度等于nSegWidth  
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	CRect rcStr;
    	for (int i = 0; i<nSegNum; i++)
    	{  // 保证相邻的矩形填充样式不相同    
    		if (i % 2)
    			pDC->SelectObject(&brush2);
    		else
    			pDC->SelectObject(&brush1);
    		rcSeg.top = rcSeg.bottom - nScoreNum[i] * nSegHeight - 2;  // 计算每段矩形的高度   
    		pDC->Rectangle(rcSeg);
    		if (nScoreNum[i] > 0)
    		{
    			CString str;
    			str.Format((CString)"%d人", nScoreNum[i]);
    			pDC->DrawText(str, rcSeg, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		}
    		rcStr = rcSeg;
    		rcStr.top = rcStr.bottom + 2;
    		rcStr.bottom += 20;
    		pDC->DrawText(strSeg[i], rcStr, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		rcSeg.OffsetRect(nSegWidth, 0);  // 右移矩形   
    	}
    	pDC->SelectObject(oldBrush);  // 恢复原来的画刷属性   
    	pDC->SelectObject(oldPen);    // 恢复原来的画笔属性 
    
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	pControlDC->MoveTo(180, 40);  //画y轴
    	pControlDC->LineTo(180,380);
    	pControlDC->MoveTo(180, 380);//画x轴
    	pControlDC->LineTo(900, 380);
    }
    
    
    int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)// 创建各个成绩显示控件
    {
    	if (CView::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	m_button1.Create((CString)"高等数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 10, 120, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH);                      //该按钮对应的ID号
    	m_button1.ShowWindow(SW_SHOWNORMAL);
    	m_button2.Create((CString)"离散数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 60,120, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH);                      //该按钮对应的ID号
    	m_button2.ShowWindow(SW_SHOWNORMAL);
    	m_button3.Create((CString)"c+课设(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 110, 120, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM);                      //该按钮对应的ID号
    	m_button3.ShowWindow(SW_SHOWNORMAL);
    	m_button4.Create((CString)"大学英语(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 160, 120, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH);                      //该按钮对应的ID号
    	m_button4.ShowWindow(SW_SHOWNORMAL);
    	m_button5.Create((CString)"大学体育(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 210, 120, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS);                      //该按钮对应的ID号
    	m_button5.ShowWindow(SW_SHOWNORMAL);
    	// TODO:  在此添加您专用的创建代码
    
    	m_button6.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 10, 170, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH_LINE);                      //该按钮对应的ID号
    	m_button6.ShowWindow(SW_SHOWNORMAL);
    	m_button7.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 60, 170, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH_LINE);                      //该按钮对应的ID号
    	m_button7.ShowWindow(SW_SHOWNORMAL);
    	m_button8.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 110, 170, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM_LINE);                      //该按钮对应的ID号
    	m_button8.ShowWindow(SW_SHOWNORMAL);
    	m_button9.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120,160 , 170, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH_LINE);                      //该按钮对应的ID号
    	m_button9.ShowWindow(SW_SHOWNORMAL);
    	m_button10.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 210, 170, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS_LINE);                      //该按钮对应的ID号
    	m_button10.ShowWindow(SW_SHOWNORMAL);
    	return 0;
    }
    void CMFCApplication1View::OnClickButton_higher_math_show() //高数成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_show()  //离散成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_show()  //C++成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_show() //英语成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_show()//体育成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::Drawlist(CDC* pDC, int* fScore, int nNum)//画折线图
    { 
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	pControlDC->MoveTo(180, 40);//画线的开始位置
    	pControlDC->LineTo(180, 380);
    	pControlDC->MoveTo(180, 380);//画线的开始位置
    	pControlDC->LineTo(900, 380);
    	pControlDC->MoveTo(180, 380);
    	for (int i = 0; i < 5; i++)
    	{
    		pControlDC->SetPixel(0, 290, RGB(0, 0, 255));  //设置点的位置及颜色
    		pControlDC->LineTo(i*140+220, 380 - (380*nScoreNum[i]/nNum));//换两点之间的线
    		str.Format("%d人", nScoreNum[i]);
    		pControlDC->TextOut(i * 140 + 220,380 - (380 * nScoreNum[i] / nNum)-20, str);//在线的上方输出文字
    		pControlDC->TextOut(i * 140 + 220, 390, strSeg[i]);
    	}
    }
    void CMFCApplication1View::OnClickButton_higher_math_listshow()//高数成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_listshow()//离散成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_listshow()//c++课设成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_listshow()//英语成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_listshow()//体育成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    

    六.实验中的问题和提高

    这个学生成绩管理系统中的安全措施并不完善,整个软件也没有加壳,以至于这个软件可以直接被脱壳并找出管理员的登录账号和密码,我目前的能力水平有限,还不能对软件进行加壳加密操作。

    这个学生成绩管理系统的用户界面还不是很好看,使用的方面和一般的登录界面还是有点违和感。

    七、总结心得

    (1)刚开始的课设制作的时候,出现了很多变量的设置,变量一多,就容易搞混,后来,我统一使用了微软标准命名法进行控件和窗口ID以及函数,类,变量的命名。这样在多个窗口的界面开发的过程中才不容易搞混。

    (2)在修改文件内容的时候,我想使用file.Seek(-sizeof(u),CFile:: current)进行写指针向前移动,但是出现了内存溢出的问题。我查不出问题出现在那里,后来使用了SeekToBegin()

    和file.Seek(i*sizeof(u),CFile:: current)才解决问题,可以在学生成绩的存储文件直接进行覆盖修改。

    (3)之前学会了GetDlgItemText()的用法,后来在MFC类库中查询到还有SetDlgItemText()的用法,可以直接在编辑框控件中提取信息,而不用设置变量。

    (4)在RadioButton控件的使用中,我不知道如何提取按键和设置按键的信息,后来在网上查到GetCheckedRadioButton(IDC,IDC)和CheckRadioButton(IDC,IDC,IDC)这两个函数才解决问题。

    (5)这个学生成绩管理系统的设置,比原本的实验要求高出了很多。我添加了登录管理系统在里面。这个学生管理系统即使面对教师的,也是面对学生的。学生可以快速查询自己的成绩,而教师还能添加,删除和修改学生的成绩,而学生和老师账户可以通过管理员账号添加,删除,和修改。

    (6)我在排序中重新定义了六种不同对象比较大小的方法,然后调用STL中的快排函数实行快排。与一般的冒泡之类的排序方法不同的是,快排是通过不断二分插入的方法进行排序的,时间复杂度为nlogn,大大节省了排序时间。

    (7)由于我是在一个单文档中通过按钮消息映射绘制五种直方图和五种折线图。在清空界面的时候,我调用了InvalidateRect(NULL)这个函数实行清空操作,但是却出现了连自己将要绘制的图形也清空了的现象,后来添加了UpdateWindow()这个函数才得以解决。

    (8)在运用单文档读取文件信息绘制直方图和折线图的时候,要细心修改自己设置的矩形和顶点的参数,以及移动时的参数,使得绘图界面美观整齐。

    (9)在学生管理系统中,我设置了统计分析这个控件,调用了ShellExecute这个函数,然后这个函数可以调用我画图的exe文件,因此,我可以在学生管理系统中直接显示学生成绩的直方图和折线图。

    (10)大总结:通过对学生成绩管理系统的可视化编程,了解了开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。了解了MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。明白了控件是Windows图形用户界面的主要组成部分之一,掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制的基本用法。看着同学们不断的完成自己的课设,我还是坚持将这个学生成绩管理系统做的更好,通过加入登录和权限限制,让它不仅能服务与老师,同时也能运用于学生,并实行五门成绩的管理和统计绘图。在不断地网上查询资料和在类库中了解函数的方法,才终于完成了这个学生成绩管理系统。

     

     

     

     

     

     

     

     

     

    展开全文
  • 数据库原理及Oracle开发课程设计 题 目 选课管理系统 系 (部) 电信系 班 ...一设计题目内容及要求 题目 选课管理系统 内容:1分析与流程设计 2相关程序设计实现调试 3课程设计总结报告 要求1在选课管理过程中实现信息自
  • 4.1.1课程管理模块 9 4.1.2补助管理模块 9 4.1.3成绩信息管理模块 10 4.1.4学生档案管理模块 10 4.2总结 10 5.数据库设计 11 5.1数据库需求分析 11 5.2数据库表实体 11 5.3 各表的物理结构 12 6.系统设计 ...
  • 一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并...
  • C语言课程设计设计报告制作人:学号:指导老师:时间:一、设计内容和设计要求1、设计内容题目:学生成绩管理系统设计该系统包含20个学生姓名和成绩信息,可对成绩进行排序,并实现由姓名查找成绩及由成绩查找姓名。...

    ????????????????????????????????????????????????????????????????????????????????????????????????C语言课程设计

    制作人:

    学号:

    指导老师:

    时间:

    一、设计内容和设计要求

    1、设计内容

    题目:学生成绩管理系统设计

    该系统包含20个学生姓名和成绩信息,可对成绩进行排序,

    并实现由姓名查找成绩及由成绩查找姓名。

    2、设计要求

    1)由键盘输入20个学生(姓名)的某门课程的学习成 绩60~99分。

    2)将分数由低到高排序(用直接排序法和冒泡法),并显示学生姓名和对应的分数。

    3) 用线性搜索法检索某个学生的成绩(输入姓名,显示成绩)。

    4 )*对分搜索法检索某个学生的成绩(输入成绩,显示姓名)。

    设计思路

    首先是要建立20个学生信息,即学生姓名和学生成绩,使用子函数input输入,学生成绩使用一维数组,学生姓名使用二维数组。然后分别定义四个子函数,即直接排序法、冒泡排序法和线性查找法、对分查找法。在两个排序法中,用字符串拷贝函数来实现姓名的交换,另外,在用成绩查找姓名时,可以用直接查找,也可以用对分查找法,在这里我两种方法都使用了。最后在主函数中来设计人机界面,用switch函数来实现操作选择,对应的情况中就调用之前定义的子函数来完成排序或查找。

    程序设计流程图

    1、程序总体流程

    开始

    输入学生姓名和成绩

    主菜单

    排序 退出 查找

    直接排序 冒泡排序 查找成绩 查找姓名

    展开全文
  • 设计一个实用的学生通讯录管理系统,能以简便高效的方式对通讯录进行管理和检索,具体要示: 录入:学生通讯录信息包括:学号,姓名,地址,电话。以结构数组或数据文件的形式存放通讯录信息。 更新:增加、删除...
  • 简单学生成绩管理系统设计与实现 设计目的及内容要求 1 设计目的 巩固和加深学生对高级语言程序设计课程的基本知识的理解和掌握掌握 java 语言编程和程序调 试的基本技能利用 java 语言进行基本的软件设计提高...
  • 学生通讯系统设计与实现 学生通讯系统信息包括:姓名、学号、性别、家庭住址、联系电话、等信息。现要求编写程序来完成如下功能: 1.学生通讯信息的输入 2.学生通讯信息的显示 3.学生通讯信息的统计 4.学生...
  • 目录 1 C++ 课程设计实验目的. 2 2 课程设计内容. 2 2.1? 课程设计的题目及简介. 2 2.2? 设计思路说明.... 程序实现.... 程序流程图.... 文件流的实现.... 9 4 学习小结....C++课程设计实验通过设计一个学生成绩管理系统
  • C#实现一个小型的信息管理系统课程设计报告,报告简单介绍了程序代码和运行结果。
  • javaweb学生管理系统课程设计

    万次阅读 多人点赞 2016-07-22 08:47:33
    本人计划编写一个简单的学生管理系统,主要从两个身份来说——老师和学生,对于老师来说,带验证码的登录注册,对学生进行增删改查,以分页的形式展示学生的所有信息;对于学生来说,带验证码的登录注册,以及查询...

    项目地址:
    链接: https://pan.baidu.com/s/1Ul97vJQ6dVRqCAw6i5jHhg
    提取码: mpwt

    1.设计任务书
    1.1 简单的学生管理体统
    本人计划编写一个简单的学生管理系统,主要从两个身份来说——老师和学生,对于老师来说,带验证码的登录注册,对学生进行增删改查,以分页的形式展示学生的所有信息;对于学生来说,带验证码的登录注册,以及查询自己的信息,修改自己的信息,以及查询其他学生的信息除密码以外。具体要求如下:
    1、实现数据库连接,数据库有两个表,一个教师表,一个学生表教师表只有简单的username和password两个属性,学生表有sid name password gender birthday address等属性;
    2、学生信息的增删改查;
    3、写出老师及学生的登录注册的代码;
    4、用代码生成一张验证码;
    5、对学生信息进行分页
    6、在网页上具体操作,并显示结果
    1.2 本系统涉及的知识点
    函数、数据库、jsp、servlet、面向对象、动画
    2.功能设计(左对齐,宋体粗四号)
    2.1 算法设计
    本系统需要实现的功能要求:
    教师登陆成功后会有以下选择如图1所示:
    (1) 选择要操作:
    这里写图片描述
    (2) 选择5后,进入到如图2所示的菜单,输入要查询学生的学号,SelectServlet拿到相应的数据后,通过创建对象调用Student类的select方法进行查询,然后SelectServlet把查到的数据传给selectstudent.jsp在网页上显示出来如图3所示的主菜单
    这里写图片描述
    这里写图片描述
    (3) 根据所选菜单编写相应代码:
    求查询函数:
    这里写图片描述

    2.2 部分模块流程图
    这里写图片描述
    3.程序代码设计
    (1) 数据库连接(需要引入jar包)

    public class DBO {
    		static String url="jdbc:mysql://localhost:3306/dl";
    	tatic String user="root";
    	static String password="123";
    	static{
    try {
    	Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
    				e.printStackTrace();
    }
    	}
    	public static Connection getConnection() {
    Connection conn=null;
    try {
    	conn=DriverManager.getConnection(url, user, password);
    } catch (SQLException e) {
    				e.printStackTrace();
    }
    	return conn;
    	}
    }
    
    

    (2) 老师和学生类
    a.老师类

    public class Teacher {
    			private int id;
    			private String username;
    			private String password;
    			public int getId() {
    				return id;
    			}
    			public void setId(int id) {
    				this.id = id;
    			}
    			public String getUsername() {
    				return username;
    			}
    			public void setUsername(String username) {
    				this.username = username;
    			}
    			public String getPassword() {
    				return password;
    			}
    			public void setPassword(String password) {
    				this.password = password;
    			}
    	}
    
    

    b.学生类
    id sid name password gender birthday address属性以及相应的get set方法(与上面相同)
    (3) 学生登录注册以及老师要操作的增删改查
    3.1.学生相关操作的接口

    public interface StudentManager {
    		//登录时
    public Student CheckLogin(String name,String sid,String password);
    		//添加学生信息
    		public boolean addStudent(Student student);
    		//更新学生信息
    public boolean updateStudent(String sid,Student student);
    		//删除学生信息
    		public boolean deleteStudent(String sid);
    		//查询所有的学生信息
    		public List<Student> getAllStudent(String sid);
    	}
    
    
    3.2.学生相关操作的接口的实现类
    
    	public  class StudentManagerImpl implements StudentManager {
    		public Student CheckLogin(String name, String sid,String password) {
    	Student s=null;
    		Connection conn=null;
    		Statement st=null;
    		ResultSet rs=null;
    		String sql="select * from student";
    		conn=DBO.getConnection();
    		try {
    			st=conn.createStatement();
    			rs=st.executeQuery(sql);
    			while(rs.next()) {
    				String nm=rs.getString("name");
    				String id=rs.getString("sid");
    				String psd=rs.getString("password");
    	if(nm.equals(name) && id.equals(sid) && psd.equals(password)) {
    					s= new Student();
    					s.setName(nm);
    					s.setSid(id);
    					s.setPassword(psd);
    					s.setGender(rs.getString("gender"));
    					s.setAddress(rs.getString("address"));
    					s.setId(rs.getInt("id"));
    					s.setBirthday(rs.getString("birthday"));
    				}
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return s;
    	}
    	public boolean addStudent(Student student) {
    		// TODO Auto-generated method stub
    		boolean flag=false;
    		String sql="insert into student(sid,name,password,gender,birthday,address) values(?,?,?,?,?,?)";
    		Connection conn=null;
    		PreparedStatement pst=null;
    		conn=DBO.getConnection();
    		try {
    			pst=conn.prepareStatement(sql);
    			pst.setString(1,student.getSid());
    			pst.setString(2,student.getName());
    			pst.setString(3, student.getPassword());
    			pst.setString(4,student.getGender());
    			pst.setString(5,student.getBirthday());
    			pst.setString(6,student.getAddress());	
    			pst.executeUpdate();
    			flag=true;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return flag;
    	}
    	public boolean updateStudent(String sid, Student student) {
    		// TODO Auto-generated method stub
    		boolean flag=false;
    		String sql="update student set name=?,password=?,gender=?,birthday=?,address=? where sid='"+sid+"'";
    		Connection conn=null;
    		PreparedStatement pst=null;
    		conn=DBO.getConnection();
    		try {
    			pst=conn.prepareStatement(sql);
    			pst.setString(1,student.getName());
    			pst.setString(2,student.getPassword());
    			pst.setString(3,student.getGender());
    			pst.setString(4,student.getBirthday());
    			pst.setString(5,student.getAddress());	
    			pst.executeUpdate();
    			flag=true;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return flag;
    	}
    	public boolean deleteStudent(String sid) {
    		// TODO Auto-generated method stub
    		boolean flag=false;
    		String sql="delete from student where sid='"+sid+"'";
    		System.out.println(sql);
    		Connection conn=null;
    		PreparedStatement pst=null;
    		conn=DBO.getConnection();
    		try {
    			pst=conn.prepareStatement(sql);
    			int row=pst.executeUpdate();
    			if(row>0)
    				flag=true;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return flag;
    	}
    	public List<Student> getAllStudent(String sid) {
    		// TODO Auto-generated method stub
    		List<Student> list=new ArrayList<Student>();
    		String sql="select * from student where sid='"+sid+"'";
    		Connection conn=null;
    		Statement st=null;
    		ResultSet rs=null;
    		conn=DBO.getConnection();
    		try {
    			st=conn.createStatement();
    			rs=st.executeQuery(sql);
    			while(rs.next()) {
    				Student s=new Student();
    				s.setSid(sid);
    				s.setName(rs.getString("name"));
    				s.setPassword(rs.getString("password"));
    				s.setGender(rs.getString("gender"));
    				s.setBirthday(rs.getString("birthday"));
    				s.setAddress(rs.getString("address"));
    				list.add(s);
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return list;
    	}
    }
    
    

    3.3登陆的servlet

    public class CheckLogin extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    		doPost(request, response);
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setCharacterEncoding("utf-8");
    		String name=request.getParameter("username");
    		String sid=request.getParameter("sid");
    		String password=request.getParameter("password");
    		String checkcode=request.getParameter("checkcode");
    		String piccode=(String) request.getSession().getAttribute("piccode");
    		StudentManager smg = new StudentManagerImpl();
    		Student s=new Student();
    		s=smg.CheckLogin(name, sid,password);
    		HttpSession session=request.getSession();
    		session.setAttribute("s", s);
    		if(s!=null && checkcode.equalsIgnoreCase(piccode)) {
    			response.sendRedirect("person.jsp");
    		}else{
    			response.sendRedirect("error.jsp");
    		}	
    	}
    }
    
    

    3.4注册和登录的servlet道理相似
    (4) 老师的登录注册与学生的相似(就已不在写了)
    (5) 验证吗

    public class PicCodeGenerator extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doPost(request, response);
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setCharacterEncoding("utf-8");
    		BufferedImage bi=new BufferedImage(68,22,BufferedImage.TYPE_INT_BGR);
    		Graphics g=bi.getGraphics();
    		Color color=new Color(224,205,19);
    		g.setColor(color);
    		g.fillRect(0, 0, 68,22);
    		char [] c="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
    		Random random= new Random();
    		int len=c.length;
    		int temp;
    		StringBuffer sb=new StringBuffer(4);
    		for(int i = 0 ; i<4 ; i++){
    			char index = c[(int)(0+Math.random()*c.length)];
    			Font font = new Font("幼圆",Font.BOLD,25);
    			Color clo = new Color(random.nextInt(255));
    			g.setFont(font);
    			g.setColor(clo);
    			g.drawString(index+"",i*15,18);
    			g.setColor(new Color(random.nextInt(150),random.nextInt(220),random.nextInt(180)));
    			sb.append(index);	
    	  }
    		for(int i=0;i<5;i++) {
    			g.drawLine(random.nextInt(68),random.nextInt(22),random.nextInt(68), random.nextInt(22));
    		}
    		request.getSession().setAttribute("piccode", sb.toString());
    		ImageIO.write(bi, "JPG", response.getOutputStream());
    	}
    }
    
    

    (6) 分页
    6.1servlet

    public class StudentServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    doPost(request, response);
    }
    	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    StudentService studentService = new StudentService();
    String uri = request.getRequestURI()+"?"+request.getQueryString();
    int index=uri.indexOf("StudentServlet");
    if(index==-1) 
    uri="http://localhost:8080/student/StudentServlet?null";
    index = uri.lastIndexOf("&pc=");
    	if(index != -1 )
    uri = uri.substring(0,index);		//获取当前页页码
    		int pc = 1;
    		String param = request.getParameter("pc");
    		if(param != null && !param.trim().isEmpty()){
    			//将string类型强制转化为Int类型
    			pc = Integer.parseInt(param);
    		}
    		PageBean<Student> pageBean = studentService.findByPageBean(pc);
    		//pageBean.setPc(pc);
    		pageBean.setUrl(uri);
    		//将数据放到Request域
    		request.setAttribute("pb", pageBean);
    		//转发
    		request.getRequestDispatcher("Partner.jsp").forward(request, response);
    	}
    }
    
    

    4.界面及运行效果、测试工具与测试效果
    4.1身份选择(碰到教师和学生,这两个词会转动,老师这个小人会左右移动)
    这里写图片描述
    4.11选择教师后,进入老师登录界面,下面有超链接返回和注册
    这里写图片描述
    这里写图片描述
    (1)填入正确的username和password以及验证码吗后进入
    这里写图片描述
    (2)对学生进行增删改查操作
    这里写图片描述
    (3)用分页查询所有学生(上下一页可以跳转)
    这里写图片描述
    4.12选择学生后,进入学生登录界面,下面有超链接返回和注册
    这里写图片描述
    (1) 学生登陆成功的界面
    这里写图片描述
    (1) 学生登陆成功的界面
    这里写图片描述
    5.设计总结
    1.本人在程序设计中遇到了非常多的困难,通过找他人请教,百度,以及翻阅书籍,一点一点解决错误,收获颇多,学到了非常多的知识,以及更加巩固我以前的知识
    2.调试程序:先判断是哪一步程序出错,缩小范围在具体修改
    比如:登陆失败时

    这里写图片描述

    6.致谢
    通过这次的实践,我不仅对学到的东西加以综合,巩固,以及学到许多新的知识,收获颇多,这也是我第一次做的小项目,虽然比较简单,但感到非常充实,也更加的熟悉如何调试程序,等等。
    参考文献
    《Java基础教程》
    http://www.imooc.com/
    http;www.baidu.com/
    《传智播客_2015年java基础视频-深入浅出版》
    等等

    展开全文
  • 目录 1绪论 1 1.1项目简介 1 1.2设计目的 1 1.3设计内容 1 2需求分析 1 2.1数据需求 1 2.2事务需求 1 3概要设计 2 3.1系统的大致流程图 2 4详细设计 2 ...8总结 19 8.1系统实现程度 19 参考文献 19
  • 一、系统设计需求 1、整个系统均用C语言实现; 2、利用指针、链表来实现学生成绩的数据结构设计; 3、系统具有输入、显示、删除、排序、退出基本功能; 4、系统的各个功能模块都用函数的形式来实现; 5、可以将...
  • C++ 学生信息管理系统课程设计报告

    千次阅读 2020-06-13 11:22:27
    《面向对象课程设计》报告学生信息管理系统设计一、问题描述二、需求分析和概要设计三、功能模块描述和设计思路四、具体实现过程五、收获与展望 一、问题描述 学生信息管理系统设计 学生信息包括:学号,姓名,年龄...

    一、问题描述

    学生信息管理系统设计
    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计学生信息管理系统,使之能提供以下功能:
    系统以菜单方式工作
    1、学生信息录入功能(学生信息用文件保存)输入
    2、学生信息浏览功能—输出
    3、查询、排序功能—算法
    按学号查询
    按姓名查询
    4、学生信息的删除与修改

    二、需求分析和概要设计

    题目要求之做一个学生信息管理系统,并且一菜单的形式完成,

    CAboutDlg是“关于”界面的设计;
    CAddDlg是学生信息录入功能界面的设计,并且实现学生消息添加;
    CChangeDlg是学生信息的修改功能界面的设计;
    CDisplayView和CSelectDlg在主窗口上个的两个静态拆分窗口;
    CInfoDlg是学生信息浏览功能界面的实现设计;
    CInfoFile是存放学生信息的类,里面有学生属性,还有一些调用函数;
    CLoginDlg登录窗口界面的设计;
    CMainFrame是主窗口的设计;
    CSearchDlg是学生信息查询界面的设计;
    CSortDlg是学生信息排序界面的设计;
    CstuinfoApp是应用程序类;
    CUserDlg是个人信息界面的设计。

    三、功能模块描述和设计思路

    首先就是学生信息的录入,要求将信息用文件保存,在这里我设计了一个类CInfoFile,构建了一个结构体msg里面有8个成员变量分别是id,name,age,sex,birthday,place,phone,mail,分别表示学号,姓名,年龄,性别,出生年月,地址,电话,E-mail,除了id(自加,且唯一),age是int类型,其他都是string类型,同时CInfoFile里面还有成员函数ReadDocline、WirteDocline分别向程序里面读数据和写入数据,还有负责添一条数据的成员函数Addline()可以添加一条信息,同时我将学生的信息有list容器存放。这个添加信息的界面我设计了一个CCAddDlg类,继承CFormView类,里面不需要填加学号,只需要输入其他七个变量即可,通过编辑框来接收用户输入的信息。

    其次是学生的浏览,我设计了一个CInfoDlg类,它是有CFormView类继承而来的,通过重写OnInitialUpdate();函数来实现界面的初始化,我是用一个List Control控件来显示信息的,当然就要引用CInfoFile的头文件,将文本信息读入,然后在展示出来,大体思路就是这样。

    然后我是先做查询的,因为这有做了查询才能删除和修改,查询我也是按照学号查询和姓名查询,在这里我设计了一个CSearchDlg类,它是有CFormView类继承而来的,也要应用CInfoFile类完成对文件的读写,同时在这个选择方式上,我用了一个下拉框,Combo Box控件来实现选择,查询出来的信息在右边的实例编辑框中展示出来,然后对编辑框进行一些属性的调整,例如可下滑(当文本长度过长时可下滑)、可换行、只读,然后学号和姓名都设置可输入编辑框,只有当对应查询方式有效时才能进行查询,无效会有消息框弹出提示,若有效会进行查询将对应结果输出,无输出结果会有对应的提示框弹出,用MessageBox实现。还有一点需要注意的是按照名字查询的时候可能会出现同名的要将其输出。

    然后我做了删除和修改,这是用按照学号查询的方法来查询的,分别设计了CDelDlg类和CChangeDlg类,都是有CFormView类继承而来的,CDelDlg类的设计类似查询,也是左边输入搜索,右边输出数据,还有一点就是,点击删除按钮后会弹出二次确认,只有当选择确认时才会删除信息,防止误删。

    CChangDlg类的界面类似添加信息界面,但是多了一个学号的选项,这个学号的选项我是用Combo Box做的,原理类似查询的查讯方式选择框,这样就不会弹出未查询到该学号的报错了。在选择学号的时候,会有对应学号信息的提示,以便于对照信息增加可读性。

    最后我写的是排序,这里我新建了一个CSortDlg类,我是用一个List Control控件来完成这个功能的,我写了一个列表表头触发事件OnLvnColumnclickList1()函数、同时写了一个静态函数MyCompareProc()函数用来定义排序的方式,比如某列按照int类型排序,而有的按照CString类型排序。

    然后,我还自己写了一个登陆窗口,用CLoginDlg来实现的,它的父类是CDialogEx,在应用程序类CstuinfoApp的InitInstance()里面的APP创建之前创建登陆对话框只有登陆成功才能进入到主界面,在登录界面还有记录密码的功能,配有提示如密码错误,用户名不存在。还有就是登录到主窗口是会显示个人信息界面,这个我使用CUserDlg来实现的,里面包括修改密码的功能,确定密码。主窗口的设计CMainFrame类的设计,它是CFrameWnd的子类,在这里我还设计了一个右键菜单和快捷键的设计,还有就是关键的两个列CSelectView类和CDisplayView类,CSelectView继承于CTreeView,CDispalyView继承于CFormView,CSelectView类中初始化树视图,获取数的控件,添加树节点,透视对应的结点添加控制事件,OnTvnSelchanged(),来获得自定义消息,在主窗口界面挂载信息。

    四、具体实现过程

    1. 新建项目
      1.1. 根据向导创建项目
      首先,新建MFC项目(stuinfo),基于单文档,MFC标准项目。
      1.2. 添加预处理
      由于微软在VS2013中不建议再使用C/C++的传统库函数scanf,strcpy,sprintf等。
      VS建议采用带_s的函数,如scanf_s、strcpy_s,但这些并不是标准C/C++函数。要想继续使用此函数,需要添加 _CRT_SECURE_NO_WARNINGS这个预定义。
      在项目->属性->C/C+±>预处 ->预处理器定中添加 _CRT_SECURE_NO_WARNINGS,防止报错。
      1.3. 设置主窗口属性
      在CMainFrame的 OnCreate()中添加如下代码:
      在这里插入图片描述
      IDI_ICON_WIN 是自己导入图标。
      在这里插入图片描述
      可以在这里修改左侧标题
    2. 文件处理
      2.1. 文件内容处理和设计文件处理类
      Login.ini中登录用户的信息

    学生信息在stock.txt中

    添加CInfoFile.cpp和CInfoFile.h
    设计结构体格式

    设计类

    1. 登录窗口的设计
      添加控件

    添加类CLoginDlg :public CDialogEx

    重写OnInitDialog函数,判断登录情况进行初始化,通过rem.txt里面的内容来判断是否记住密码,如果是就初始化记住密码

    还有就是登录按钮的实现

    同时这里还有注意两个bug,1是直接点击输入框然后回车会进入主界面,2是直接点x会进入主界面。这里通过重写函数解决。

    这是取消按钮的代码:

    1. 静态拆分窗口
      自定义两个类:CSelectView和CDispalyView(它的基类必须是CFormView类)。
      CSelectView继承于CTreeView,CDispalyView继承于CFormView。
      1)CMainFrame类中,声明CSplitterWnd类型的对象:

    2. 树视图功能的添加
      加载图标,

    在CSelectView类中声明相应变量,

    然后重写CSelectView的OnInitUpdate函数

    在功能节点相应信息的处理:

    1)在CMainFrame 框架类中,添加自定义消息宏

    2)在CMainFrame框架类中添加自定义消息处理函数:
    //自定义消息处理函数

    afx_msg LRESULT OnMyChange(WPARAM wParam, LPARAM lParam);
    3)对应的.cpp定义其函数
    LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
    {
    }
    

    4)在CMainFrame框架类BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加自定义消息入口,与自定义消息处理函数绑定。

    5)发送自定义信号:
    在CSelectView的OnTvnSelchanged函数中,发送自定义信号:

    在CMainFrame框架类OnMyChange函数中处理相应消息:

    运行结果:

    因为此时并没有挂载个人信息界面,所有不会有右边界面的内容,应该是未定义的初始化内容。
    6. 个人信息管理界面窗口的实现
    6.1. 界面设计

    设计界面,添加控件,并给控件添加变量

    重写函数

    1. 学生信息浏览窗口的实现
      7.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    7.2. 功能的实现

    1. 学生信息添加窗口的实现
      8.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    8.2. 功能实现

    1. 学生信息查询界面
      9.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    9.2. 功能实现

    1. 学生信息删除界面
      10.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    10.2. 功能实现

    1. 学生信息修改界面
      11.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    11.2. 功能实现

    1. 学生信息排序界面
      12.1. 界面设计
      设计界面,添加控件,并给控件添加变量

    12.2. 功能实现

    1. 菜单栏的制作
      13.1. 菜单栏界面的设计

    2)右键菜单栏项,添加事件处理程序,选择COMMAND 消息类型,添加至CMainFrame框架类中
    添加函数
    在这里插入图片描述
    13.2. 右键菜单
    在这里插入图片描述

    五、收获与展望

    还有些图片不想放了,上传到资料了
    一会放链接
    最后的成品展示在

    链接: 视频录制的不好不介意.

    展开全文
  • 学生选课管理系统 数据库课程设计
  • 系统全面的C#学生信息管理系统代码与执行页截图
  • 了解软件工程中的一些系统分析,模块分析,代码设计的概念,利用Visual C++ 6.0实现学生成绩管理系统的输入、显示、排序、插入、删除、查找、求平均分等基本操作,使用函数实现模块化程序设计和结构体类型处理组合...
  • C语言课程设计学生成绩管理系统个人总结C语言课程设计——学生成绩管理系统 个人心得体会(徐州工程学院 14计嵌1班 07组 张凯)这一周以来的课程设计,不仅让我明白了C语言的确是一门很有用的,但是又是不容易的一门...
  • C语言学生成绩信息管理系统课程设计报告

    万次阅读 多人点赞 2016-10-07 22:19:22
    学生成绩管理系统 主要功能: (1)能按学期、按班级完成对学生成绩的录入、 修改,删除 (2)能按班级统计学生的成绩,求学生的总分及 平均分,并能根据学生的平均成绩进行排序 (3)能查询学生...
  • http://download.csdn.net/download/qq_36326947/9974229 代码下载地址:http://download.csdn.net/download/qq_36326947/9984118 csdn下载需要c币,没有c币可从微信公众号【无心有云】 发送【c语言学生信息管理系统】...
  • 学生信息管理系统 JAVA课程设计

    热门讨论 2009-05-29 10:04:14
    学生信息管理系统 JAVA课程设计,含源代码和详细的实验报告
  • 采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...
  • 【Python课程设计学生成绩管理系统

    万次阅读 多人点赞 2020-06-30 20:14:05
    【Python课程设计学生成绩管理系统1、需求分析2、功能设计与分析1、使用数据库对数据进行存取(1)使用PyMySQL模块操作数据库对数据进行存取(2)创建数据库school,创建数据表student_sore、teacher_login(3)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,909
精华内容 8,363
关键字:

学生管理系统课程设计总结