精华内容
下载资源
问答
  • 数据库原理课程设计报告学生成绩管理系统设计.doc
  • 阶段 1.1 成绩管理系统实体关系设计 一实验目的和要求 1熟练掌握实体关系设计的方法 2 通过需求分析结果掌握 E-R 图 二实验内容和原理 实体关系设计是在需求分析的一个环节过程 在这一过程中产生 E-R 图该图由实体 ...
  • 数据库原理与应用学生成绩管理系统设计实训报告
  • 数据库原理及Oracle开发课程设计 题 目 选课管理系统 系 (部) 电信系 班 级 计本一班 姓 名 耿榕 学 号 2012020198 指导教师 黄硕 2014年 6 月9日 选课管理系统 选课管理系统 数据库原理及Oracle开发 课程设计任务书...
  • 阶段 1.1 成绩管理系统实体关系设计 一实验目的和要求 1熟练掌握实体关系设计的方法 2通过需求分析结果掌握图 二实验内容和原理 实体关系设计是在需求分析的一个环节过程在这一过程中产生图该图由实体属 性和联系三...
  • C++ 学生成绩管理系统 要求用 C++ 语言编写学生成绩管理系统要求能进行添加删除修改输入输出等的操作 并能使用面相对像原理对此系统进行实现 学生成绩管理系统分析 学生成绩管理系统分为 8 个模块分别是添加学生信息...
  • 时磊5说- 时磊5说- 时磊忖呎 C++学生成绩管理系统 要求用C++语言编写学生成绩管理系统要求能进行添加删除修改输入输出等的操作 并能使用面相对像原理对此系统进行实现 学生成绩管理系统分析 学生成绩管理系统分为 8...
  • 数据结构课程设计报告 课题名称 学生成绩管理系统 专业班级 学 号 姓 名 指导老师 一课题名称 学生成绩管理系统 二课题设计的基本思想原理和算法描述 1,基本思想 建立一个学生成绩管理系统能够实现每位学生的成绩的...
  • C++学生成绩管理系统 要求用C++语言编写学生成绩管理系统要求能进行添加删除修 改输入输出等的操作并能使用面相对像原理对此系统进行实现 学生成绩管理系统分析 8 学生成绩管理系统分为 个模块分别是添加学生信息...
  • 课程设计(论文)任务书 软 件 学 院 软件工程 专 业 20092 班 一课程设计(论文)题目 学生成绩管理系统 二课程设计(论文)工作自 2010 年 6 月 28 日起至 2010 年7月 2 日止 三课程设计(论文) 地点: 软件学院实训中心 ...
  • 学生成绩管理系统2ed

    2021-03-07 14:33:35
    设计一个学生管理系统,要求如下: 学生来自英语系,数学系、计算机系,每个学生的公共信息部包括:学号、姓名、年龄、系别,高数成绩、英语成绩、体育成绩;英语系学生有综合英语、口语等课程成绩;数学系学生有实...

    1.题目

    设计一个学生管理系统,要求如下:

    • 学生来自英语系,数学系、计算机系,每个学生的公共信息部包括:学号、姓名、年龄、系别,高数成绩、英语成绩、体育成绩;英语系学生有综合英语、口语等课程成绩;数学系学生有实变函数、泛函分析、微分几何等课程成绩;计算机系学生有计算机组成原理、计算机体系结构、汇编语言等课程成绩。每个学生可以查询相应信息(学号、姓名、年龄、系别及成绩信息);可以查询各门课程的平均成绩。用类及类的派生实现上述功能,要求使用类的集成、虚函数、虚基类的C++语言特性;要求每个类采用不同的方式实现构造函数
    • 设计一个学生管理类,其中包含可变学生数目,要求实现:
      1)初始化,所有学生的信息组织以链表方式实现
      2)实现指定学生的信息查询(如利用学号、姓名等方式)
      3)按照公共课平均成绩排序
      4)按照学生所有课程的平均成绩排序
      5)增加学生
      6)删除指定学生
    • 注意构造函数和析构函数的实现方式。每个类的声明需放在单独的头文件中(即一个类的声明放在一个后缀名为h的文件中),每个类的实现放在一个单独cpp文件中;测试程序(即包含 main函数的程序)单独放在一个cpp文件中

    2.总体分析

    首先有一个基类workstuclass.h,存放有三个系的学生的公共信息,以及一个虚函数的第二级菜单还有公共信息的输入输出函数,其函数在另一个文件workstufun.cpp文件里面定义。然后是三个系的学生类的公有继承学生基类,分别是workcomclass.h、workengclass.h和workmatclass.h,三个类里面除了有各个系学生的非公有信息以外,还有其对应的各个操作函数,而函数的定义是放在对用的.cpp文件里面。紧接着是一个学校类workschclass.h,它继承了计算机、英语和数学这三个系的派生类而来,里面含有一个第一级菜单,同样也是在另一个文件.cpp文件里面定义。最后就是主函数了,定义了一个School学校类的对象,用来调用第一级菜单完成指定操作。总的来说,就是首先调用第一级菜单,输入指定指令进入相应的系的学生管理系统后调用第二级菜单完成相应的添加信息、删除信息等基本操作,三个不同系的信息放在不同的链表并储存在三个不同的文件里面。

    3.详细设计

    由于计算机系、英语系以及数学系通过第一级菜单进入第二级菜单后其基本操作都相同,不同的只是变量不同而已,所以这里只介绍了计算机系的函数以及它们之间的调用关系。
    首先学生基类的定义,用#ifndef WORKSTUCLASS_H_ 、 #define WORKSTUCLASS_H_和#endif来避免重复定义,接下来是函数体了,该基类比较简单,里面只有定义了几个共有变量,以及三个函数,一个是第二级操作菜单,定义成虚函数(其实本人觉得在这个程序当中并没有需要去定义虚函数,但是为了满足作业要求,所以就定义了一个菜单虚函数),然后还有公共信息的输入输出函数,三个函数的定义均放在它的.cpp文件workstufun.cpp文件里面,首先它的.cpp文件还是要包含该类文件,下面就是其输入输出函数的代码。

    void Student::input1()//输入1
    {
        cout<<"学号:"<<endl;
        cin>>id;
        cout<<"系别:"<<endl;
        cin>>faculty;
        cout<<"姓名:"<<endl;
        cin>>name;
        cout<<"年龄:"<<endl;
        cin>>age;
        cout<<"高数成绩:"<<endl;
        cin>>math_score;
        cout<<"英语成绩:"<<endl;
        cin>>english_score;
        cout<<"体育成绩:"<<endl;
        cin>>sport_score;
    }
    
    void Student::output1()//输出1 
    {
    	cout<<"学号:"<<id<<endl;
        cout<<"系别:"<<faculty<<endl;
        cout<<"姓名:"<<name<<endl;
        cout<<"年龄:"<<age<<endl;
        cout<<"高数成绩:"<<math_score<<endl;
        cout<<"英语成绩:"<<english_score<<endl;
        cout<<"体育成绩:"<<sport_score<<endl;
    }
    

    接着是计算机系学生类的定义以及其各个操作函数的声明,首先同样的还是需要用#ifndef WORKCOMCLASS_H_、#define WORKCOMCLASS_H_以及#endif来避免重复定义,并将
    并用#include "workstuclass.h"将基类头文件workstuclass.h也包含进来,然后声明各个操作函数并定义该类特有的变量以及为接下来算平均分的所定义的变量平均数,还有文件输入输出流以及该类的头尾指针和指向下一个结点的类指针。

    virtual void menu2();            //计算机系菜单 
    	void input2();                   //计算机系输入
    	void output2();                  //计算机系输出
    	void add();                      //增加 
        void display();                  //显示 
        void find();                     //查询 
        void modify();                   //修改
    	void del();                      //删除 
        void save();                     //保存信息到文件 
        void readfile(ifstream &in);     //从文件读入数据到结点 
    	void copy1(Comstu *p1,Comstu *p2);//交换相邻结点的数据 
        void sort();                     //排序部分 
    	void open();                     //打开文件 
    	void close();                    //关闭文件 
    

    完后就是在另一个.cpp文件里面定义该类所声明的函数,还是要在开头把该类的文件包含进来。然后就是在基类当中定义的菜单虚函数,在介绍之前我想先介绍打开文件的函数以及关闭文件的函数。打开文件其实就是读一下文件,如果没有的话就创建文件。首先要先初始化三个类指针,然后利用

    ifstream in("comstu.txt");
    	                   char ch = in.get();
    	                   if(in.eof())
    	                   {
    		                   cout<<"文件为空!"<<endl;
    	                    }
    	                   //若文件非空
    	                   while(!in.eof())
    	                   {
    		                   end->readfile(in);
    		                   if(end->name[0] == '\0')
    		           break;//不加这一句的话程序会把文件最后结束的标记也都出来		                       end->next = new Comstu;
    		                   end = end->next;
    	                    }
    

    来读文件,而其中readfile()其实就是自己写的读文件函数,就是用文件输入流in直接将全部数据读入链表(内存)便于接下来对数据操作的执行。然后就是文件关闭的函数的close(),然后首先在该函数的开头调用自己所写的保存数据至文件的函数,该函数首先打开文件,定义一个类指针,并将其指向第一个存有信息的结点,并利用for循环从此循环开始一直到尾结点,将其所有数据利用文件输出流out输出至文件,最后就是利用out.close()关闭文件即可(注意一下这里的关闭文件和自己所定义的关闭文件是不一样的,虽然叫法是一样的)。回到自己所写的关闭文件上,保存文件之后就是将自己所定义的指针利用delete函数逐个释放掉即可。
    回到该计算机系学生类的菜单,首先利用所写的打开文件以及关闭文件放在菜单函数的头和尾部,这样在每次操作其对应的操作函数返回该菜单时就会自动保存,而没必要在每个函数里面写打开保存文件的操作。接着就是简单的输入输出函数,但和基类输入输出函数不同的就是在这个函数里面调用其输入输出函数并加入这个类特有的数据。后面的函数和上一次作业的函数基本一样。接着是增加结点至链表尾部的函数,利用尾指针指向输入函数来调用它,并为尾指针的指向下一个指针的指针新配置一块内存,并将其再次赋给尾指针,然后还有就是输入指令是否继续添加结点了。
    接着是显示所有信息,定义一个类指针,并将其指向第一个含有信息的结点,同时利用循环并在循环里面调用输出函数逐个将结点信息输出至屏幕。然后就是查询功能,分为按学号或者是按姓名查询,首先输出一个菜单并输入指令以及判断指令的正确性,然后同样的定义一个类指针指向头结点的next指针(也就是第一个含有信息的指针),然后输入学号或者是名字后直接利用循环从该链表的第一个信息结点开始逐个判断所输入的信息,找到后直接调用输出函数将其显示到屏幕即可,并将标记变量设置为1,完后判断标记变量是否为1,如果为非1则输出未找到该学生信息,然后继续询问是否继续查询,继续查询则直接返回循环前面重复上面的步骤,如果不查询则利用break跳出循环。
    接下来解释修改部分,输入所要修改的的学生名字,定义类指针,从头信息结点利用for(pos;pos!=end;pos=pos->next)开始查找,找到后调用输入信息函数重新开始写这个结点的信息,之后输出修改成功的信息。然后是删除结点,首先定义判断是否找到所要删除的结点的标志变量,输入想要删除的学生名字,然后就是将头结点指针以及第一个信息结点指针赋给另外定义的类指针p2和p1,还是同样的利用循环从头开始查找,找到该删除的结点后将判断变量设为1,然后将p1的next指针赋给p2,然后利用delete删除p1,利用break 跳出循环,最后利用判断变量判断是否找到该学生。
    接着最后是排序部分,首先定义一个函数来将一个结点信息复制到另一个结点上,其实函数里面就是简单的复制操作。然后是正式的排序部分,首先是输出一个排序菜单,输入指令后执行后执行相应的操作,首先定义两个类指针,并将其中一个指向第一个信息结点,比如输入的指令是1执行按全部课程平均成绩降序排的功能,然后利用冒泡排序,从头信息结点开始逐个判断相邻结点的平均分大小,若后一个结点大于前面一个结点,那么利用自己写的交换结点函数进行交换两个结点的信息,注意不是交换指针,至此该计算机系学生类的函数函数定义已全部完成。
    接下来就是一个继承了三个系的类的School类,并采用虚基类的共有继承防止继承了多个基类进而出错,该类里面只声明了一个第一级菜单,并在对应的.cpp文件里面进行定义,而这个菜单通过虚函数的方式调用三个系的类的在基类声明并在各个系里面分别定义的第二级菜单menu2(),代码如下,接下来利用对应的指针进行指向调用即可。

    Comstu c1;
    Engstu e1;
    Matstu m1;
    Student *p1=&c1;
    Student *p2=&e1;
    Student *p3=&m1;
    

    最后就是主函数部分了,其实就是简单的几行代码,包含定义的学校类worrkschclas.h这个头文件,然后就是定义学校类的对象来调用它里面定义的第一级菜单函数即可,至此,整个代码解释结束。

    4.源码

    https://github.com/Zhuhezhang/student-achievement-management-system-2ed

    展开全文
  • vb学生成绩管理系统

    2013-06-28 08:55:24
     学生成绩管理系统 课程设计的目的  理解面向对象的软件设计基本理论,学习VB软件设计的基本方法,熟悉一般软件项目开发的基本步骤,培养运用VB解决实际问题的能力和技巧。 课程设计的主要内容和要求(包括原始...
  • 学生成绩管理信息系统

    千次阅读 多人点赞 2017-09-10 00:23:03
    设计题目:学生成绩管理信息系统设计与实现。 软件功能分为服务器功能与客户端功能两部分。其中: 管理员通过系统管理界面进入,建立各种课程、班级,将课程、班级信息保存在数据库中并可以对课程、班级进行改动和...

    一、Java实践课程设计

    课程设计内容

    设计题目:学生成绩管理信息系统设计与实现。

    软件功能分为服务器功能与客户端功能两部分。其中:

    管理员通过系统管理界面进入,建立各种课程、班级,将课程、班级信息保存在数据库中并可以对课程、班级进行改动和删除。建立的数据库中包含如下信息:学生学号、姓名、班级,面向对象原理与Java实践、高等数学、大学英语。至少要有5个班级,每个班级要有l0名学生

    普通用户通过客户端能够:

    (1) 根据以下关键字查询:学生姓名、学号、班级、课程名称。

    (2) 按照单科成绩、总成绩、平均成绩、学号排序。

    (3) 进行学生信息的插入、删除和修改。

    (4) 查询每门课程的最高分、最低分及相应学生姓名、班级和学号。

    (5) 查询每个班级某门课程的优秀率(90分及以上)、不及格率,并进行排序。

    使用图形界面,按日常软件设计和使用习惯设计菜单和界面

    1、登录界面,使用学号,默认密码是123456


    2、主界面,登录成功才能进入主界面


    3、添加学生成绩


    4、删除学生信息


    5、模糊查询,支持学号,姓名,课程,班级等关键字查询


    6、排序 可对学号,分数按班级,课程名称进行高低排序,同时也可以统计优秀率和最高分和最低分


    二、源代码地址:

    http://download.csdn.net/download/com_it/9971716
    如果需要源代码也可以留下邮箱,我发给你


    展开全文
  • 集成MVC框架的设计,重在设计,不在项目本身。就项目来说,它不是一个完整的项目。对学习框架设计原理的读者来说应该是一个不错的引子,抛砖引玉吧。
  • 上述的各种理论,对我们设计和开发学生成绩管理系统提供了重要的理论基础,同时也为我们如何进行具体的设计和开发工作,提供了必要的思路和方法。 二、系统的需求分析 2.1项目开发的背景分析 当今时代是...
  • 学生成绩信息管理系统 一、系统设计目标 以学生信息管理系统为例,通过对简单应用软件系统的设计,编制、调试,实现简单的增加、删除、修改、排序等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及...

    学生成绩信息管理系统

    一、系统设计目标

    以学生信息管理系统为例,通过对简单应用软件系统的设计,编制、调试,实现简单的增加、删除、修改、排序等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。初步掌握基于MFC库类对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现相关功能。

    二、系统设计要求

    1.需求分析
    该程序要能实现对学生成绩信息的显示、增加、删除、修改,实现对学生按学号、按姓名查询显示,实现字段筛选功能,能够统计统计全部学生的总成绩,及其平均成绩,各个输入字段要有验证功能,能够进行各个学科的排序检索以及成绩数据分析功能。

    2.功能介绍
    (1)添加功能:程序能够添加学生记录和各科成绩,提供选择界面供用户选择所要添加的类别。添加记录时,要求学号唯一,如果是添加了重复记录,则提示数据添加重复并取消添加。
    (2)删除功能:主要实现对已添加的学生和成绩记录进行删除。如果当前系统中没有相应的记录,则提示为空并返回操作。
    (3)修改功能:用户根据选择的记录进行修改,修改时保持学号编号唯一,设置只读功能,其他信息皆可更改。
    (4)显示功能:程序设置数据在列表控件中,每条记录占据一行。
    (5)保存功能:在添加、删除、修改的同时读取文件,自动保存数据到文件。
    (6)查询功能:程序设计三种查询方式,第一种按学号进行查询,第一种按姓名查询,第三种按照班别筛选查询。
    (7)排序功能:首先依照排序的依据,可根据学号、各科成绩、总分以及平均分进行排序,页面刷新显示数据。
    (8)统计功能:转跳另一个可执行文件进行学生成绩数据整体分析,统计某个分数段内的学生人数,绘制各科成绩的直方图和折线图。
    (9)登录功能:设计管理员登录才进入学生成绩信息管理系统进行增删改查等操作。

    三、系统设计分析

    设计一个基于MFC对话框的C++应用程序开发,因此要创建一个主对话框,和一些必要的子对话框。在主对话框中添加列表控件用来显示学生的基本信息,并且列表控件要有较强的数据处理函数。因此选择列表控件,对于学生信息的录入、查询、排序、删除与修改都采用按钮控件,并为每个按钮添加消息响应函数用来处理学生的信息操作。对于录入功能和修改功能,可以为它设置一个子对话框来填写学生的基本信息。接下来就要把学生的基本信息能够保存下来,因此要用到文件的操作。
    此外,还运用到单文档设计的学生成绩分析图形绘制。并用该学生成绩信息管理系统调用该画图的exe文件,实现在该学生成绩信息管理系统中显示学生成绩的直方图和折线图。
    综上所述,必须掌握按钮控件、列表控件、组合框控件的构建,编辑控件和消息的相应与处理原理,同时掌握CFile类和图像和文字绘制类的运用。

    四、系统整体设计

    1.系统流程图
    在这里插入图片描述
    2.系统功能模块图
    在这里插入图片描述

    五、程序运行效果

    1.系统登录界面:
    运行程序,首先出现登录界面,输入管理员用户名和密码,输入正确进入系统。
    在这里插入图片描述

    2.系统主界面:
    在这里插入图片描述

    3.添加记录界面:
    在这里插入图片描述
    4.记录添加成功界面:
    在这里插入图片描述

    5.数据显示界面:
    在这里插入图片描述

    6.修改记录界面:
    在这里插入图片描述

    7.记录修改成功界面:
    在这里插入图片描述

    8.系统按学号查询功能:在这里插入图片描述

    9.系统按姓名查询功能:
    在这里插入图片描述

    10.系统查询失败显示:
    在这里插入图片描述

    11.系统班别筛选功能:
    在这里插入图片描述

    12.系统排序功能:
    在这里插入图片描述

    13.系统按语文成绩排序:
    在这里插入图片描述

    14.系统按数学成绩排序:
    在这里插入图片描述

    15.系统删除功能:
    在这里插入图片描述

    16.系统数据统计功能:
    在这里插入图片描述

    17.系统打开文件分析:
    在这里插入图片描述

    18.数据分析直方图:
    在这里插入图片描述

    19.数据分析折线图:
    在这里插入图片描述

    系统主要源代码

    (一)设计Student类

    总图
    在这里插入图片描述设计一个学生类,包括数据成员:姓名、学号,八门课程(语文、数学、英语、物理、化学、生物、历史、体育)的成绩。Student类添加在 类CEx_StudentApp之上

    // Ex_Student.h : main header file for the EX_STUDENT application
    //
    
    #if !defined(AFX_EX_STUDENT_H__1201A7FC_72F9_41BB_8775_1B2AFB4378FA__INCLUDED_)
    #define AFX_EX_STUDENT_H__1201A7FC_72F9_41BB_8775_1B2AFB4378FA__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #ifndef __AFXWIN_H__
    	#error include 'stdafx.h' before including this file for PCH
    #endif
    #include <iostream>
    #include <string.h>
    #include <sstream>
    #include <algorithm>
    using namespace std;
    #include "resource.h"		// main symbols
    
    /
    // CEx_StudentApp:
    // See Ex_Student.cpp for the implementation of this class
    //
    class Student {
    public:
    	char strName[20];
    	char strID[20];
    	char sClass[20];
    	char sSex[2];
    	char sAddress[100];
    	char sBirthday[20];
    	char sAge[5];
    	char fChinese[5];
    	char fMath[5];
    	char fEnglish[5];
    	char fPhysics[5];
    	char fBiology[5];
    	char fChemistry[5];
    	char fHistory[5];
    	char fSport[5];
    	char fAve[20];
    	char fTotal[20];
    	Student() {};
    	bool sort_id(Student a, Student b);
    	bool sort_total(Student a, Student b);
    	bool sort_ave(Student a, Student b);
    	bool sort_chinese(Student a, Student b);
    	bool sort_math(Student a, Student b);
    	bool sort_english(Student a, Student b);
    	bool sort_pyhsics(Student a, Student b);
    	bool sort_chemistry(Student a, Student b);
    	bool sort_biology(Student a, Student b);
    	bool sort_history(Student a, Student b);
    	bool sort_sport(Student a, Student b);
    };
     
    class CEx_StudentApp : public CWinApp
    {
    public:
    	CEx_StudentApp();
    	Student temp;           //全局变量,存放学生的临时数据
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CEx_StudentApp)
    	public:
    	virtual BOOL InitInstance();
    	//}}AFX_VIRTUAL
    
    // Implementation
    
    	//{{AFX_MSG(CEx_StudentApp)
    		// NOTE - the ClassWizard will add and remove member functions here.
    		//    DO NOT EDIT what you see in these blocks of generated code !
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    
    /
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_EX_STUDENT_H__1201A7FC_72F9_41BB_8775_1B2AFB4378FA__INCLUDED_)
    
    

    (二)主框架源代码

    1. 主框架变量

    其余都可通过ID获取
    在这里插入图片描述

    ID控件 变量名
    IDC_COMBO_CLASS CComboBox m_ComboBoxClass;
    IDC_COMBO_SORT CComboBox m_ComboBoxSort;
    IDC_LIST CListCtrl m_list;

    2.主框架头文件

    // Ex_StudentDlg.h : header file
    //
    
    #if !defined(AFX_EX_STUDENTDLG_H__DB137ADD_497D_455F_A457_A4497BF81B6E__INCLUDED_)
    #define AFX_EX_STUDENTDLG_H__DB137ADD_497D_455F_A457_A4497BF81B6E__INCLUDED_
    
    #include "Ex_Student.h"	// Added by ClassView
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    extern CEx_StudentApp theApp;     //引用全局变量theApp
    
    /
    // CEx_StudentDlg dialog
    
    class CEx_StudentDlg : public CDialog
    {
    // Constructio
    public:
    	void SortStudent(int nNum);
    	int Seek_Student(char *str);
    	void ComboBoxAddString();
    	void ReadStudent(CListCtrl* pList);
    	CEx_StudentDlg(CWnd* pParent = NULL);	// standard constructor
    	
    // Dialog Data
    	//{{AFX_DATA(CEx_StudentDlg)
    	enum { IDD = IDD_EX_STUDENT_DIALOG };
    	CComboBox	m_ComboBoxClass;
    	CComboBox	m_ComboBoxSort;
    	CListCtrl	m_list;
    	//}}AFX_DATA
    
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CEx_StudentDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    	//}}AFX_VIRTUAL
    
    // Implementation
    protected:
    	HICON m_hIcon;
    
    	// Generated message map functions
    	//{{AFX_MSG(CEx_StudentDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnButtonAdd();
    	afx_msg void OnButtonDel();
    	afx_msg void OnButtonQuest();
    	afx_msg void OnButtonSort();
    	afx_msg void OnButtonEdit();
    	afx_msg void OnButtonAnalysis();
    	afx_msg void OnButtonScreen();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_EX_STUDENTDLG_H__DB137ADD_497D_455F_A457_A4497BF81B6E__INCLUDED_)
    
    

    3. 主框架源代码

    // Ex_StudentDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Ex_Student.h"
    #include "Ex_StudentDlg.h"
    #include "StuAddDlg.h"
    #include "StuModifyDlg.h"        //引用修改子对话框头文件
    #include <windows.h>
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialog Data
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };
    	//}}AFX_DATA
    
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	//}}AFX_VIRTUAL
    
    // Implementation
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    	//{{AFX_DATA_INIT(CAboutDlg)
    	//}}AFX_DATA_INIT
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CAboutDlg)
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    	//{{AFX_MSG_MAP(CAboutDlg)
    		// No message handlers
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CEx_StudentDlg dialog
    
    CEx_StudentDlg::CEx_StudentDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CEx_StudentDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CEx_StudentDlg)
    	//}}AFX_DATA_INIT
    	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CEx_StudentDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CEx_StudentDlg)
    	DDX_Control(pDX, IDC_COMBO_CLASS, m_ComboBoxClass);
    	DDX_Control(pDX, IDC_COMBO_SORT, m_ComboBoxSort);
    	DDX_Control(pDX, IDC_LIST, m_list);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CEx_StudentDlg, CDialog)
    	//{{AFX_MSG_MAP(CEx_StudentDlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
    	ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
    	ON_BN_CLICKED(IDC_BUTTON_QUEST, OnButtonQuest)
    	ON_BN_CLICKED(IDC_BUTTON_SORT, OnButtonSort)
    	ON_BN_CLICKED(IDC_BUTTON_EDIT, OnButtonEdit)
    	ON_BN_CLICKED(IDC_BUTTON_ANALYSIS, OnButtonAnalysis)
    	ON_BN_CLICKED(IDC_BUTTON_SCREEN, OnButtonScreen)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CEx_StudentDlg message handlers
    
    BOOL CEx_StudentDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Add "About..." menu item to system menu.
    
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    	
    	// TODO: Add extra initialization here
    	
    	
    	//初始化CListCtrl控件。插入一些标头,设置宽度和序列号。	
    	CRect rect; 
    	// 获取编程语言列表视图控件的位置和大小
    	m_list.GetClientRect(&rect);
               	
        // 为列表视图控件添加全行选中和栅格风格   
        m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   
    	CString col[13] = {_T("学号"), _T("姓名"), _T("班级"), _T("语文"),_T("数学"),_T("英语"),_T("物理"),_T("化学"),_T("生物"),_T("历史"),_T("体育"),_T("总分"),_T("平均分")};
        for (int i = 0; i < 13; i++) { 
    		m_list.InsertColumn(i, col[i], LVCFMT_CENTER, 80); 
    	}
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    	CEx_StudentDlg::ReadStudent(pList);             //更新CListCtrl里的数据
        CEx_StudentDlg::ComboBoxAddString();            //更新下拉框数据
    	CheckRadioButton(IDC_RADIO_ID, IDC_RADIO_NAME, IDC_RADIO_ID);    //默认单选按钮为学号
    	CEx_StudentDlg::OnButtonSort();                 //默认按学号排序 
    	m_ComboBoxClass.SetCurSel(0);                   //默认班级为第一个选项
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CEx_StudentDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CEx_StudentDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Center icon in client rectangle
    		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;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CEx_StudentDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    //添加按钮控件函数
    void CEx_StudentDlg::OnButtonAdd() 
    {
    	// TODO: Add your control notification handler code here
    	CStuAddDlg dlg;
    	if(IDOK == dlg.DoModal()) {
    		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    		CEx_StudentDlg::ReadStudent(pList);
    		CEx_StudentDlg::ComboBoxAddString();
    		CEx_StudentDlg::OnButtonSort();                 //默认按学号排序 
    	}
    }
     //读取储存学生成绩的文件,并加载在学生成绩管理系统窗口的CListCtrl中
    void CEx_StudentDlg::ReadStudent(CListCtrl *pList)
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	pList->DeleteAllItems();
    	Student u;
    	int i = 0;
    	while(file.Read(&u, sizeof(u)) == sizeof(u)) {
    		pList->InsertItem(i, u.strID);
    		pList->SetItemText(i, 1, u.strName);
    		pList->SetItemText(i, 2, u.sClass);
    		pList->SetItemText(i, 3, u.fChinese);
    		pList->SetItemText(i, 4, u.fMath);
    		pList->SetItemText(i, 5, u.fEnglish);
    		pList->SetItemText(i, 6, u.fPhysics);
    		pList->SetItemText(i, 7, u.fChemistry);
    		pList->SetItemText(i, 8, u.fBiology);
    		pList->SetItemText(i, 9, u.fHistory);
    		pList->SetItemText(i, 10, u.fSport);
    		pList->SetItemText(i, 11, u.fTotal);
    		pList->SetItemText(i, 12, u.fAve);
    		i++;
    	}
    	file.Close();
    }
    //删除按钮消息映射函数 
    void CEx_StudentDlg::OnButtonDel() 
    {
    	// TODO: Add your control notification handler code here
    	CString str, strItemName;
    	
    	Student ur;
    	
    	/*
    	//删除多行
    
    	int count = m_list.GetSelectedCount(); 	
    	CString *strID = new CString[count];
    	int j=0;
    	
    	if(count < 1) {
    		AfxMessageBox("你还没选中列表项!");
    		return;
    	} 
    	
    	
    	for(int i = m_list.GetItemCount()-1; i>=0; i--)
    	{
    		 if(m_list.GetItemState(i, LVNI_ALL | LVNI_SELECTED) == LVIS_SELECTED)
    		{
    			m_list.DeleteItem(i);
    			m_list.GetItemText(i, 0, ur[j].strID, sizeof(ur[j].strID));
    			j++;
    		}
    	}
    	
    	str.Format("%s", ur[0].strID);
    	AfxMessageBox(str);
    	*/
    	
    
    	
    	//删除一行
    	int nID = m_list.GetSelectedCount();    //获取当前鼠标选择的学号数量
    	if(nID < 1) {
    		AfxMessageBox("你还没选中列表项!");
    		return;
    	}
    	int nIDText = m_list.GetSelectionMark();   //获取当前鼠标选择的一个学号位置
    	m_list.GetItemText(nIDText, 0, ur.strID, sizeof(ur.strID));     //获取选中的学生的id号
    	strItemName = m_list.GetItemText(nIDText, 1);      //获取选中的学生的姓名
    
    	str.Format("你确定要删除 %s 学生纪录吗?", strItemName);
    	
    	if(IDOK != MessageBox(str, "删除确认", MB_ICONQUESTION | MB_OKCANCEL))
    		return;
    	m_list.DeleteItem(nIDText);   //删除当前鼠标选择的学号位置
    	
    	
    
    	// 打开文件
    	CFile file;
    	
    	if (!file.Open("./studentfile.dat", CFile::modeRead))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	
    	CFile temporaryfile;
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeCreate|CFile::modeWrite))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	Student u;
    	
    	while (file.Read(&u, sizeof(u)) == sizeof(u) ) {   //读取学生成绩储存文件,将未删除的学生信息写入临时文件temporaryfile中
    		if((CString)u.strID == (CString)ur.strID) 
    			continue;        //若为选中的学生纪录则跳过 
    		temporaryfile.Write(&u, sizeof(u));
    	}
    	
    
    	
    	file.Close();
    	temporaryfile.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeCreate|CFile::modeWrite))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeRead))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	while (temporaryfile.Read(&u, sizeof(u)) == sizeof(u)) {    //读取学生成绩储存文件,将临时文件temporarystudentfile.dat中学生信息写入真正存储学生信息的studentfile.dat中
    		file.Write(&u, sizeof(u));
    	}
    	file.Close();
    	temporaryfile.Close();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);     //更新学生成绩管理系统界面的信息
    	CEx_StudentDlg::ReadStudent(pList);
    	return;
    	
    }
    
    //查找按钮消息映射函数
    void CEx_StudentDlg::OnButtonQuest() 
    {
    	// TODO: Add your control notification handler code here
    		
    	int nNum;
    	char str[20];
    
    	//查找前先取消原先选中的行的高亮样式
    	for(int i=0; i<m_list.GetItemCount(); i++) {
    		if(m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED) {
    			//取消高亮选中
    			m_list.SetItemState(i, 0, LVIS_SELECTED| LVIS_FOCUSED); 
    		}
    	}
    	
    	GetDlgItemText(IDC_EDIT_SEANO, str, sizeof(str));    //获取编辑框的学号信息
    	if((CString)str == "") {
    		MessageBox(_T("请输入姓名或学号"), _T("警告"), MB_OK | MB_ICONWARNING);
    		return;
    	}
    	nNum = Seek_Student(str);  //查询该学号是否存在
    	if (nNum == -1)
    	{
    		//AfxMessageBox("学号不存在!");
    		MessageBox(_T("没有找到该学生,请检查输入!"), _T("警告"), MB_OK | MB_ICONWARNING);
    	} else {
    		//高亮显示选中行
    		m_list.SetFocus();
    		m_list.SetItemState(nNum, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
    		m_list.EnsureVisible(nNum, FALSE);
    	}
    	
    }
    //查找该学生是否存在成绩管理系统的CListCtrl中
    int CEx_StudentDlg::Seek_Student(char *str)
    {
    	int nCount  = m_list.GetItemCount();       //listCtrl中的总行数
    	int i=0;
    	if(IDC_RADIO_ID == GetCheckedRadioButton(IDC_RADIO_ID, IDC_RADIO_NAME)) {    //如果输入的是学号
    		while(i<nCount) {
    			if(m_list.GetItemText(i, 0) == (CString)str) 
    				return i;
    			i++;
    		}
    	} else {           //如果输入的是姓名
    		while(i<nCount) {
    			if(m_list.GetItemText(i, 1) == (CString)str) 
    				return i;
    			i++;
    		}
    	}
    	return -1;
    }
    //设置组合框的排序依据
    void CEx_StudentDlg::ComboBoxAddString()
    {
    	m_ComboBoxSort.ResetContent();     //清空下拉框所有内容
    	m_ComboBoxSort.AddString("学号");
    	m_ComboBoxSort.AddString("总分");
    	m_ComboBoxSort.AddString("平均分");
    	m_ComboBoxSort.AddString("语文");
    	m_ComboBoxSort.AddString("数学");
    	m_ComboBoxSort.AddString("英语");
    	m_ComboBoxSort.AddString("物理");
    	m_ComboBoxSort.AddString("化学");
    	m_ComboBoxSort.AddString("生物");
    	m_ComboBoxSort.AddString("历史");
    	m_ComboBoxSort.AddString("体育");
    	m_ComboBoxSort.SetCurSel(0);       //默认第一个选项
    	
    }
    //排序按钮消息函数
    void CEx_StudentDlg::OnButtonSort() 
    {
    	// TODO: Add your control notification handler code here
    	int nSel = m_ComboBoxSort.GetCurSel();
    	SortStudent(nSel);
    }
    bool sort_id(Student a, Student b) {                            //学号(ID)大小比较函数
    	return _ttoi((CString)a.strID) < _ttoi((CString)b.strID);    //将char转换成CString,在转化成int
    }
    bool sort_total(Student a, Student b) {                            //总分大小比较函数
    	return atof((CString)a.fTotal) > atof((CString)b.fTotal);    //将char转换成CString,在转化成float
    }
    bool sort_ave(Student a, Student b) {                              //平均大小比较函数
    	return atof((CString)a.fAve) > atof((CString)b.fAve);    
    }
    bool sort_chinese(Student a, Student b) {                           //语文大小比较函数
    	return atof((CString)a.fChinese) > atof((CString)b.fChinese);    
    }
    bool sort_math(Student a, Student b) {                              //数学大小比较函数
    	return atof((CString)a.fMath) > atof((CString)b.fMath);    
    }
    bool sort_english(Student a, Student b) {                              //英语大小比较函数
    	return atof((CString)a.fEnglish) > atof((CString)b.fEnglish);    
    }
    bool sort_pyhsics(Student a, Student b) {                              //物理大小比较函数
    	return atof((CString)a.fPhysics) > atof((CString)b.fPhysics);    
    }
    bool sort_chemistry(Student a, Student b) {                              //化学大小比较函数
    	return atof((CString)a.fChemistry) > atof((CString)b.fChemistry);    
    }
    bool sort_biology(Student a, Student b) {                              //生物大小比较函数
    	return atof((CString)a.fBiology) > atof((CString)b.fBiology);    
    }
    bool sort_history(Student a, Student b) {                              //历史大小比较函数
    	return atof((CString)a.fHistory) > atof((CString)b.fHistory);    
    }
    bool sort_sport(Student a, Student b) {                              //体育大小比较函数
    	return atof((CString)a.fSport) > atof((CString)b.fSport);    
    }
    //对应排序对学生信息进行排序
    void CEx_StudentDlg::SortStudent(int nNum)
    {
    	Student SomeStudent[1000];
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	int i=0;
    	while (file.Read(&SomeStudent[i], sizeof(SomeStudent[i])) == sizeof(SomeStudent[i]))
    	{
    		i++;
    	}
    	file.Close();
    	int b = (CString)SomeStudent[0].strID < (CString)SomeStudent[1].strID;
    	if(nNum == 0)       //0 是按学号排序
    		std::sort(SomeStudent, SomeStudent+i, sort_id);
    	if(nNum == 1)       //1 是按总分成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_total);
    	if(nNum == 2)       //2 是按平均分成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_ave);
    	if(nNum == 3)       //3 是按语文成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_chinese);
    	if(nNum == 4)       //4 是按数学成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_math);
    	if(nNum == 5)       //5 是按英语成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_english);
    	if(nNum == 6)       //6 是按物理成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_pyhsics);
    	if(nNum == 7)       //7 是按化学成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_chemistry);
    	if(nNum == 8)       //8 是按生物成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_biology);
    	if(nNum == 9)       //9 是按历史成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_history);
    	if(nNum == 10)       //10 是按体育成绩排序
    		std::sort(SomeStudent, SomeStudent+i, sort_sport);
    	
    	if (!file.Open("./studentfile.dat", CFile::modeWrite))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	int t = 0;
    	while(t<i) {   //将排好序的信息写入学生成绩存储文件
    		file.Write(&SomeStudent[t], sizeof(SomeStudent[t]));
    		t++;
    	}
    	file.Close();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    	CEx_StudentDlg::ReadStudent(pList);             //更新CListCtrl里的数据
    }
    //修改按钮控件函数
    void CEx_StudentDlg::OnButtonEdit() 
    {
    	// TODO: Add your control notification handler code here
    	POSITION pos = m_list.GetFirstSelectedItemPosition();       //找到当前选中行
    	if(pos == NULL) {
    		MessageBox(_T("请选择要修改的数据!"), _T("警告"), MB_OK | MB_ICONWARNING);
    		return;
    	} 
    	//将所选择的数据存入临时变量temp里
    	CString str;
    	int nItem = m_list.GetNextSelectedItem(pos);
    	m_list.GetItemText(nItem, 0, theApp.temp.strID, sizeof(theApp.temp.strID));
    	m_list.GetItemText(nItem, 1, theApp.temp.strName, sizeof(theApp.temp.strName));
    	m_list.GetItemText(nItem, 2, theApp.temp.sClass, sizeof(theApp.temp.sClass));
    	m_list.GetItemText(nItem, 3, theApp.temp.fChinese, sizeof(theApp.temp.fChinese));
    	m_list.GetItemText(nItem, 4, theApp.temp.fMath, sizeof(theApp.temp.fMath));
    	m_list.GetItemText(nItem, 5, theApp.temp.fEnglish, sizeof(theApp.temp.fEnglish));
    	m_list.GetItemText(nItem, 6, theApp.temp.fPhysics, sizeof(theApp.temp.fPhysics));
    	m_list.GetItemText(nItem, 7, theApp.temp.fChemistry, sizeof(theApp.temp.fChemistry));
    	m_list.GetItemText(nItem, 8, theApp.temp.fBiology, sizeof(theApp.temp.fBiology));
    	m_list.GetItemText(nItem, 9, theApp.temp.fHistory, sizeof(theApp.temp.fHistory));
    	m_list.GetItemText(nItem, 10, theApp.temp.fSport, sizeof(theApp.temp.fSport));
    	
    	//测试
    	//str.Format("%s", theApp.temp.strName);
    	//AfxMessageBox(str);
    
    	CStuModifyDlg dlg;
    	if(IDOK == dlg.DoModal()) {		
    		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    		CEx_StudentDlg::ReadStudent(pList);
    		CEx_StudentDlg::ComboBoxAddString();
    		CEx_StudentDlg::OnButtonSort();                 //默认按学号排序 
    	}
    }
    //统计按钮控件函数
    void CEx_StudentDlg::OnButtonAnalysis() 
    {
    	// TODO: Add your control notification handler code here
    	//路径要修改,修改为自己Ex_DrawStu所在的当前路径
    	ShellExecute(this->m_hWnd, "open", "C:\\Users\\Administrator\\Desktop\\Ex_DrawStu\\Debug\\Ex_DrawStu.exe", NULL, NULL, SW_SHOWNORMAL);
    }
    
    //班级筛选按钮
    void CEx_StudentDlg::OnButtonScreen() 
    {
    	// TODO: Add your control notification handler code here
    	
    	CString className;
    	int nIndex = m_ComboBoxClass.GetCurSel();
    	m_ComboBoxClass.GetLBText(nIndex, className);     //获取筛选的班别
    	
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate))
    	{
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	m_list.DeleteAllItems();
    	Student u;
    	int i = 0;
    	while(file.Read(&u, sizeof(u)) == sizeof(u)) {
    		if(className ==  (CString)u.sClass) {
    			m_list.InsertItem(i, u.strID);
    			m_list.SetItemText(i, 1, u.strName);
    			m_list.SetItemText(i, 2, u.sClass);
    			m_list.SetItemText(i, 3, u.fChinese);
    			m_list.SetItemText(i, 4, u.fMath);
    			m_list.SetItemText(i, 5, u.fEnglish);
    			m_list.SetItemText(i, 6, u.fPhysics);
    			m_list.SetItemText(i, 7, u.fChemistry);
    			m_list.SetItemText(i, 8, u.fBiology);
    			m_list.SetItemText(i, 9, u.fHistory);
    			m_list.SetItemText(i, 10, u.fSport);
    			m_list.SetItemText(i, 11, u.fTotal);
    			m_list.SetItemText(i, 12, u.fAve);
    			i++;
    		}
    		
    	}
    	file.Close();
    	
    }
    
    

    (三)添加记录子对话框源代码

    对话框控件各个变量如下(性别获取通过ID)
    在这里插入图片描述在这里插入图片描述

    // StuAddDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Ex_Student.h"
    #include "StuAddDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CStuAddDlg dialog
    
    
    CStuAddDlg::CStuAddDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CStuAddDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CStuAddDlg)
    	m_strName = _T("");
    	m_strNo = _T("");
    	m_fScore1 = 0.0f;
    	m_fScore2 = 0.0f;
    	m_fScore3 = 0.0f;
    	m_fScore4 = 0.0f;
    	m_strAddress = _T("");
    	m_sAge = _T("");
    	m_DateTime = 0;
    	m_fScore5 = 0.0f;
    	m_fScore6 = 0.0f;
    	m_fScore7 = 0.0f;
    	m_fScore8 = 0.0f;
    	//}}AFX_DATA_INIT
    }
    
    
    void CStuAddDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CStuAddDlg)
    	DDX_Control(pDX, IDC_SPIN_S8, m_spinScore8);
    	DDX_Control(pDX, IDC_SPIN_S7, m_spinScore7);
    	DDX_Control(pDX, IDC_SPIN_S6, m_spinScore6);
    	DDX_Control(pDX, IDC_SPIN_S5, m_spinScore5);
    	DDX_Control(pDX, IDC_COMBO_CLASS, m_ComboBoxClass);
    	DDX_Control(pDX, IDC_SPIN_S4, m_spinScore4);
    	DDX_Control(pDX, IDC_SPIN_S3, m_spinScore3);
    	DDX_Control(pDX, IDC_SPIN_S2, m_spinScore2);
    	DDX_Control(pDX, IDC_SPIN_S1, m_spinScore1);
    	DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
    	DDV_MaxChars(pDX, m_strName, 20);
    	DDX_Text(pDX, IDC_EDIT_NO, m_strNo);
    	DDV_MaxChars(pDX, m_strNo, 20);
    	DDX_Text(pDX, IDC_EDIT_S1, m_fScore1);
    	DDV_MinMaxFloat(pDX, m_fScore1, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S2, m_fScore2);
    	DDV_MinMaxFloat(pDX, m_fScore2, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S3, m_fScore3);
    	DDV_MinMaxFloat(pDX, m_fScore3, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S4, m_fScore4);
    	DDV_MinMaxFloat(pDX, m_fScore4, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_ADDRESS, m_strAddress);
    	DDV_MaxChars(pDX, m_strAddress, 100);
    	DDX_Text(pDX, IDC_EDIT_AGE, m_sAge);
    	DDV_MaxChars(pDX, m_sAge, 5);
    	DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER, m_DateTime);
    	DDX_Text(pDX, IDC_EDIT_S5, m_fScore5);
    	DDV_MinMaxFloat(pDX, m_fScore5, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S6, m_fScore6);
    	DDV_MinMaxFloat(pDX, m_fScore6, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S7, m_fScore7);
    	DDV_MinMaxFloat(pDX, m_fScore7, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S8, m_fScore8);
    	DDV_MinMaxFloat(pDX, m_fScore8, 0.f, 100.f);
    	//}}AFX_DATA_MAP
    }
    
    
    BEGIN_MESSAGE_MAP(CStuAddDlg, CDialog)
    	//{{AFX_MSG_MAP(CStuAddDlg)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S1, OnDeltaposSpinS1)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S2, OnDeltaposSpinS2)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S3, OnDeltaposSpinS3)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S4, OnDeltaposSpinS4)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S5, OnDeltaposSpinS5)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S6, OnDeltaposSpinS6)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S7, OnDeltaposSpinS7)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S8, OnDeltaposSpinS8)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CStuAddDlg message handlers
    
    BOOL CStuAddDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	
    	// TODO: Add extra initialization here
    	m_spinScore1.SetRange(0,100);
    	m_spinScore2.SetRange(0,100);
    	m_spinScore3.SetRange(0,100);
    	m_spinScore4.SetRange(0,100);
    	m_spinScore5.SetRange(0,100);
    	m_spinScore6.SetRange(0,100);
    	m_spinScore7.SetRange(0,100);
    	m_spinScore8.SetRange(0,100);
    	
    	CheckRadioButton(IDC_MAN, IDC_GIRL, IDC_MAN);       //设置默认选中性别为男
    	m_ComboBoxClass.SetCurSel(0);                       //设置默认班级为第一个选项
    	m_DateTime = CTime::GetCurrentTime();
    	UpdateData(FALSE);
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    //旋转按钮控件12345678的通知消息函数
    void CStuAddDlg::OnDeltaposSpinS1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore1 = SetSpinScore(m_fScore1, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuAddDlg::OnDeltaposSpinS2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore2 = SetSpinScore(m_fScore2, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuAddDlg::OnDeltaposSpinS3(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore3 = SetSpinScore(m_fScore3, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuAddDlg::OnDeltaposSpinS4(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore4 = SetSpinScore(m_fScore4, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    void CStuAddDlg::OnDeltaposSpinS5(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore5 = SetSpinScore(m_fScore5, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    void CStuAddDlg::OnDeltaposSpinS6(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore6 = SetSpinScore(m_fScore6, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuAddDlg::OnDeltaposSpinS7(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore7 = SetSpinScore(m_fScore7, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuAddDlg::OnDeltaposSpinS8(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore8 = SetSpinScore(m_fScore8, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    //设置旋转控件与编辑框内容增量减量绑定函数
    float CStuAddDlg::SetSpinScore(float f, NM_UPDOWN *p)
    {
    	f += (float)p->iDelta * 0.5f;
    	if(f<0.0)
    		f = 0.0f;
    	if(f>100.0)
    		f = 100.0f;
    	return f;
    }
    
    
    //添加保存控件函数
    void CStuAddDlg::OnOK() 
    {
    	// TODO: Add extra validation here
    	
    	if(!IsValidate()) return;
    
    	Student u;	
    	CString strSex, str;
    	
    	//获取日期
    	CTime time;
        CDateTimeCtrl* pCtrl = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER);
        ASSERT(pCtrl != NULL);
        DWORD dwResult = pCtrl->GetTime(time);
        if (dwResult == GDT_VALID)
        {
            str = time.Format(TEXT("%Y-%m-%d"));   // 年月日
     
        }
    		
    	//获取控件输入的学生信息
    	GetDlgItemText(IDC_EDIT_NAME, u.strName, sizeof(u.strName));
    	GetDlgItemText(IDC_EDIT_NO, u.strID, sizeof(u.strID));
    	GetDlgItemText(IDC_EDIT_AGE, u.sAge, sizeof(u.sAge));
    	GetDlgItemText(IDC_EDIT_ADDRESS, u.sAddress, sizeof(u.sAddress));
    	GetDlgItemText(IDC_COMBO_CLASS, u.sClass, sizeof(u.sClass));
    	GetDlgItemText(IDC_EDIT_S1, u.fChinese, sizeof(u.fChinese));
    	GetDlgItemText(IDC_EDIT_S2, u.fMath, sizeof(u.fMath));
    	GetDlgItemText(IDC_EDIT_S3, u.fEnglish, sizeof(u.fEnglish));
    	GetDlgItemText(IDC_EDIT_S4, u.fSport, sizeof(u.fSport));
    	GetDlgItemText(IDC_EDIT_S5, u.fPhysics, sizeof(u.fPhysics));
    	GetDlgItemText(IDC_EDIT_S6, u.fChemistry, sizeof(u.fChemistry));
    	GetDlgItemText(IDC_EDIT_S7, u.fBiology, sizeof(u.fBiology));
    	GetDlgItemText(IDC_EDIT_S8, u.fHistory, sizeof(u.fHistory));
    	//获取性别
    	UINT nID = GetCheckedRadioButton(IDC_MAN, IDC_GIRL);
    	GetDlgItemText(nID, u.sSex, sizeof(u.sSex));
    	//获取的日期赋给u,再存入文件,使用memcpy()会出现尾部乱码
    	strncpy(u.sBirthday, (LPCTSTR)str, sizeof(u.sBirthday));	
    	
    	//str.Format(u.sClass);
    	//AfxMessageBox(str);
    
    	//求总分、平均分,atof()char类型转换为double
    	double total = atof(u.fChinese) + atof(u.fMath) + atof(u.fEnglish) + atof(u.fSport)
    					+atof(u.fPhysics) + atof(u.fChemistry) + atof(u.fBiology) + atof(u.fHistory);
    	double ave = total/8.0;
    	
    	//sprintf()double转换为char类型
    	sprintf(u.fTotal,"%.2lf",total);
    	sprintf(u.fAve,"%.2lf",ave);
    	
    
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeReadWrite | CFile::modeCreate | CFile::modeNoTruncate)) {
    		AfxMessageBox("添加失败,文件打不开!");
    		return;
    	}
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))  {   //读取学生文件信息,看学号是否重复
    		if((CString)ur.strID == (CString)u.strID) {
    			AfxMessageBox("用户已存在!");
    			return;
    		}
    	}
    	file.SeekToEnd();        //将指针移到文件末尾
    	file.Write(&u, sizeof(u));
    	AfxMessageBox("添加保存成功!"); //提示保存成功
    	CDialog::OnOK();
    }
    //验证添加编辑框是否有输入
    BOOL CStuAddDlg::IsValidate()
    {
    	UpdateData();
    	m_strName.TrimLeft();
    	m_strNo.TrimLeft();
    	m_strAddress.TrimLeft();
    	m_sAge.TrimLeft();
    	if(m_strName.IsEmpty())  {
    		MessageBox("请输入姓名");
    		return FALSE;
    	} else if(m_strNo.IsEmpty()) {
    		MessageBox("请输入学号");
    		return FALSE;
    	} else if(m_strAddress.IsEmpty()) {
    		MessageBox("请输入地址");
    		return FALSE;
    	} else if(m_sAge.IsEmpty()) {
    		MessageBox("请输入年龄");
    		return FALSE;
    	} 
      	return TRUE;
    }
    
    

    (四)修改记录子对话框源代码
    变量同添加子对话框相同,spinScore变量名稍有点不同,原理同样。

    // StuModifyDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Ex_Student.h"
    #include "StuModifyDlg.h"
    extern CEx_StudentApp theApp;
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CStuModifyDlg dialog
    
    
    CStuModifyDlg::CStuModifyDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CStuModifyDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CStuModifyDlg)
    	m_strAddress = _T("");
    	m_strName = _T("");
    	m_sAge = _T("");
    	m_strNo = _T("");
    	m_fScore1 = 0.0f;
    	m_fScore2 = 0.0f;
    	m_fScore3 = 0.0f;
    	m_fScore4 = 0.0f;
    	m_DateTime = 0;
    	m_fScore6 = 0.0f;
    	m_fScore7 = 0.0f;
    	m_fScore8 = 0.0f;
    	m_fScore9 = 0.0f;
    	//}}AFX_DATA_INIT
    }
    
    
    void CStuModifyDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CStuModifyDlg)
    	DDX_Control(pDX, IDC_SPIN_S6, m_spinScore6);
    	DDX_Control(pDX, IDC_SPIN_S7, m_spinScore7);
    	DDX_Control(pDX, IDC_SPIN_S8, m_spinScore8);
    	DDX_Control(pDX, IDC_SPIN_S9, m_spinScore9);
    	DDX_Control(pDX, IDC_SPIN_S4, m_spinScore4);
    	DDX_Control(pDX, IDC_SPIN_S3, m_spinScore3);
    	DDX_Control(pDX, IDC_SPIN_S2, m_spinScore2);
    	DDX_Control(pDX, IDC_SPIN_S1, m_spinScore1);
    	DDX_Text(pDX, IDC_EDIT_ADDRESS, m_strAddress);
    	DDV_MaxChars(pDX, m_strAddress, 100);
    	DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
    	DDV_MaxChars(pDX, m_strName, 20);
    	DDX_Text(pDX, IDC_EDIT_AGE, m_sAge);
    	DDV_MaxChars(pDX, m_sAge, 5);
    	DDX_Text(pDX, IDC_EDIT_NO, m_strNo);
    	DDV_MaxChars(pDX, m_strNo, 20);
    	DDX_Text(pDX, IDC_EDIT_S1, m_fScore1);
    	DDV_MinMaxFloat(pDX, m_fScore1, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S2, m_fScore2);
    	DDV_MinMaxFloat(pDX, m_fScore2, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S3, m_fScore3);
    	DDV_MinMaxFloat(pDX, m_fScore3, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S4, m_fScore4);
    	DDV_MinMaxFloat(pDX, m_fScore4, 0.f, 100.f);
    	DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER, m_DateTime);
    	DDX_Text(pDX, IDC_EDIT_S6, m_fScore6);
    	DDV_MinMaxFloat(pDX, m_fScore6, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S7, m_fScore7);
    	DDV_MinMaxFloat(pDX, m_fScore7, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S8, m_fScore8);
    	DDV_MinMaxFloat(pDX, m_fScore8, 0.f, 100.f);
    	DDX_Text(pDX, IDC_EDIT_S9, m_fScore9);
    	DDV_MinMaxFloat(pDX, m_fScore9, 0.f, 100.f);
    	//}}AFX_DATA_MAP
    }
    
    
    BEGIN_MESSAGE_MAP(CStuModifyDlg, CDialog)
    	//{{AFX_MSG_MAP(CStuModifyDlg)
    	ON_BN_CLICKED(IDOK_CHANGESAVE, OnChangeSave)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S1, OnDeltaposSpinS1)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S2, OnDeltaposSpinS2)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S3, OnDeltaposSpinS3)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S4, OnDeltaposSpinS4)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S6, OnDeltaposSpinS6)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S7, OnDeltaposSpinS7)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S8, OnDeltaposSpinS8)
    	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_S9, OnDeltaposSpinS9)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CStuModifyDlg message handlers
    
    BOOL CStuModifyDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	
    	// TODO: Add extra initialization here
    	m_spinScore1.SetRange(0,100);
    	m_spinScore2.SetRange(0,100);
    	m_spinScore3.SetRange(0,100);
    	m_spinScore4.SetRange(0,100);
    	m_spinScore6.SetRange(0,100);
    	m_spinScore7.SetRange(0,100);
    	m_spinScore8.SetRange(0,100);
    	m_spinScore9.SetRange(0,100);
    	//设置默认选中性别为男
    	CheckRadioButton(IDC_MAN, IDC_GIRL, IDC_MAN);
    	
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead)) {
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return 0;
    	}
    	Student u;
    	while (file.Read(&u, sizeof(u)))  {                    //读取学生文件信息,读取该学生的其他个人信息
    		if((CString)u.strID == (CString)theApp.temp.strID) {
    			memcpy(theApp.temp.sAddress, u.sAddress, strlen(u.sAddress));
    			memcpy(theApp.temp.sAge, u.sAge, strlen(u.sAge));
    			memcpy(theApp.temp.sBirthday, u.sBirthday, strlen(u.sBirthday));
    			memcpy(theApp.temp.sSex, u.sSex, strlen(u.sSex));
    			
    			//CString str;
    			//str.Format(theApp.temp.sBirthday);
    			//MessageBox(str);
    			break;
    		}
    	}
    
    	//初始化对话框时显示所选中的学生信息
    	SetDlgItemText(IDC_EDIT_NO, theApp.temp.strID);    
    	SetDlgItemText(IDC_EDIT_NAME, theApp.temp.strName);
    	SetDlgItemText(IDC_EDIT_AGE, theApp.temp.sAge);
    	SetDlgItemText(IDC_EDIT_ADDRESS, theApp.temp.sAddress);
    	SetDlgItemText(IDC_COMBO_CLASS, theApp.temp.sClass);
    	SetDlgItemText(IDC_EDIT_S1, theApp.temp.fChinese);
    	SetDlgItemText(IDC_EDIT_S2, theApp.temp.fMath);
    	SetDlgItemText(IDC_EDIT_S3, theApp.temp.fEnglish);
    	SetDlgItemText(IDC_EDIT_S4, theApp.temp.fSport);
    	SetDlgItemText(IDC_EDIT_S6, theApp.temp.fPhysics);
    	SetDlgItemText(IDC_EDIT_S7, theApp.temp.fChemistry);
    	SetDlgItemText(IDC_EDIT_S8, theApp.temp.fBiology);
    	SetDlgItemText(IDC_EDIT_S9, theApp.temp.fHistory);
    	
    	//CString日期转为CTime日期,并映射到日历控件
    	CString s = (CString)theApp.temp.sBirthday;
    	int y, m, d;
    	sscanf(s, "%d-%d-%d", &y, &m, &d);
    	CDateTimeCtrl* pCtrl = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER);	
    	CTime t(y,m,d,0,0,0);
    	pCtrl->SetTime(&t);
    
    	if((CString)theApp.temp.sSex == "男")
    		CheckRadioButton(IDC_MAN, IDC_GIRL, IDC_MAN);
    	else 
    		CheckRadioButton(IDC_MAN, IDC_GIRL, IDC_GIRL);
    	
    	GetDlgItem(IDC_EDIT_NO)->EnableWindow(FALSE);        //设置学号框只读
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    //修改保存控件函数
    void CStuModifyDlg::OnChangeSave() 
    {
    	// TODO: Add your control notification handler code here
    	Student u;	
    	CString strSex, str;
    	//验证
    	if(!IsValidate()) return;
    
    	//获取日期
    	CTime time;
        CDateTimeCtrl* pCtrl = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER);
        ASSERT(pCtrl != NULL);
        DWORD dwResult = pCtrl->GetTime(time);
        if (dwResult == GDT_VALID)
            str = time.Format(TEXT("%Y-%m-%d"));   // 年月日
    
    	GetDlgItemText(IDC_EDIT_NAME, u.strName, sizeof(u.strName));
    	GetDlgItemText(IDC_EDIT_NO, u.strID, sizeof(u.strID));
    	GetDlgItemText(IDC_EDIT_AGE, u.sAge, sizeof(u.sAge));
    	GetDlgItemText(IDC_EDIT_ADDRESS, u.sAddress, sizeof(u.sAddress));
    	GetDlgItemText(IDC_COMBO_CLASS, u.sClass, sizeof(u.sClass));
    	GetDlgItemText(IDC_EDIT_S1, u.fChinese, sizeof(u.fChinese));
    	GetDlgItemText(IDC_EDIT_S2, u.fMath, sizeof(u.fMath));
    	GetDlgItemText(IDC_EDIT_S3, u.fEnglish, sizeof(u.fEnglish));
    	GetDlgItemText(IDC_EDIT_S4, u.fSport, sizeof(u.fSport));
    	GetDlgItemText(IDC_EDIT_S6, u.fPhysics, sizeof(u.fPhysics));
    	GetDlgItemText(IDC_EDIT_S7, u.fChemistry, sizeof(u.fChemistry));
    	GetDlgItemText(IDC_EDIT_S8, u.fBiology, sizeof(u.fBiology));
    	GetDlgItemText(IDC_EDIT_S9, u.fHistory, sizeof(u.fHistory));
    
    	UINT nID = GetCheckedRadioButton(IDC_MAN, IDC_GIRL);
    	GetDlgItemText(nID, u.sSex, sizeof(u.sSex));
    	//获取的日期赋给u,再存入文件,使用memcpy()会出现尾部乱码
    	strncpy(u.sBirthday, (LPCTSTR)str, sizeof(u.sBirthday));	
    
    	//求总分、平均分,atof()char类型转换为double
    	double total = atof(u.fChinese) + atof(u.fMath) + atof(u.fEnglish) + atof(u.fSport)
    					+atof(u.fPhysics) + atof(u.fChemistry) + atof(u.fBiology) + atof(u.fHistory);
    	double ave = total/8.0;
    	
    	//sprintf()double转换为char类型
    	sprintf(u.fTotal,"%.2lf",total);
    	sprintf(u.fAve,"%.2lf",ave);
    	//str.Format("%s + %s", u.fTotal, u.fAve);
    	//AfxMessageBox(str);
    
    	CFile file;
    	
    	if((CString)u.strID != (CString)theApp.temp.strID) {
    		AfxMessageBox("请输入同一学号!");
    		SetDlgItemText(IDC_EDIT_NO, theApp.temp.strID);
    	}
    
    	if (!file.Open("./studentfile.dat", CFile::modeRead)) {
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    	int i=0;
    	Student ur;
    	while(file.Read(&ur, sizeof(ur))) {       //读取学生成绩储存文件,找到该学生信息储存的对应位置
    		if((CString)theApp.temp.strID == (CString)ur.strID) {
    			break;
    		}
    		i++;
    	}		
    	file.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeWrite)) {
    		MessageBox(_T("无法打开文件!"), _T("错误"), MB_OK | MB_ICONERROR);
    		return;
    	}
    
    	file.SeekToBegin();    
    	file.Seek(i*sizeof(u), CFile::current);     // 重新设置file文件的写指针时期刚好在要修改的学生信息那里
    	file.Write(&u, sizeof(u));
    
    	//str.Format("%s, %s", u.strID, u.strName);
    	//AfxMessageBox(str); 
    	AfxMessageBox("修改保存成功!"); //提示保存成功
    	file.Close();
    	CDialog::OnOK();
    }
    
    void CStuModifyDlg::OnDeltaposSpinS1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore1 = SetSpinScore(m_fScore1, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore2 = SetSpinScore(m_fScore2, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS3(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore3 = SetSpinScore(m_fScore3, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS4(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore4 = SetSpinScore(m_fScore4, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    void CStuModifyDlg::OnDeltaposSpinS6(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore6 = SetSpinScore(m_fScore6, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS7(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore7 = SetSpinScore(m_fScore7, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS8(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore8 = SetSpinScore(m_fScore8, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    
    void CStuModifyDlg::OnDeltaposSpinS9(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
    	// TODO: Add your control notification handler code here
    	UpdateData(TRUE);
    	m_fScore9 = SetSpinScore(m_fScore9, pNMUpDown);
    	UpdateData(FALSE);
    	*pResult = 0;
    }
    //设置旋转控件与编辑框内容增量减量绑定函数
    float CStuModifyDlg::SetSpinScore(float f, NM_UPDOWN *p)
    {
    	f += (float)p->iDelta * 0.5f;
    	if(f<0.0)
    		f = 0.0f;
    	if(f>100.0)
    		f = 100.0f;
    	return f;
    }
    
    //验证添加编辑框是否有输入
    BOOL CStuModifyDlg::IsValidate()
    {
    	UpdateData();
    	m_strName.TrimLeft();
    	m_strNo.TrimLeft();
    	m_strAddress.TrimLeft();
    	m_sAge.TrimLeft();
    	if(m_strName.IsEmpty())  {
    		MessageBox("请输入姓名");
    		return FALSE;
    	} else if(m_strNo.IsEmpty()) {
    		MessageBox("请输入学号");
    		return FALSE;
    	} else if(m_strAddress.IsEmpty()) {
    		MessageBox("请输入地址");
    		return FALSE;
    	} else if(m_sAge.IsEmpty()) {
    		MessageBox("请输入年龄");
    		return FALSE;
    	} 
      	return TRUE;
    }
    
    

    (五)登录子对话框源代码

    设置程序启动先调用Login子对话框

    // Ex_Student.cpp : Defines the class behaviors for the application.
    //
    
    #include "stdafx.h"
    #include "Ex_Student.h"
    #include "Ex_StudentDlg.h"
    #include "LoginDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CEx_StudentApp
    
    BEGIN_MESSAGE_MAP(CEx_StudentApp, CWinApp)
    	//{{AFX_MSG_MAP(CEx_StudentApp)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		//    DO NOT EDIT what you see in these blocks of generated code!
    	//}}AFX_MSG
    	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    END_MESSAGE_MAP()
    
    /
    // CEx_StudentApp construction
    
    CEx_StudentApp::CEx_StudentApp()
    {
    	// TODO: add construction code here,
    	// Place all significant initialization in InitInstance
    }
    
    /
    // The one and only CEx_StudentApp object
    
    CEx_StudentApp theApp;
    
    /
    // CEx_StudentApp initialization
    
    BOOL CEx_StudentApp::InitInstance()
    {
    	AfxEnableControlContainer();
    	// Standard initialization
    	// If you are not using these features and wish to reduce the size
    	//  of your final executable, you should remove from the following
    	//  the specific initialization routines you do not need.
    
    #ifdef _AFXDLL
    	Enable3dControls();			// Call this when using MFC in a shared DLL
    #else
    	Enable3dControlsStatic();	// Call this when linking to MFC statically
    #endif
    	//调用登录对话框
    	CLoginDlg dlg;         
        if (IDCANCEL == dlg.DoModal())
    		return FALSE;
    	// Since the dialog has been closed, return FALSE so that we exit the
    	//  application, rather than start the application's message pump.
    	return FALSE;
    }
    
    
    // LoginDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Ex_Student.h"
    #include "LoginDlg.h"
    #include "Ex_StudentDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CLoginDlg dialog
    
    
    CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CLoginDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CLoginDlg)
    		// NOTE: the ClassWizard will add member initialization here
    	//}}AFX_DATA_INIT
    }
    
    
    void CLoginDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CLoginDlg)
    		// NOTE: the ClassWizard will add DDX and DDV calls here
    	//}}AFX_DATA_MAP
    }
    
    
    BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
    	//{{AFX_MSG_MAP(CLoginDlg)
    	ON_BN_CLICKED(IDOK, OnBtnClickedOK)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // CLoginDlg message handlers
    //登陆按钮控件函数
    void CLoginDlg::OnBtnClickedOK() 
    {
    	// TODO: Add your control notification handler code here
    	CString sid, spw;
    	GetDlgItemText(IDC_EDIT_USER, sid);
    	GetDlgItemText(IDC_EDIT_PASSWD, spw);
    	if(sid == "admin" && spw == "123") {
    		CEx_StudentDlg dlg;
    		if (dlg.DoModal() == IDOK)
    		{
    			// TODO: Place code here to handle when the dialog is
    		}
    		CDialog::OnOK();
    	
    	}
    		
    	else {
    		AfxMessageBox("用户名或密码错误\n管理员: admin\n密码: 123");   //密码错误则弹出窗口提示错误
    		SetDlgItemText(IDC_EDIT_USER, "");        //重置两个编辑框
    		SetDlgItemText(IDC_EDIT_PASSWD, "");
    		this->SetFocus();
    	}
    }
    
    

    (六)图像绘制主框架源代码

    创建一个单文档用来显示学生各科成绩的条状图和折线图
    在这里插入图片描述头文件

    // Ex_DrawStuView.h : interface of the CEx_DrawStuView class
    //
    /
    
    #if !defined(AFX_EX_DRAWSTUVIEW_H__B14A5A68_E484_4D94_A204_82FF380CA2C5__INCLUDED_)
    #define AFX_EX_DRAWSTUVIEW_H__B14A5A68_E484_4D94_A204_82FF380CA2C5__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    
    class CEx_DrawStuView : public CView
    {
    protected: // create from serialization only
    	CEx_DrawStuView();
    	DECLARE_DYNCREATE(CEx_DrawStuView)
    
    // Attributes
    public:
    	CEx_DrawStuDoc* GetDocument();
    
    // Operations
    public:
    
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CEx_DrawStuView)
    	public:
    	virtual void OnDraw(CDC* pDC);  // overridden to draw this view
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    	protected:
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    	//}}AFX_VIRTUAL
    
    // Implementation
    public:
    	void ButtonEnable();
    	void ButtonUnenable();
    	void OnButtonChemistryLineShow();
    	void OnButtonBiologyLineShow();
    	void OnButtonHistoryLineShow();
    	void OnButtonPhysicsLineShow();
    	void OnButtonBiologyShow();
    	void OnButtonChemistryShow();
    	void OnButtonHistoryShow();
    	void OnButtonPhysicsShow();
    	void OnButtonOpenFile();
    	void OnButtonSportLineShow();
    	void OnButtonEnglishLineShow();
    	void OnButtonMathLineShow();
    	void OnButtonChineseLineShow();
    	void OnButtonSportShow();
    	void OnButtonEnglishShow();
    	void OnButtonMathShow();
    	float m_Num[100];
    	CString GetFileName();
    	void OnButtonChineseShow();
    	//定义按钮
    	CButton m_btnChinese;
    	CButton m_btnMath;
    	CButton m_btnEnglish;
    	CButton m_btnPhysics;
    	CButton m_btnBiology;
    	CButton m_btnHistory;
    	CButton m_btnChemistry;
    	CButton m_btnSport;
    	CButton m_btnChineseLine;
    	CButton m_btnMathLine;
    	CButton m_btnEnglishLine;
    	CButton m_btnPhysicsLine;
    	CButton m_btnBiologyLine;
    	CButton m_btnHistoryLine;
    	CButton m_btnChemistryLine;
    	CButton m_btnSportLine;
    	CButton m_buttonOpenFile;
    	int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	void DrawScore(CDC* pDC, float * fScore, int nNum, CString title);
    	void DrawLine(CDC* pDC, float* fScore, int nNum, CString title);
    	virtual ~CEx_DrawStuView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generated message map functions
    protected:
    	//{{AFX_MSG(CEx_DrawStuView)
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    #ifndef _DEBUG  // debug version in Ex_DrawStuView.cpp
    inline CEx_DrawStuDoc* CEx_DrawStuView::GetDocument()
       { return (CEx_DrawStuDoc*)m_pDocument; }
    #endif
    
    /
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_EX_DRAWSTUVIEW_H__B14A5A68_E484_4D94_A204_82FF380CA2C5__INCLUDED_)
    
    

    源文件cpp

    // Ex_DrawStuView.cpp : implementation of the CEx_DrawStuView class
    //
    
    #include "stdafx.h"
    #include "Ex_DrawStu.h"
    
    #include "Ex_DrawStuDoc.h"
    #include "Ex_DrawStuView.h"
    extern CEx_DrawStuApp theApp;
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // CEx_DrawStuView
    
    IMPLEMENT_DYNCREATE(CEx_DrawStuView, CView)
    
    BEGIN_MESSAGE_MAP(CEx_DrawStuView, CView)
    	//{{AFX_MSG_MAP(CEx_DrawStuView)
    	ON_WM_CREATE()
    	//}}AFX_MSG_MAP
    	// Standard printing commands
    	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    	ON_COMMAND(IDC_HIGGER_CHINESE, OnButtonChineseShow)
    	ON_COMMAND(IDC_HIGGER_MATH, OnButtonMathShow)
    	ON_COMMAND(IDC_HIGGER_ENGLISH, OnButtonEnglishShow)
    	ON_COMMAND(IDC_HIGGER_PHYSICS, OnButtonPhysicsShow)
    	ON_COMMAND(IDC_HIGGER_HISTORY, OnButtonHistoryShow)
    	ON_COMMAND(IDC_HIGGER_CHEMISTRY, OnButtonChemistryShow)
    	ON_COMMAND(IDC_HIGGER_BIOLOGY, OnButtonBiologyShow)
    	ON_COMMAND(IDC_HIGGER_SPORT, OnButtonSportShow)
    	ON_COMMAND(IDC_HIGGER_CHINESE_LINE, OnButtonChineseLineShow)
    	ON_COMMAND(IDC_HIGGER_MATH_LINE, OnButtonMathLineShow)
    	ON_COMMAND(IDC_HIGGER_ENGLISH_LINE, OnButtonEnglishLineShow)
    	ON_COMMAND(IDC_HIGGER_SPORT_LINE, OnButtonSportLineShow)
    	ON_COMMAND(IDC_HIGGER_PHYSICS_LINE, OnButtonPhysicsLineShow)
    	ON_COMMAND(IDC_HIGGER_HISTORY_LINE, OnButtonHistoryLineShow)
    	ON_COMMAND(IDC_HIGGER_BIOLOGY_LINE, OnButtonBiologyLineShow)
    	ON_COMMAND(IDC_HIGGER_CHEMISTRY_LINE, OnButtonChemistryLineShow)
    	ON_COMMAND(IDC_BUTOON_OPENFILE, OnButtonOpenFile)
    	
    END_MESSAGE_MAP()
    
    /
    // CEx_DrawStuView construction/destruction
    
    CEx_DrawStuView::CEx_DrawStuView()
    {
    	// TODO: add construction code here
    
    }
    
    CEx_DrawStuView::~CEx_DrawStuView()
    {
    }
    
    BOOL CEx_DrawStuView::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: Modify the Window class or styles here by modifying
    	//  the CREATESTRUCT cs
    
    	return CView::PreCreateWindow(cs);
    }
    
    /
    // CEx_DrawStuView drawing
    
    void CEx_DrawStuView::OnDraw(CDC* pDC)
    {
    	CEx_DrawStuDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// TODO: add draw code for native data here
    }
    
    /
    // CEx_DrawStuView printing
    
    BOOL CEx_DrawStuView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// default preparation
    	return DoPreparePrinting(pInfo);
    }
    
    void CEx_DrawStuView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: add extra initialization before printing
    }
    
    void CEx_DrawStuView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: add cleanup after printing
    }
    
    /
    // CEx_DrawStuView diagnostics
    
    #ifdef _DEBUG
    void CEx_DrawStuView::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CEx_DrawStuView::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CEx_DrawStuDoc* CEx_DrawStuView::GetDocument() // non-debug version is inline
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEx_DrawStuDoc)));
    	return (CEx_DrawStuDoc*)m_pDocument;
    }
    #endif //_DEBUG
    
    /
    // CEx_DrawStuView message handlers
    
    //画直方图函数
    void CEx_DrawStuView::DrawScore(CDC *pDC, float *fScore, int nNum, CString title)
    {
    	
    	int i;
    	int nScoreNum[] = {0, 0, 0, 0, 0};         // 各成绩段的人数的初始值
    	// 下面是用来统计各分数段的人数   
    	for(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(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_FDIAGONAL, 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;
    	CString strSeg[] = {"<60", "60-70", "70-80", "80-90", ">=90"};
    	CRect rcStr;
    	for(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("%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->TextOut(500, 10, title);
    
    	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);
    }
    //画折线图
    void CEx_DrawStuView::DrawLine(CDC *pDC, float *fScore, int nNum, CString title)
    {
    	int i;
    	int nScoreNum[] = {0, 0, 0, 0, 0};         // 各成绩段的人数的初始值
    	// 下面是用来统计各分数段的人数   
    	for(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(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]);
    	}
    	pControlDC->TextOut(500, 10, title);
    }
    
    // 创建各个成绩显示控件函数
    
    int CEx_DrawStuView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    	if (CView::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	
    	// TODO: Add your specialized creation code here	
    	//下面的button控件的ID还需添加到字串表
    	m_buttonOpenFile.Create((CString)"打开数据文件",     //按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,          //按钮风格
    		CRect(10, 10, 120, 40),                     //按钮大小
    		this,                                       //按钮父指针
    		IDC_BUTOON_OPENFILE);                        //该按钮对应的ID号
    	m_buttonOpenFile.ShowWindow(SW_SHOWNORMAL);
    	m_btnChinese.Create((CString)"语文成绩(直方)",     //按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,          //按钮风格
    		CRect(10, 50, 120, 80),                     //按钮大小
    		this,                                       //按钮父指针
    		IDC_HIGGER_CHINESE);                        //该按钮对应的ID号
    	m_btnChinese.ShowWindow(SW_SHOWNORMAL);
    	m_btnMath.Create((CString)"数学成绩(直方)",     //按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,          //按钮风格
    		CRect(10, 90, 120, 120),                     //按钮大小
    		this,                                       //按钮父指针
    		IDC_HIGGER_MATH);                        //该按钮对应的ID号
    	m_btnMath.ShowWindow(SW_SHOWNORMAL);
    	m_btnEnglish.Create((CString)"英语成绩(直方)",     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(10, 130, 120, 160),                     
    		this,                                       
    		IDC_HIGGER_ENGLISH);                        
    	m_btnEnglish.ShowWindow(SW_SHOWNORMAL);
    	m_btnPhysics.Create((CString)"物理成绩(直方)",     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(10, 170, 120, 200),                     
    		this,                                       
    		IDC_HIGGER_PHYSICS);                        
    	m_btnPhysics.ShowWindow(SW_SHOWNORMAL);
    	m_btnChemistry.Create((CString)"化学成绩(直方)",     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(10, 210, 120, 240),                     
    		this,                                       
    		IDC_HIGGER_CHEMISTRY);                        
    	m_btnChemistry.ShowWindow(SW_SHOWNORMAL);
    	m_btnBiology.Create((CString)"生物成绩(直方)",     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(10, 250, 120, 280),                     
    		this,                                       
    		IDC_HIGGER_BIOLOGY);                        
    	m_btnBiology.ShowWindow(SW_SHOWNORMAL);
    	m_btnHistory.Create((CString)"历史成绩(直方)",     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(10, 290, 120, 320),                     
    		this,                                       
    		IDC_HIGGER_HISTORY);                        
    	m_btnHistory.ShowWindow(SW_SHOWNORMAL);
    	m_btnSport.Create((CString)"体育成绩(直方)",    
    		WS_CHILD | WS_VISIBLE | WS_BORDER,          
    		CRect(10, 330, 120, 360),                     
    		this,                                   
    		IDC_HIGGER_SPORT);                      
    	m_btnSport.ShowWindow(SW_SHOWNORMAL);
    
    
    	m_btnChineseLine.Create((CString)"折线",          //语文  
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 50, 170, 80),                    
    		this,                                       
    		IDC_HIGGER_CHINESE_LINE);                        
    	m_btnChineseLine.ShowWindow(SW_SHOWNORMAL);   
    	m_btnMathLine.Create((CString)"折线",            //数学     
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 90, 170, 120),                     
    		this,                                      
    		IDC_HIGGER_MATH_LINE);                        
    	m_btnMathLine.ShowWindow(SW_SHOWNORMAL);
    	m_btnEnglishLine.Create((CString)"折线",         //英语          
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 130, 170, 160),                     
    		this,                                     
    		IDC_HIGGER_ENGLISH_LINE);                        
    	m_btnEnglishLine.ShowWindow(SW_SHOWNORMAL);          
    	m_btnPhysicsLine.Create((CString)"折线",         //物理       
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 170, 170, 200),                     
    		this,                                     
    		IDC_HIGGER_PHYSICS_LINE);                        
    	m_btnPhysicsLine.ShowWindow(SW_SHOWNORMAL);
    	m_btnChemistryLine.Create((CString)"折线",         //化学   
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 210, 170, 240),                     
    		this,                                     
    		IDC_HIGGER_CHEMISTRY_LINE);                        
    	m_btnChemistryLine.ShowWindow(SW_SHOWNORMAL);
    	m_btnBiologyLine.Create((CString)"折线",          //生物    
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 250, 170, 280),                     
    		this,                                     
    		IDC_HIGGER_BIOLOGY_LINE);                        
    	m_btnBiologyLine.ShowWindow(SW_SHOWNORMAL);
    	m_btnHistoryLine.Create((CString)"折线",          //历史      
    		WS_CHILD | WS_VISIBLE | WS_BORDER,         
    		CRect(120, 290, 170, 320),                     
    		this,                                     
    		IDC_HIGGER_HISTORY_LINE);                        
    	m_btnHistoryLine.ShowWindow(SW_SHOWNORMAL);
    	m_btnSportLine.Create((CString)"折线",              //体育   
    		WS_CHILD | WS_VISIBLE | WS_BORDER,          
    		CRect(120, 330, 170, 360),                     
    		this,                                     
    		IDC_HIGGER_SPORT_LINE);                       
    	m_btnSportLine.ShowWindow(SW_SHOWNORMAL);
    	ButtonUnenable();       //按钮不可用
    	return 0;
    }
    //语文成绩直方图控件按钮对应函数
    void CEx_DrawStuView::OnButtonChineseShow()
    {
    	
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fChinese);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "语文成绩直方图");
    	
    }
    //数学成绩直方图控件按钮对应函数
    void CEx_DrawStuView::OnButtonMathShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fMath);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "数学成绩直方图");
    
    }
    //英语成绩直方图控件按钮对应函数
    void CEx_DrawStuView::OnButtonEnglishShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fEnglish);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "英语成绩直方图");
    }
    //体育成绩直方图控件按钮对应函数
    void CEx_DrawStuView::OnButtonSportShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fSport);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "体育成绩直方图");
    }
    //物理成绩直方图
    void CEx_DrawStuView::OnButtonPhysicsShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fPhysics);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "物理成绩直方图");
    }
    //历史成绩直方图
    void CEx_DrawStuView::OnButtonHistoryShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fHistory);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "历史成绩直方图");
    }
    //化学成绩直方图
    void CEx_DrawStuView::OnButtonChemistryShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fChemistry);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "化学成绩直方图");
    }
    //生物成绩直方图
    void CEx_DrawStuView::OnButtonBiologyShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fBiology);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i, "生物成绩直方图");
    }
    
    
    //语文成绩折线图控件按钮对应函数
    void CEx_DrawStuView::OnButtonChineseLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fChinese);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();	
    	DrawLine(GetDC(), m_Num, i, "语文成绩折线图");
    }
    //数学成绩折线图控件按钮对应函数
    void CEx_DrawStuView::OnButtonMathLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fMath);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "数学成绩折线图");
    }
    //英语成绩折线图控件按钮对应函数
    void CEx_DrawStuView::OnButtonEnglishLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fEnglish);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "英语成绩折线图");
    }
    //体育成绩折线图控件按钮对应函数
    void CEx_DrawStuView::OnButtonSportLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fSport);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "体育成绩折线图");
    }
    //物理折线
    void CEx_DrawStuView::OnButtonPhysicsLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fPhysics);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "物理成绩折线图");
    }
    //历史折线
    void CEx_DrawStuView::OnButtonHistoryLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fHistory);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "历史成绩折线图");
    }
    //生物折线
    void CEx_DrawStuView::OnButtonBiologyLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fBiology);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "生物成绩折线图");
    }
    //化学折线
    void CEx_DrawStuView::OnButtonChemistryLineShow()
    {
    	for(int i=0; i<theApp.index; i++) {
    		m_Num[i] = (float)atof((CString)theApp.stu[i].fChemistry);
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawLine(GetDC(), m_Num, i, "化学成绩折线图");
    }
    //获取文件路径
    CString CEx_DrawStuView::GetFileName()
    {
    	CString filter, strFileName;
    	filter = "数据文件(*.dat)|*.dat||";
    	CFileDialog dlg(TRUE, ".dat", NULL, OFN_HIDEREADONLY, filter);
    	if(dlg.DoModal() == IDOK) {
    		strFileName = dlg.GetPathName();       //获取文件路径
    		CFileStatus status;
    		if(!CFile::GetStatus(strFileName, status)) {
    			MessageBox("文件不存在!", "错误", MB_OK | MB_ICONERROR);
    		}		
    	}
    	
    	return strFileName;
    }
    
    //打开文件获取数据
    void CEx_DrawStuView::OnButtonOpenFile()
    {
    	CString strFileName;
    	//获取文件路径
    	strFileName = GetFileName();
    	CFile file;
    	if(!file.Open(strFileName, CFile::modeReadWrite)) {
    		MessageBox("文件无法打开,无法画图!", "错误", MB_OK | MB_ICONERROR);
    		ButtonUnenable();       //按钮不可用
    		return;
    	}
    	ButtonEnable();    //按钮可用
    	Student u;
    	int i=0, j=0;
    	while(file.Read(&theApp.stu[i], sizeof(theApp.stu[i])) == sizeof(theApp.stu[i])) {
    		//m_Num[i] = (float)atof((CString)u.fChinese);		
    		i++;
    	}
    	theApp.index = i;
    	file.Close();
    }
    
    //按钮不可用函数
    void CEx_DrawStuView::ButtonUnenable()
    {
    	m_btnChinese.EnableWindow(FALSE);
    	m_btnMath.EnableWindow(FALSE);
    	m_btnEnglish.EnableWindow(FALSE);
    	m_btnPhysics.EnableWindow(FALSE);
    	m_btnBiology.EnableWindow(FALSE);
    	m_btnHistory.EnableWindow(FALSE);
    	m_btnChemistry.EnableWindow(FALSE);
    	m_btnSport.EnableWindow(FALSE);
    	m_btnChineseLine.EnableWindow(FALSE);
    	m_btnMathLine.EnableWindow(FALSE);
    	m_btnEnglishLine.EnableWindow(FALSE);
    	m_btnPhysicsLine.EnableWindow(FALSE);
    	m_btnBiologyLine.EnableWindow(FALSE);
    	m_btnHistoryLine.EnableWindow(FALSE);
    	m_btnChemistryLine.EnableWindow(FALSE);
    	m_btnSportLine.EnableWindow(FALSE);
    		
    }
    //按钮可用函数
    void CEx_DrawStuView::ButtonEnable()
    {
    	m_btnChinese.EnableWindow(TRUE);
    	m_btnMath.EnableWindow(TRUE);
    	m_btnEnglish.EnableWindow(TRUE);
    	m_btnPhysics.EnableWindow(TRUE);
    	m_btnBiology.EnableWindow(TRUE);
    	m_btnHistory.EnableWindow(TRUE);
    	m_btnChemistry.EnableWindow(TRUE);
    	m_btnSport.EnableWindow(TRUE);
    	m_btnChineseLine.EnableWindow(TRUE);
    	m_btnMathLine.EnableWindow(TRUE);
    	m_btnEnglishLine.EnableWindow(TRUE);
    	m_btnPhysicsLine.EnableWindow(TRUE);
    	m_btnBiologyLine.EnableWindow(TRUE);
    	m_btnHistoryLine.EnableWindow(TRUE);
    	m_btnChemistryLine.EnableWindow(TRUE);
    	m_btnSportLine.EnableWindow(TRUE);
    }
    
    

    字串表
    在这里插入图片描述
    下载地址:
    https://download.csdn.net/download/qq_33290233/12078416

    展开全文
  • 学习成绩管理系统

    2019-04-27 16:54:43
    学生成绩管理系统是一个学校不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该为用户提供充足的信息和快捷的查询手段。当前成教学院没有一个完善的成绩信息管理平台,...
  • 学生管理系统_C#毕业设计 系统设计原理 2.1 需求分析 针对其他学生管理软件的不足去掉多余的操作要求制作和系统可以方便快捷地 对学生信息成绩等进行添加删除修改的操作并且可以批量的对新生信息的录入与分 班可以对...
  • 通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。二、任务自选一种程序设计语言(如VB、VC等)以及一种数据库管理系统(如SQL Server、Access...

    一、目的和要求

    通过本次课程设计,加深对数据库原理以及相关程序设计语言的理解和应用水平。通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。

    二、任务

    自选一种程序设计语言(如VBVC等)以及一种数据库管理系统(如SQL ServerAccess等)开发一个小型的数据库应用系统。

    三、主要内容

    1系统分析与数据库设计阶段
    1)
    进行系统需求分析和系统设计。
    2)
    设计数据模型并进行优化,确定数据库结构、功能结构和系统安全性、完整性要求。
    2
    应用程序设计阶段
    1)
    完成数据库定义工作,实现系统数据的处理和录入。
    2)
    实现应用程序的设计编程优化功能,实现数据安全性数据完整性和并发控制技术等功能,并针对具体课题提出解决方法。
    3
    系统集成调试阶段
    对系统的各个应用程序进行集成和调试,进一步优化系统性能,改善系统用户界面。

    展开全文
  • 实用文案标准文档学生管理系统_C#毕业设计系统设计原理2.1需求分析针对其他学生管理软件的不足,去掉多余的操作,要求制作和系统可以方便、快捷地对学生信息、成绩等进行添加、删除、修改的操作,并且可以批量的对...
  • 重庆交通大学信息科学和工程学院 设计性试验汇报 专 业计算机科学和技术软件开发 班 级 20XX 级 软件 2 班 学 号 姓 名 刘 克 课 程 名 称 数据库原理 试验项目性质 设计性试验 试验所属课程 数据库原理 试验室(中心...
  • JAVA学生管理系统

    2020-12-05 18:38:55
    学生基本信息和学生成绩管理 学生基本信息:姓名、学号、专业、班级、所属院系。 各科成绩:高等数学、英语、数据结构、计算机组成原理、面向对象程序设计 系统可以完成对各类信息的添加、修改、删除等功能。 成绩...
  • 学生信息管理系统 本题目设计目的是训练学生的基本编程能力了解...储结构实现对学生成绩管理原理为进一步开发出高质量的管理信息系统打下坚实的基 础 1 问题定义 创建一个学生信息管理系统.方便管理同学们的信息.系统
  • java学生管理系统.zip

    2021-03-09 13:33:29
    系统管理模块:因为本系统是用来管理学生成绩的,所以系统运行的正常和安全性非常重要,为了达到此目的本系统需要一个管理系统安全的系统管理模块。其任务是维护系统的正常运行和安全性设置。该模块的主要任务是维护...
  • 掌握数据库设计原理及相关软件的使用3、软件定义:学生信息管理系统4、开发环境:SQLSERVER二、需求分析1、问题的提出:学生信息管理是整个学校管理工作中的关键环节之一,涉及到学生基本信息管理、成绩管理、住宿...
  • 学生选课管理系统(上)

    千次阅读 2019-09-11 09:43:36
    学生选课管理系统(上) 设计内容与要求: 1、系统用户由三类组成:教师、学生和管理员。 2、管理员负责的主要功能: ①用户管理(老师、学生及管理员的增、删、改); ②课程管理(添加、删除和修改); ③...
  • .word可编辑 .word可编辑. 专业 专业.专注 学生信息管理系统 本题目设计目的是训练学生的基本编程能力...掌握利用单链表存 储结构实现对学生成绩管理原理 为进一步开发出高质量的管理信息系统打下坚实的基 础 1问题定
  • 广东海译大学 数据库系统原理 课程设计报告说明书 学生信息管理系统 学生姓名 学号 所在专业 所在班级 指导教师 提交时间 评阅情况 成绩 读书笔记 错误未定义书签 1.学生信息管理系统概述 2 TOC \o "1-5" \h \z \o ...
  • 学生学籍管理信息系统

    热门讨论 2009-05-28 14:51:27
    学生基本信息 学生成绩信息 根据基本系统模型,逐步细化,得到描绘逻辑系统细化后的数据流图。 D1 学生信息表 D3 课程信息表 学生基 本信息 课程信息 新生报到 1.2 1.3 成绩信息 注册 建档分班 课程确定 ...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

学生成绩管理系统设计原理