精华内容
下载资源
问答
  •  设计开发一个简单的“学生选课系统”,并实现基本的选课功能,查询功能。 主要功能及要求: (1)能够实现学生基本信息的录入、修改、删除等操作,其中学生信息包括班号、学号、性别等;  (2) 能够实现课程...

    设计内容:

       设计开发一个简单的“学生选课系统”,并实现基本的选课功能,查询功能。

    主要功能及要求:

    1)能够实现学生基本信息的录入、修改、删除等操作,其中学生信息包括班号、学号、性别等;

       (2) 能够实现课程信息的录入、修改、删除等功能,其中课程信息包括课程号、课程名、学分等;

    3)能实现选课功能,每个学生有选修学分限制,超出可选学分限制会提示;

    4)能方便的对学生选课情况进行查询,可以根据学号、姓名、班级、课程名等多种方式查询;

    5)有汇总功能,能对每个学生的选修学分汇总,并对选修学分不足的学生进行筛选。

    功能分析:

    (1)使用javaBean 连接数据库,并对学生信息和课程信息进行增,删,改,查。

    (2)对学分限制进行提示,自己想的是在页面中设置个全局变量,把每一次选中课的学分值传过来,保存到全局变量中,进行累加,最后判断是否超过规定学分。

       不足之处是它的值只保存在页面中,并不在数据库中,意味着只要关闭页面,保存的值就消失了。或许可以用application,把值保存在application中。

    (3)多种方式查询,自己写的是多个form表单,action里写处理页面的地址。感觉有点繁琐,每一种查询方式对应的一种处理页面,只是查询方法里的sql语句不同。

      或许可以先进行判断,到底是哪种查询,就调用哪种查询。但到底如何判断?自己没有想法。

    (4)汇总功能,想的是先构建一个sc表(选修关系表),根据学号以及课程号查询出学生信息和课程信息,然后把有用的信息重新插入到sc表,然后再根据学号,查询每个学生现在所有的学分总和。

    (5)如何实现学生的选课?以学生的身份进入系统,会看到自己能选的课程表,然后添加个选课链接,链接把课程的课程号和学分传走到处理页面。

    (6)如何获取学生的学号?在登录页面,设置学号和密码。把学号保存到session中,处理的时候再获取。

    (7)两种身份:

       学生;能够选课,查看选课结果。

       管理员:能够处理学生和课程信息,多种方式查询学生选课情况,对选修学分的汇总。


    展开全文
  • 学生选课系统

    2013-11-15 13:44:50
    为了是读者及使用者更好地了解本操作流量,下面对学生选课系统功能进行简单的描述。在本选课系统中,用到的数据库有5个表,利用C++编程连接数据库以实现所要求的操作;利用MFC实现操作的可视化,方便用户操作。在...
  • jsp 学生选课系统

    热门讨论 2009-11-22 13:44:37
    学生选课系统,该系统主要实现简单的大学学生选修课程的功能。 1.系统的用户主要分为2类:学生和管理员 2.数据描述 <1> 课程: 课程号、课程名、学分、学时、教师、开课学期、适用专业、最大选课人数 <2> 学生:...
  • 学生选课系统java实现

    万次阅读 多人点赞 2015-10-16 20:54:04
    学生选课系统java实现需求描述学生选课系统是集管理员管理系别、班级、课程、教师、学生,学生登录、修改密码、查看选课信息、选课、查看所选课程成绩,教师登录、修改密码、查看认可信息、录入修改成绩这些功能于...

    需求描述

    学生选课系统是集管理员管理系别、班级、课程、教师、学生,学生登录、修改密码、查看选课信息、选课、查看所选课程成绩,教师登录、修改密码、查看认可信息、录入修改成绩这些功能于一体的系统。
    

    1. 列表内容
    管理员维护基本资料
    1)管理员
    2)系别
    3)班级
    4)科目
    5)教师
    6)学生
    2. 学生登录
    1)修改密码
    2)查看可选课程信息
    3)选课
    4)查看所选课程成绩
    3. 教师登录
    1)修改密码
    2)查看任课信息
    3)查看选课信息
    4)录入修改成绩

    语言和环境

    实现语言:java
    实现技术:JavaSE、JDBC、Swing
    环境要求:NetBeans 8.0.2、SQL Server 2014、JDK 1.8.0

    主要结构

    包名 说明
    com.gs.stu.source 图片资源包
    com.gs.stu.util 工具类包
    com.gs.stu.bean 实体类包
    com.gs.stu.dao 数据访问接口包
    com.gs.stu.service 业务逻辑接口包
    com.gs.stu.service.impl 业务逻辑实现类包
    com.gs.stu.view 视图包

    详细设计

    util包

    包名 说明
    com.gs.stu.util DBConnection 数据库连接关闭类
    LocationUtil 窗体显示位置工具类
    FrameUtil 内部窗体创建工具类

    bean包

    包名 说明
    com.gs.stu.bean Manager 管理员类
    Department 系部类
    ClassBean 班级类
    Teacher 教师类
    TeacherView 教师视图类
    Course 课程类
    CourseView 课程视图类
    Student 学生类
    StudentView 学生视图类
    SelectCourse 选课类
    SelectCourseView 选课视图类
    Log 日志类

    dao包

    包名 接口 说明
    com.gs.stu.dao SysManagerDao 管理员管理接口
    SysDepartmentDao 系部管理接口
    SysClassDao 班级管理接口
    SysTeacherDao 教师管理接口(管理员部分)
    SysCourseDao 课程管理接口
    SysStudentDao 学生管理接口(管理员部分)
    SysLogDao 日志管理接口
    StudentDao 学生管理接口
    TeacherDao 教师管理接口

    service包

    包名 接口 说明
    com.gs.stu.service SysManagerService 管理员业务管理接口
    SysDepartmentService 系部业务管理接口
    SysClassService 班级业务管理接口
    SysTeacherService 教师业务管理接口(管理员部分)
    SysCourseService 课程业务管理接口
    SysStudentService 学生业务管理接口(管理员部分)
    SysLogService 日志业务管理接口
    StudentService 学生业务管理接口
    TeacherService 教师业务管理接口

    功能模块设计(后台)

    管理员管理部分

    管理员业务管理模块

    1. Dao接口类:
    类名:SysManagerDao
    成员变量:
    private int id;--编号
    private String sysaccount;--用户名
    private String syspassword;--密码
    2. 接口内方法:
    Manager managerLogin(String sysaccount,String syspassword);--根据帐号和密码查询管理员
    int addManager(Manager m);-- 添加管理员
    int deleteManager(int id);-- 删除管理员
    int updateManager(Manager m);-- 修改管理员密码
    Manager findManagerById(int id);-- 根据id查询管理员
    Manager findManagerByAccount(String sysaccount);-- 根据帐号查询管理员
    List<Manager> findAllManager();--查询所有管理员信息
    3. Service接口类
    类名:SysManagerService
    Manager managerLogin(String sysaccount,String syspassword);-- 根据帐号和密码查询管理员
    boolean addManager(Manager m);-- 添加管理员
    boolean deleteManager(int id);-- 删除管理员
    boolean updateManager(Manager m);-- 修改管理员密码
    Manager findManagerById(int id);-- 根据id查询管理员
    Manager findManagerByAccount(String sysaccount);-- 根据帐号查询管理员
    List<Manager> findAllManager();--查询所有管理员信息
    4. 具体实现类个别详解

    1) Dao接口实现类名称:SysManagerDaoImpl

    //例:查询所有管理员信息
    public List<Manager> findAllManager() {
            List<Manager> list = new ArrayList<Manager>();
            Connection conn =DBConnection.getConnection(); //创建连接
            Manager mng =null;//创建一个管理员空对象
            String sql = "use selectivedb select * from t_manager ";//数据库要执行的操作
    //调用Execute类中的executeQuery(String sql,Connection con)来执行
            ResultSet rs =ExecuteSql.executeQuery(sql, conn);
            try{
                while(rs.next()){
                mng = new Manager();
                mng.setId(rs.getInt("id"));
                mng.setSysaccount(rs.getString("sysaccount"));
                mng.setSyspassword(rs.getString("Syspassword"));
                list.add(mng);//将获取到的Manager放到list中
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return list;
        }

    2) Service实现类名:SysManagerServiceImpl

    //例:提供查找所有的管理员的服务
    public List<Manager> findAllManager() {
            return s.findAllManager();
    }

    系部业务管理模块

    1. Dao接口类:
    类名:SysDepartmentDao
    成员变量:   
    private int id;
    private String depname;
    2. 接口内方法:
    int addDepartment(Department dep);-- 添加系
    int deleteDepartment(int id);-- 删除系
    int updateDepartment(Department dep);-- 更新系名称
    Department findDepById(int id);-- 根据编号查找系
    Department findDepByName(String depname);-- 根据名称查找系
    List<Department> findAllDep();--查看所有系
    3. Service接口类
    类名:SysDepartmentService
    boolean addDepartment(Department dep);-- 添加系
    boolean deleteDepartment(int id);-- 删除系
    boolean updateDepartment(Department dep);-- 更新系名称
    Department findDepById(int id);-- 根据编号查找系
    Department findDepByName(String depname);-- 根据名称查找系
    List<Department> findAllDep();--查看所有系
    4. 具体实现类个别详解
    1)  Dao接口实现类名称:SysDepartmentDaoImpl
        //添加系
        public int addDepartment(Department dep) {
            int i = 0;
            String depname = dep.getDepname();
            Connection conn =DBConnection.getConnection();
            try{
                String sql ="use selectivedb insert into t_department (depname) values('"+depname+"')";
                i = ExecuteSql.executeUpdate(sql, conn);
            }catch(Exception e){
                e.printStackTrace();
            }
            DBConnection.closeConn(conn);
            return i;
    }
    2)  Service实现类名:SysDepartmentServiceImpl
        public boolean addDepartment(Department dep) {
            return(s.addDepartment(dep)==1);
        }   

    班级业务管理

    1. Dao接口类:
    类名: SysClassDao
    成员变量:
    private int id;
    private String classname;
    接口内方法:
    //添加班级
    public int addClassBean(ClassBean classbean);
    //删除班级
    public int deleteClassBean(int id);
    //修改班级
    public int updateClassBean(ClassBean classbean);
    //根据编号查找班级
    public ClassBean findClassBeanById(int id);
    //根据名称查找班级
    public ClassBean findClassBeanByName(String classname);
    //查看所有班级
    public List<ClassBean> findAllClass();
    2. Service接口类
    类名: SysClassService
    接口内的方法:
    //添加班级
    public boolean addClassBean(ClassBean classbean);
    //删除班级
    public boolean deleteClassBean(int id);
    //修改班级
    public boolean updateClassBean(ClassBean classbean);
    //根据编号查找班级
    public ClassBean findClassBeanById(int id);
    //根据名称查找班级
    public ClassBean findClassBeanByName(String classname);
    //查看所有班级
    public List<ClassBean> findAllClass();
    3. 具体实现类个别详解
    Dao接口实现类名称:SysClassDaoImpl
    //通过班级名称来找到班级
        public ClassBean findClassBeanByName(String classname) {
            Connection conn =DBConnection.getConnection();
            ClassBean clsb = null;
            String sql = "use selectivedb select * from t_class where classname= '"+classname+"'";
            ResultSet rs =null;
            try{
                rs =ExecuteSql.executeQuery(sql, conn);
                while(rs.next()){
                    clsb = new ClassBean();
                    clsb.setId(rs.getInt("id"));
                    clsb.setClassname(rs.getString("classname"));                
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            DBConnection.closeConn(conn);
            return clsb;  
        }
    Service实现类名:SysClassServiceImpl
    //通过班级名称来找到班级
        public ClassBean findClassBeanByName(String classname) {
            return c.findClassBeanByName(classname);
        }

    教师业务管理

    1. Dao接口类:
    类名: TeacherDao
    成员变量:
    TeacherView:
       private int tid;
       private String tpassword;
       private String tname;
       private String tsex;
       private int tage;
       private String tjob;
       private String depname;
    Teacher:
       private int tid;
       private String tpassword;
       private String tname;
       private short tsex;
       private int tage;
       private String tjob;
       private int tdepartment;
    接口内方法:
        //1.登录
        public Teacher teacherLogin(int tid, String tpassword);
        //2.修改密码
        public int updatePassword(int tid, String tpassword);
        //3.查看自己的任课信息
        public List<Course> findCourseByTeacher(int tid);//根据教师编号查询教师任课信息
        //4.查看选课信息(某门课有哪些学生选修)
        public List<StudentView> findSelectCourseByCid(int cid);//根据课程号查询选课信息
        //5.录入成绩
        public int updateScore(SelectCourse sc);//根据学号,课程号,录入或修改成绩
        //6.成绩信息查看(某门课成绩)
        public List<SelectCourseView> findCourseScoreByCid(int cid);
    2. Service接口类
    类名: SysTeacherService
    类中方法:
    //添加教师
        public boolean addTeacher(Teacher tea);
        //删除教师
        public boolean deleteTeacher(int tid);
        //修改教师
        public boolean updateTeacher(Teacher tea);
        //根据教师工号查找
        public TeacherView findTeaById(int tid);
        //查看所有教师
        public List<TeacherView> findAllTeacher();
    3. 具体实现类个别详解
    Dao接口实现类名称:SysTeacherDaoImpl
    //更新教师信息
    public int updateTeacher(Teacher tea) {
         int tid = tea.getTid();
         String tpassword= tea.getTpassword();
         String tname = tea.getTname();
         short tsex = tea.getTsex();
         int tage = tea.getTage();
         String tjob = tea.getTjob();
         int tdepartment = tea.getTdepartment();
         int i = 0;
         Connection conn =DBConnection.getConnection();
         try{
            String sql ="use selectivedb update t_teacher set tpassword = '"+tpassword+
             "',Tname = '"+tname+"',Tsex = "+tsex+",tage ="+tage+",Tjob = '"+tjob+"',tDepartment="
                    + ""+tdepartment+" where tid = "+tid;
             i = ExecuteSql.executeUpdate(sql, conn);
           }catch(Exception e){
            e.printStackTrace();
          }
         DBConnection.closeConn(conn);
         return i;
        }
    Service实现类名:SysTeacherServiceImpl
    //提供更新教师信息服务
    public boolean updateTeacher(Teacher tea) {
            return (s.updateTeacher(tea)==1);   
        }

    课程业务管理

    1. Dao接口类:
    类名: SysCourseDao
    成员变量:
    CourseView:
       private int id;
       private String coursename;
       private int credit;
       private String ctime;
       private String caddress;
       private String tname;
       private int limitnumber;
       private int truenumber;
    Course:
       private int id;
       private String coursename;
       private int credit;
       private String ctime;
       private String caddress;
       private int teacher;
       private int limitnumber;
       private int truenumber;
    接口内方法:
        //添加课程
        public int addCourse(Course cou);
        //根据课程编号删除课程
        public int deleteCourse(int id);
        //修改课程
        public int updateCourse(Course cou);
        //根据课程名查找课程
        public CourseView findCouByName(String coursename);
        //查看所有课程
        public List<CourseView> findAllCourse();
        public boolean findCouByAll(Course cou);
    2. Service接口类

    类名: SysCourseService

    3. 具体实现类个别详解
    Dao接口实现类名称:
    Service实现方法名:
        //添加课程
        public boolean addCourse(Course cou);
        //删除课程
        public boolean deleteCourse(int id);
        //修改课程
        public boolean updateCourse(Course cou);
        //根据课程名查找课程
        public CourseView findCouByName(String coursename);
        //查看所有课程
        public List<CourseView>findAllCourse();
        public boolean findCouByAll(Course cou);

    学生业务管理

    1. Dao接口类:
    类名: SysStudentDao
    成员变量:
    StudentView:
        private int sid;
        private String sname;
        private String spassword;
        private String ssex;
        private int sage;
        private String classname;
    private String depname;
    Student:
        private int sid;
        private String sname;
        private String spassword;
        private short ssex;
        private int sage;
        private int sclass;
        private int sdepartment;
    接口内方法:
        //添加学生
        public int addStudent(Student stu);
        //删除学生
        public int deleteStudent(int sid);
        //修改学生
        public int updateStudent(Student stu);
        //根据学号查找学生
        public StudentView findStuById(int sid);
        //查找所有学生
        public  List<StudentView> findAllStudent();
    2. Service接口类
    类名: SysStudentService
    接口内方法:
        //添加学生并返回学号
        public boolean addStudent(Student stu);
        //删除学生
        public boolean deleteStudent(int sid);
        //修改学生
        public boolean updateStudent(Student stu);
        //根据学号查找学生
        public StudentView findStuById(int sid);
        //查找所有学生
        public  List<StudentView> findAllStudent();
    3. 实现类
    Dao接口实现类名称:SysStudentDaoImpl
    Service实现类名:SysStudentServiceImpl   

    日志管理

    1. Dao接口类:
    类名: SysLogDao
    成员变量:
      private int id ;
      private String Loginaccount ;
      private String Logintime  ;
    接口内方法:
      //记录登录信息
      public int setLog(Log log);
      //获得所有登录日志
      public List<Log> getLogs();
    2. Service接口类
    类名: SysLogService
    接口内方法:
        //记录登录信息
        public boolean setLog(Log log);
        //获得所有登录日志
        public List<Log> getLogs();
    3. 实现类
    Dao接口实现类名称:SysLogDaoImpl
    Service实现类名:SysLogServiceImpl

    教师管理部分

    1. Dao接口类:TeacherDao

        //1.登录
        public Teacher teacherLogin(int tid, String tpassword);
        //2.修改密码
        public int updatePassword(int tid, String tpassword);
        //3.查看自己的任课信息
        public List<Course> findCourseByTeacher(int tid);//根据教师编号查询教师任课信息
        //4.查看选课信息(某门课有哪些学生选修)
        public List<StudentView> findSelectCourseByCid(int cid);//根据课程号查询选课信息
        //5.录入成绩
        public int updateScore(SelectCourse sc);//根据学号,课程号,录入或修改成绩
        //6.成绩信息查看(某门课成绩)
        public List<SelectCourseView> findCourseScoreByCid(int cid);
    展开全文
  • 学生选课系统.zip

    2019-10-22 19:00:57
    需求: 1、 课程信息:课程号、课程名称、上课教师、课程简介、学分(均为整数); 2、 学生分为本科生和研究生,...d) 数据统计:可分别按学生和课程统计选课情况; 4、 考虑各类异常,确保系统不会因用户误操作而崩溃。
  • C++学生选课系统 【含 代码】

    万次阅读 多人点赞 2020-03-02 22:03:18
    学生选课系统,在登录模块之后,根据系统用户的身份不同划分为三个模块,即:学生模块、教师模块和管理员模块。 1.2功能模块描述 (1)登录模块 登录模块用于用户身份选择与用户登录,完成基本的验证。根据所填...

    目录

    1.系统分析

    1.1模块划分

    1.2功能模块描述

    2.系统设计

    【系统流程图】

    【类图】

    3.文件说明

    4.测试数据

    5.系统效果图【部分】

     

    6.源代码


    1.系统分析

    本系统的用户分为普通用户和管理员两类,其中普通用户包括教师和学生。普通用户只能对自己的信息进行查询与修改,管理员则拥有所有功能权限。

    1.1模块划分

        学生选课系统,在登录模块之后,根据系统用户的身份不同划分为三个模块,即:学生模块、教师模块和管理员模块。

    1.2功能模块描述

       (1)登录模块

    登录模块用于用户身份选择与用户登录,完成基本的验证。根据所填信息进行判断,提示“登录成功”、“用户名不存在”或者“密码错误”的信息。

       (2)学生模块

    学生登录之后,可以查看课程、选课以及修改密码等功能。

    (3)教师模块

        教师登录之后,可以查看自己所教课程的信息,以及选择该课程的学生信息,可以修改个人密码。

       (4)管理员模块

    管理员登录之后,可以对该系统进行管理,原则上拥有所有用户的全部权限。主要功能有添加、修改及删除课程信息,设置选课、退课时间,查看课程信息和修改密码等。

    2.系统设计

    【系统流程图】

    【类图】

    3.文件说明

    4.测试数据

    (1)课程信息测试数据,见文件“Subject.txt”;

    建议下列数据使用“添加课程”功能录入,每添加一门课程,会自动创建一个文件名为“课程编号”的txt文件。

    B06010900 数学建模 3 0 180 邢老师 t1003 理学与工学类
    B12015700 交响乐鉴赏 2 5 160 刘老师 t1001 艺术与体育类
    B13020820 社会心理学B 2 2 140 汪老师 t1002 教育与文学类
    B15064100 普通话读说艺术 2 2 180 杨老师 t1005 哲学与社科类
    B12082400 影视文化欣赏 2 2 180 刘老师 t1001 哲学与社科类
    B27011700 教育心理学 2 2 180 王老师 t1007 教育与文学类

    (2)学生信息测试数据,见文件“Student.txt”;

    1908010301 姓名01 信息学院 计算机 153
    1908010302 姓名02 信息学院 计算机 153
    1908010303 姓名03 信息学院 计算机 153
    1908010304 姓名04 信息学院 计算机 153
    1908010305 姓名05 信息学院 计算机 153
    1908010306 姓名06 信息学院 计算机 153
    1908010307 姓名07 信息学院 计算机 153
    1908010308 姓名08 信息学院 计算机 153

    (3)学生账号密码测试数据,见文件“studentIP.txt”;

    1908010301 123
    1908010302 1234
    1908010303 12345
    1908010304 123456
    1908010305 12345
    1908010306 1234
    1908010307 123
    1908010308 12
    

    (4)教师账号密码测试数据,见文件“TeacherIP.txt”;

    t1001 123
    t1002 123
    t1003 123
    t1004 123
    t1005 123
    t1006 123
    t1007 123
    

    (5)管理员账号密码测试数据,见文件“ManagerIP.txt”;

    m1 1236
    m2 1236
    

    (6)学生选课情况测试数据,保存于文件“StSubject.txt”;

    【注】:最开始需要把该文件初始化为“学号 0”的形式。意思为,改学生选课科目数为0。如下:

    1908010301 0
    1908010302 0
    1908010303 0
    1908010304 0
    1908010305 0
    1908010306 0
    1908010307 0
    1908010308 0
    

    (7)选课时间测试数据,见文件“TimeSelect.txt”;

    2019 4 8
    2019 4 11
    

    (8)退课时间测试数据,见文件“TimeQuit.txt”。

    2019 4 8
    2019 4 12
    

     

    5.系统效果图【部分】

    【登录】

    【学生】

    【教师】

    【管理员】

    6.源代码

    【运行前需要自行新建所需文件,必要时自己加上测试数据】

    【如果本博文对你有帮助,动动手指,点个呗,诚谢~】

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstdlib>
    #include <cstring>
    #include <conio.h>
    #include <ctime>
    #include <iomanip>
    
    using namespace std;
    
    class Student;
    
    //账号密码
    class IdPw
    {
    public:
        IdPw(){}
        ~IdPw(){}
        string id; //账号
        string password; //密码
        IdPw *next;
    };
    
    //课程
    class Subject
    {
    public:
        Subject(){}
        ~Subject(){}
    
        string subID; //课程号
        string subName; //课程名
        string subTearcherID; //任课教师工号
        string subTeacher; //任课老师
        string subCate; //课程类型
        float mark; //学分
        int maxNum; //课程最大容量
        int okNum; //选此课的人数
        Subject *next;
        Student *head_SubSt; //选此课的学生信息
    };
    
    //基类
    class Base
    {
    public:
        Base(){}
        ~Base(){}
        void readShowSub(); //显示可选课程
    
        IdPw ip;
    };
    
    //学生
    class Student : virtual public Base
    {
    public:
        Student(){}
        ~Student(){}
        void querySub(); //查询已选课程
        void selecSub(); //选课
        void quitSub(); //退课
        void modifyPw(); //修改密码
    
        int n; //已选课程数
        string stNo; //学号
        string name; //姓名
        string college; //学院
        string major; //专业
        string clas; //班级
        Student *next;
        Subject *head_stSub; //所选课程
    };
    
    //教师
    class Teacher : virtual public Base
    {
    public:
        Teacher(){}
        ~Teacher(){}
        void querySubInfo(); //查询所教课程信息
        void modifyPw(); //修改密码
    };
    
    //管理员
    class Manager : public Student, public Teacher
    {
    public:
        Manager(){}
        ~Manager(){}
        void addSub(); //添加课程
        void deleteSub(); //删除课程
        void modifySub(); //修改课程信息
        void setSelSubTime(); //设置选课时间
        void setQuitSubTime(); //设置退课时间
        void modifyPwM(); //修改密码
        void ShowSub();
        void writeSub(Subject *head_sub);
        void writeAddSub(Subject *p);
    };
    
    class Time
    {
    public:
        int year;
        int month;
        int day;
    };
    
    /**声明对象**/
    Student st;
    Teacher tea;
    Manager ma;
    Time start, endt;
    
    /** Base **/
    //读取课程文件
    Subject* readSub()
    {
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        Subject *p, *q;
        q = head_sub;
        ifstream in("Subject.txt");
        if (!in)
        {
            cout << "\n\n\t\t\t\tCan't open \"Subject.txt\"!";
            exit(0);
        }
    
        p = new Subject;
        while (in >> p ->subID >> p ->subName >> p ->mark >> p ->okNum >> p ->maxNum >> p ->subTeacher >> p ->subTearcherID >> p ->subCate)
        {
            p ->next = NULL;
            q ->next = p;
            q = p;
            p = new Subject;
        }
        in.close();
        return head_sub;
    }//Base::readSub
    
    //显示可选课程
    void Base::readShowSub()
    {
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        head_sub = readSub();
        Subject *p = head_sub ->next;
        cout << setiosflags(ios_base::left) << setw(4) << "序号" << setw(13) << "  课程编号" << setw(16) << "  课程名" << setw(6) << "学分" << setw(7) << "剩余" << setw(10) << "最大容量" << setw(10) <<"任课老师" << "课程属性\n";
        cout << "===========================================";
        cout << "====================================" << endl;
        int i = 1;
        while (p)
        {
            if (p ->maxNum - p ->okNum > 0)
                cout << setiosflags(ios_base::left)  << " " << setw(4) << i++ << setw(14) << p ->subID << setw(14) << p ->subName << setw(6) << p ->mark  << setw(8) << p ->maxNum - p ->okNum << setw(10) << p ->maxNum << setw(10) << p ->subTeacher << setw(10) <<p ->subCate << endl << endl;
            p = p ->next;
        }
    }//Base::readShowSub
    
    //读取账号密码文件
    IdPw * read(string fname)
    {
        IdPw *head_IP = new IdPw;
        IdPw *q = head_IP;
    
        ifstream in(fname);
        if (!in)
        {
            cout << "Can't open the file!" << endl;
            exit(0);
        }
        IdPw *p = new IdPw;
        while (in >> p ->id >> p ->password)
        {
            p ->next = NULL;
            q ->next = p;
            q = p;
            p = new IdPw;
        }
        in.close();
        return head_IP;
    }//read()
    
    //写入账号密码文件
    void write(IdPw *head_ip, string fname)
    {
        IdPw *p = head_ip ->next;
        head_ip ->next = NULL;
        ofstream ou(fname);
        if (!ou)
        {
            cout << "Can't open the file!" << endl;
            exit(0);
        }
        while(p)
        {
            ou << p ->id << " " << p ->password << endl;
            p = p ->next;
        }
        ou.close();
    }//write
    
    /** Student **/
    //修改密码
    void Student::modifyPw()
    {
        IdPw *head_ip = new IdPw;
        head_ip ->next = NULL;
        string pw1, pw2, pw3;
        int flag = 1;
    
        head_ip = read("studentIP.txt");
        if (head_ip == NULL)
        {
            cout << "\n\n\t\t\t\t文件打开错误,密码修改失败!";
            return ;
        }
        IdPw *p = head_ip ->next;
    
        cout << "\n\t\t\t\t请输入原密码:";
        cin >> pw1;
        cout << "\n\n\t\t\t\t请输入新密码:";
        cin >> pw2;
        cout << "\n\n\t\t\t\t再次输入新密码:";
        cin >> pw3;
    
        p = head_ip ->next;
        while (p)
        {
            if (p ->id == st.ip.id)
            {
                if (p ->password == pw1)
                {
                    if (pw2 == pw3)
                    {
                        p ->password = pw2;
                        cout << "\n\n\t\t\t\t密码修改成功!";
                        cout << " *按Enter键返回!*" << endl;
                        write(head_ip, "studentIP.txt");
                    }
                    else
                    {
                        cout << "\n\n\t\t\t\t两次新密码不一致!";
                    }
                    flag = 0;
                }
            }
            if (flag == 0)
                break;
            p = p ->next;
        }
        if (flag == 1)
            cout << "\n\n\t\t\t\t原密码输入错误!";
    }//Student::modifyPw()
    
    //读取选课时间
    void readTime1()
    {
        ifstream in("TimeSelect.txt");
        if (!in)
        {
            cout << "Can't open \"TimeSelect.txt\"!";
            exit(0);
        }
        in >> start.year >> start.month >> start.day;
        in >> endt.year >> endt.month >> endt.day;
    }//readTime1()
    
    //读取退课时间
    void readTime2()
    {
        ifstream in("TimeQuit.txt");
        if (!in)
        {
            cout << "Can't open \"TimeQuit.txt\"!";
            exit(0);
        }
        in >> start.year >> start.month >> start.day;
        in >> endt.year >> endt.month >> endt.day;
    }//readTime2()
    
    /** 计算两个日期的“时间差” **/
    int diffDay(Time t1, Time t2)
    {
        if (t1.month == t2.month)
            return t2.day-t1.day;
        return 31-t1.day+t2.day;
    }//diffDay(Time t1, Time t2)
    
    /** 读取学生-课程信息文件 **/
    Student* readStSub()
    {
        Student *head_st = new Student;
        head_st ->next = NULL;
        Student *p, *q;
        p = new Student;
        q = head_st;
        q ->next = NULL;
    
        p ->head_stSub = new Subject;
        p ->head_stSub ->next = NULL;
        Subject *s, *t;
        t = p ->head_stSub;
        t ->next = NULL;
        // 读取学生选课文件
        ifstream in("StSubject.txt");
        if (!in)
        {
            cout << "Can't open \"StSubject.txt\"!";
            exit(0);
        }
        while (in >> p ->stNo >> p ->n)
        {
            for (int i = 0; i < p ->n; i++)
            {
                s = new Subject;
                in >> s ->subID;
                s ->next = NULL;
                t ->next = s;
                t = s;
            }
            p ->next = NULL;
            q ->next = p;
            q = p;
            p = new Student;
            p ->head_stSub = new Subject;
            t = p ->head_stSub;
            t ->next = NULL;
        }//while
        in.close();
        return head_st;
    }//readStSub()
    
    /** 更新学生-课程信息文件 **/
    void writeStSub(Student *head_st)
    {
        Student *p;
        Subject *s;
        ofstream ou2("StSubject.txt");
        if (!ou2)
        {
            cout << "Can't open \"StSubject.txt\"!";
            exit(0);
        }
        p = head_st ->next;
        while (p)
        {
            //该学生所选的课程数加一
            if (p ->stNo == st.ip.id)
               p ->n++;
    
            ou2 << p ->stNo << " " << p ->n;
            s = p ->head_stSub ->next;
            while (s)
            {
                ou2 << " " << s ->subID;
                s = s ->next;
            }
            ou2 << endl;
            p = p ->next;
        }
        ou2.close();
    }//writeStSub()
    
    /** 学生选课 **/
    void Student::selecSub()
    {
        //判断是否是选课时间
        Time nowTime;
        time_t t = time(NULL);
        tm *tt = localtime(&t);
        nowTime.year = tt ->tm_year+1900;
        nowTime.month = tt ->tm_mon+1;
        nowTime.day = tt ->tm_mday;
        readTime1();
        int x = diffDay(start, endt);
        int y = diffDay(start, nowTime);
    
        if (x >= y)
        {
            Subject *head_sub = new Subject;
            head_sub ->next = NULL;
            head_sub = readSub();
            Subject *a = head_sub ->next;
    
            //显示可选课程
            readShowSub();
            int c;
            cout << "\n  请输入要选择的课程(序号):";
            cin >> c;
    
            //根据输入的序号定位课程
            int i = 1;
            int flag = 0;
            while (a)
            {
                if (c == i)
                {
                    flag = 1;
                    break;
                }
                if (a ->maxNum - a ->okNum > 0)
                    i++;
                a = a ->next;
            }
            if (flag == 1)
            {
                /** 判断是否已选此课,并更新信息 **/
                Student *head_st = new Student;
                head_st ->next = NULL;
                head_st = readStSub();
                Student *p;
                p = new Student;
    
                p ->head_stSub = new Subject;
                p ->next = NULL;
                Subject *s, *t;
    
                //判断该学生本学期是否已选本课程
                int flag1 = 0, flag2 = 1;
                p = head_st ->next;
                while (p)
                {
                    if (p ->stNo == st.ip.id)
                    {
                        flag1 = 1;
                        s = p ->head_stSub ->next;
                        t = p ->head_stSub;
                        while (s)
                        {
                            if (s ->subID == a ->subID)
                            {
                                flag2 = 0;
                                break;
                            }
                            t = s;
                            s = s ->next;
                        }
                        break;
                    }//if
                    p = p ->next;
                }//while
    
                //更新学生-课程文件
                if (flag1 == 1 && flag2 == 1)
                {
                    //将新选课程加入链表
                    s = new Subject;
                    s ->subID = a ->subID;
                    s ->next = NULL;
                    t ->next = s;
    
                    writeStSub(head_st);
    
                    //修改课程信息
                    a ->okNum++;
                    ma.writeSub(head_sub);
    
                    //更新课程_学生信息
                    Student *head_st2 = new Student;
                    Student *e = new Student, *r;
                    r = head_st2;
                    r ->next = NULL;
    
                    //读取学生基本信息
                    ifstream in2("Student.txt");
                    if (!in2)
                    {
                        cout << "Can't open \"Student.txt\"!";
                        exit(0);
                    }
                    while (in2 >> e ->stNo >> e ->name >> e ->college >> e ->major >> e ->clas)
                    {
                        e ->next = NULL;
                        r ->next = e;
                        r = e;
                        e = new Student;
                    }
                    in2.close();
    
                    //将学生信息加入到课程-学生文件
                    r = head_st2 ->next;
                    while (r)
                    {
                        if (r ->stNo == st.ip.id)
                            break;
                        r = r ->next;
                    }
    
                    string ssss = a ->subID + ".txt";
                    ofstream ou(ssss, ios::app);
                    if (!ou)
                    {
                        cout << "Can't open \"" << ssss << "\"!";
                        exit(0);
                    }
                    ou << r ->stNo << " " << r ->name << " " << r ->college << " " << r ->major << " " << r ->clas << endl;
                    ou.close();
                    cout << "选课成功!";
                    cout << " *按Enter键返回!*" << endl;
                }//if
                else
                {
                    cout << " 你本学期已选本课程!" << endl;
                }
            }//if
            else
            {
                cout << " 输入错误!" << endl;
            }
        }//if (x >= y)
        else
            cout << "现在不是选课时间!";
    }//Student::selecSub()
    
    /** 查看已选课程 **/
    void Student::querySub()
    {
        Subject *head_Sub = new Subject;
        head_Sub ->next = NULL;
        Subject *p, *s;
        Student *head_st  =new Student;
        head_st ->next = NULL;
        Student *sp;
    
        head_Sub = readSub();
        head_st = readStSub();
        sp = head_st ->next;
        int i = 1;
    
        cout << "序号     课程号    " <<  "    课程名      " << "  学分 " << " 任课教师 " << " 课程属性" << endl;
        cout << "===========================================";
        cout << "===================================" << endl;
        while (sp)
        {
            if (sp ->stNo == st.ip.id)
            {
                s = sp ->head_stSub ->next;
                while (s)
                {
                    p = head_Sub;
                    while (p)
                    {
                        if (p ->subID == s ->subID)
                        {
                            cout << " " << setiosflags(ios_base::left) << setw(6) << i++ << setw(13) << p ->subID << setw(18) << p ->subName << setw(6) << p ->mark << setw(10) << p ->subTeacher << p ->subCate << endl << endl;
                            break;
                        }
                        p = p ->next;
                    }//while
                    s = s ->next;
                }//while
                break;
            }//if
            sp = sp ->next;
        }//while
    }//Student::querySub()
    
    /** 读取课程-学生文件 **/
    Student * readSubSt(string s)
    {
        Student *head = new Student;
        Student *r = new Student, *q;
        q = head;
        q ->next = NULL;
    
        ifstream in(s);
        if (!in)
        {
            cout << "Can't open \"" << s << "\"!";
            exit(0);
        }
        while (in >> r ->stNo >> r ->name >> r ->college >> r ->major >> r ->clas)
        {
            r ->next = NULL;
            q ->next = r;
            q = r;
            r = new Student;
        }
        in.close();
        return head;
    }//readSubSt
    
    /** 退课 **/
    void Student::quitSub()
    {
        //判断是否是选课时间
        Time nowTime;
        time_t t = time(NULL);
        tm *tt = localtime(&t);
        nowTime.year = tt ->tm_year+1900;
        nowTime.month = tt ->tm_mon+1;
        nowTime.day = tt ->tm_mday;
        readTime2();
        int x = diffDay(start, endt);
        int y = diffDay(start, nowTime);
        if (x >= y)
        {
            //显示已选课程
            querySub();
            int c;
            cout << "请选择退选课的序号:";
            cin >> c;
    
            //定位课程
            Student *head_st = new Student;
            head_st ->next = NULL;
            Student *p;
            head_st = readStSub();
            int i = 1;
            Subject *s;
            string subId;
    
            p = head_st ->next;
            while (p)
            {
                if (p ->stNo == st.ip.id)
                {
                    s = p ->head_stSub ->next;
                    while (s)
                    {
                        i++;
                        s = s ->next;
                    }
                    break;
                }
            }//while
            if (c <= i && c > 0)
            {
                i = 1;
                //更新学生-课程文件
                ofstream ou("StSubject.txt");
                if (!ou)
                {
                    cout << "Can't open \"StSubject.txt\"!";
                    exit(0);
                }
                p = head_st ->next;
                while (p)
                {
                    if (p ->stNo == st.ip.id)
                    {
                        p ->n--;
                        ou << p ->stNo << " " << p ->n;
                        s = p ->head_stSub ->next;
                        while (s)
                        {
                            if (i != c)
                                ou << " " << s ->subID;
                            else
                                subId = s ->subID;
                            i++;
                            s = s ->next;
                        }
                    }//if
                    else
                    {
                        ou << p ->stNo << " " << p ->n;
                        s = p ->head_stSub ->next;
                        while (s)
                        {
                            ou << " " << s ->subID;
                            s = s ->next;
                        }
                    }
                    ou << endl;
                    p = p ->next;
                }//while
                ou.close();
    
                //更新课程文件
                Subject *head_sub = new Subject;
                head_sub ->next = NULL;
                head_sub = readSub();
                s = head_sub ->next;
                while (s)
                {
                    if (s ->subID == subId)
                    {
                        s ->okNum--;
                        break;
                    }
                    s = s ->next;
                }
                ofstream ou2("Subject.txt");
                if (!ou2)
                {
                    cout << "Can't open the file!";
                    exit(0);
                }
                s = head_sub ->next;
                while (s)
                {
                    ou2 << s ->subID << " " << s ->subName << " " << s ->mark << " " << s ->okNum << " " << s ->maxNum << " " << s ->subTeacher << " " << s ->subTearcherID << " " << s ->subCate << endl;
                    s = s ->next;
                }
                ou2.close();
    
                //更新课程-学生文件
                Student *head_st2 = new Student;
                head_st2 ->next = NULL;
                string sss = subId + ".txt";
                head_st2 = readSubSt(sss);
    
                ofstream ou3(sss);
                if (!ou3)
                {
                    cout << "Can't open the file!";
                    exit(0);
                }
                p = head_st2 ->next;
                while (p)
                {
                    if (p ->stNo != st.ip.id)
                        ou << p ->stNo << " " << p ->name << " " << p ->college << " " << p ->major << " " << p ->clas << endl;
                    p = p ->next;
                }
                ou3.close();
                cout << "退课成功!";
                cout << " *按Enter键返回!*" << endl;
            }//if
            else
            {
                cout << "输入错误!";
            }
        }//if
        else
        {
            cout << "现在不是退课时间!";
        }
    }//Student::quitSub()
    
    /** Teacher **/
    //修改密码
    void Teacher::modifyPw()
    {
        IdPw *head_ip = new IdPw;
        head_ip ->next = NULL;
        string pw1, pw2, pw3;
        int flag = 1;
    
        head_ip = read("TeacherIP.txt");
        if (head_ip == NULL)
        {
            cout << "\n\n\t\t\t\t文件打开错误,密码修改失败!";
            return ;
        }
        IdPw *p = head_ip ->next;
    
        cout << "\n\t\t\t\t请输入原密码:";
        cin >> pw1;
        cout << "\n\n\t\t\t\t请输入新密码:";
        cin >> pw2;
        cout << "\n\n\t\t\t\t再次输入新密码:";
        cin >> pw3;
    
        p = head_ip ->next;
        while (p)
        {
            if (p ->id == tea.ip.id)
            {
                if (p ->password == pw1)
                {
                    if (pw2 == pw3)
                    {
                        p ->password = pw2;
                        cout << "\n\n\t\t\t\t密码修改成功!";
                        write(head_ip, "TeacherIP.txt");
                    }
                    else
                    {
                        cout << "\n\n\t\t\t\t两次新密码不一致!";
                    }
                    flag = 0;
                }//if
            }
            if (flag == 0)
                break;
            p = p ->next;
        }
        if (flag == 1)
            cout << "\n\n\t\t\t\t原密码输入错误!";
    }//Teacher::modifyPw
    
    /** 查询所教课程信息  **/
    void Teacher::querySubInfo()
    {
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        Student *head_SubSt = new Student;
        head_SubSt ->next = NULL;
        head_sub = readSub();
    
        Subject *p = head_sub ->next;
        cout << " 序号" << "   课程编号\t" << "课程名\t" << "  学分  " << "选课人数" << "  最大容量  " << "任课老师" << "  课程属性\n";
        cout << "===========================================";
        cout << "===================================" << endl;
        int i = 1;
        while (p)
        {
            if (p ->subTearcherID == tea.ip.id)
                cout << setw(3) << i++  << "."<< setw(13) << p ->subID << setw(15) << p ->subName << setw(4) << p ->mark << setw(8) << p ->okNum << setw(12) << p ->maxNum << setw(12) << p ->subTeacher << p ->subCate << endl << endl;
            p = p ->next;
        }
    
        string c;
        cout << "\n  *1-查看详细信息   0-返回*" << endl << endl;
        cout << "   请选择:";
        cin >> c;
        cout << endl;
        if (c == "1")
        {
            cout << " *请选择科目序号: ";
            int c2, t = 1;
            cin >> c2;
            int flag = 0;
            p = head_sub ->next;
            while (p)
            {
                if (tea.ip.id == p ->subTearcherID)
                {
                    if (t == c2)
                    {
                        flag = 1;
                        break;
                    }
                    t++;
                }
                p = p ->next;
            }
            if (flag == 1)
            {
                string subId = p ->subID + ".txt";
                head_SubSt = readSubSt(subId);
    
                Student *head_new = new Student, *p1, *t, *r, *s;
                p1 = head_new ->next = head_SubSt ->next;
                p1 = p1 ->next;
                head_new ->next ->next = NULL;
                while (p1)
                {
                    t = p1 ->next;
                    r = head_new ->next;
                    s = head_new;
                    while (r!=NULL && p1 ->stNo > r ->stNo)
                    {
                        s = r;
                        r = r ->next;
                    }
                    s ->next = p1;
                    p1 ->next = r;
                    p1 = t;
                }
    
    
    
                cout << "序号 " << "     学号  " << "    姓名    " <<  "   学院  " << "    专业班级" << endl;
                cout << "===========================================";
                cout << "===================================" << endl;
                int t2 = 1;
                Student *sp = head_new ->next;
                while (sp)
                {
                    cout << " " << setiosflags(ios_base::left) << setw(6) << t2++ << setw(12) << sp ->stNo << setw(10) << sp ->name << setw(12) << sp ->college << sp ->major << sp ->clas << endl << endl;
                    sp = sp ->next;
                }
            }//if
            else
            {
                cout << "*输入错误! ";
            }
        }//if
        else if (c != "0")
        {
            cout << "*输入错误! ";
        }
        cout << " 按Enter返回!";
    }//Teacher::querySubInfo()
    
    /** Manager **/
    /** 写入课程文件 **/
    void Manager::writeSub(Subject *head_sub)
    {
        Subject *p;
    
        ofstream ou("Subject.txt");
        if (!ou)
        {
            cout << "\n\n\t\t\t\tCan't open the file!";
            exit(0);
        }
        p = head_sub ->next;
        while (p)
        {
            ou << p ->subID << " " << p ->subName << " " << p ->mark << " " << p ->okNum << " " << p ->maxNum << " " << p ->subTeacher << " " << p ->subTearcherID << " " << p ->subCate << endl;
            p = p ->next;
        }
        ou.close();
    }//Manager::writeSub
    
    /** 写入添加课程文件 **/
    void Manager::writeAddSub(Subject *p)
    {
        ofstream ou("Subject.txt", ios::app);
        if (!ou)
        {
            cout << "\n\n\t\t\t\tCan't open the file!";
            exit(0);
        }
        ou << p ->subID << " " << p ->subName << " " << p ->mark << " " << p ->okNum << " " << p ->maxNum << " " << p ->subTeacher << " " << p ->subTearcherID << " " << p ->subCate << endl;
        ou.close();
    }//Manager::writeAddSub
    
    /** 添加课程 **/
    void Manager::addSub()
    {
        ifstream in("Subject.txt");
        if (!in)
        {
            cout << "Can't open the file!\n";
            exit(0);
        }
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        head_sub = readSub();
        Subject *q;
    
        Subject *p = new Subject;
        int y;
        do
        {
            y = 0;
            cout << "请输入课程号:";
            cin >> p ->subID;
            q = head_sub ->next;
            while (q)
            {
                if (q ->subID == p ->subID)
                {
                    y = 1;
                    cout << "该课程号已存在,请重新输入!" << endl;
                    break;
                }
                q = q ->next;
            }
        }while (y == 1);
        cout << "请输入课程名:";
        cin >> p ->subName;
        cout << "请输入课程学分:";
        cin >> p ->mark;
        cout << "请输入最大学生容量:";
        cin >> p ->maxNum;
        cout << "请输入课程类型归属:";
        cin >> p ->subCate;
        cout << "请输入任课教师工号:";
        cin >> p ->subTearcherID;
        cout << "请输入任课教师姓名:";
        cin >> p ->subTeacher;
        p ->okNum = 0;
        cout << "确定要添加此课程?\n";
        cout << " 1-确定  0-取消\n";
        cout << "请选择:";
        int c;
        cin >> c;
        if (c == 1)
        {
            writeAddSub(p);
            cout << "添加课程成功!";
        }
        string s = p ->subID + ".txt";
        ofstream ou(s);
        ou.close();
        cout << " *按Enter键返回!*" << endl;
    }//Manager::addSub()
    
    /** 修改课程信息 **/
    void Manager::modifySub()
    {
        ifstream in("Subject.txt");
        if (!in)
        {
            cout << "Can't open the file!\n";
            exit(0);
        }
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        string s;
        head_sub = readSub();
        Subject *p = head_sub ->next;
    
        int y = 1;
        int choice;
        while (y)
        {
            system("cls");
            cout << "                           ------------------\n";
            cout << "                              *选 课 系 统*\n";
            cout << "                                *修改课程*\n";
            cout << "                           ------------------\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "               || 1-修改课程名        2-修改课程学分    ||\n\n";
            cout << "               || 3-修改课程容量      4-修改任课教师    ||\n\n";
            cout << "               || 5-修改课程归属      6-全部修改        ||\n\n";
            cout << "               || 0-退出修改                            ||\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "                请输入所选择的序号:";
            cin >> choice;
            if(choice >= 0 && choice <= 6)
                y = 0;
            else
            {
                cout << "               输入错误,请重新输入!\n";
                getchar();
                getchar();
                system("cls");
            }//switch(choice)
        }//while(y)
        if (choice != 0)
        {
            cout << "请输入要修改课程的课程号:";
            cin >> s;
        }
        p = head_sub ->next;
        int flag = 1;
    
        while (p)
        {
            if (p ->subID == s)
            {
                flag = 0;
                break;
            }
            p = p ->next;
        }
        if (flag == 0)
        {
            int flag = 1;
            switch(choice)
            {
                case 0: break;
                case 1:
                    cout << "请输入修改后的课程名:";
                    cin >> p ->subName;
                    break;
                case 2:
                    cout << "请输入修改后的课程学分:";
                    cin >> p ->mark;
                    break;
                case 3:
                    cout << "请输入修改后的课程容量:";
                    cin >> p ->maxNum;
                    break;
                case 4:
                    cout << "请输入修改后的任课教师工号:";
                    cin >> p ->subTearcherID;
                    cout << "请输入修改后的任课教师:";
                    cin >> p ->subTeacher;
                    break;
                case 5:
                    cout << "请输入修改后的课程归属:";
                    cin >> p ->subCate;
                    break;
                case 6:
                    cout << "请输入修改后的课程名:";
                    cin >> p ->subName;
                    cout << "请输入修改后的课程学分:";
                    cin >> p ->mark;
                    cout << "请输入修改后的课程容量:";
                    cin >> p ->maxNum;
                    cout << "请输入修改后的任课教师工号:";
                    cin >> p ->subTearcherID;
                    cout << "请输入修改后的任课教师:";
                    cin >> p ->subTeacher;
                    break;
                default :
                    flag = 0;
                    break;
            }//switch
            if (flag == 1)
            {
                cout << "\n确定要修改课程信息?";
                cout << "\n  1-确定  0-取消\n";
                cout << "请选择:";
                int c;
                cin >> c;
                if (c == 1)
                {
                    writeSub(head_sub);
                    cout << "修改课程成功!";
                }
            }
            else
                cout << "输入错误,修改失败!";
        }//if
        else if (choice == 0)
        {
            ;
        }
        else
        {
            cout << "未找到此课程号对应的信息!";
            getchar();
        }
        cout << " *按Enter键返回!*" << endl;
    }//Manager::modifySub
    
    /** 删除课程信息 **/
    void Manager::deleteSub()
    {
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        Subject *p, *q;
        head_sub = readSub();
    
        string s;
        cout << "请输入要删除课程的课程号:";
        cin >> s;
        p = head_sub ->next;
        q = head_sub;
        int flag = 1;
        while (p)
        {
            if (p ->subID == s)
            {
                flag = 0;
                break;
            }
            q = p;
            p = p ->next;
        }
        if (flag == 0)
        {
            cout << "要删除的课程信息为:\n";
            cout << "课程号:" << p ->subID << endl;
            cout << "课程名:" << p ->subName << endl;
            cout << "任课教师:" << p ->subTeacher << endl << endl;
            cout << "\n确定要修改课程信息?";
            cout << "\n  1-确定  0-取消\n";
            cout << "请选择:";
            int c;
            cin >> c;
            if (c == 1)
            {
                q ->next = p ->next;
                free(p);
                writeSub(head_sub);
                char sn[20];
                int len = s.size();
                for (int i = 0; i <= len; i++)
                {
                    sn[i] = s[i];
                }
                strcat(sn, ".txt");
                remove(sn);
                cout << "\n删除成功!\n";
    
            }//if
        }//if
        else
        {
            cout << "未找到该课程!";
            getchar();
        }
        cout << " *按Enter键返回!*" << endl;
    }//Manager::deleteSub
    
    /**设置选课时间**/
    void Manager::setSelSubTime()
    {
        cout << "选课开始时间\n";
        cout << "年:"; cin >> start.year;
        cout << "月:"; cin >> start.month;
        cout << "日:"; cin >> start.day;
        cout << "选课结束时间\n";
        cout << "年:"; cin >> endt.year;
        cout << "月:"; cin >> endt.month;
        cout << "日:"; cin >> endt.day;
        ofstream ou("TimeSelect.txt");
        if (!ou)
        {
            cout << "Can't open \"TimeSelect.txt\"!";
            exit(0);
        }
        ou << start.year << " " << start.month << " " << start.day << endl;
        ou << endt.year << " " << endt.month << " " << endt.day << endl;
        ou.close();
        cout << "设置成功! *按Enter键返回!*" << endl;
    }//Manager::setSelSubTime
    
    /**设置选课时间**/
    void Manager::setQuitSubTime()
    {
        cout << "退课开始时间\n";
        cout << "年:"; cin >> start.year;
        cout << "月:"; cin >> start.month;
        cout << "日:"; cin >> start.day;
        cout << "退课结束时间\n";
        cout << "年:"; cin >> endt.year;
        cout << "月:"; cin >> endt.month;
        cout << "日:"; cin >> endt.day;
        ofstream ou("TimeQuit.txt");
        if (!ou)
        {
            cout << "Can't open \"TimeQuit.txt\"!";
            exit(0);
        }
        ou << start.year << " " << start.month << " " << start.day << endl;
        ou << endt.year << " " << endt.month << " " << endt.day << endl;
        ou.close();
        cout << "设置成功! *按Enter键返回!*" << endl;
    }//Manager::setQuitSubTime
    
    //修改密码
    void Manager::modifyPwM()
    {
        IdPw *head_ip = new IdPw;
        string pw1, pw2, pw3;
        int flag = 1;
    
        head_ip = read("ManagerIP.txt");
        if (head_ip == NULL)
        {
            cout << "\n\n\t\t\t\t文件打开错误,密码修改失败!";
            return ;
        }
        IdPw *p = head_ip ->next;
    
        cout << "\n\t\t\t\t请输入原密码:";
        cin >> pw1;
        cout << "\n\n\t\t\t\t请输入新密码:";
        cin >> pw2;
        cout << "\n\n\t\t\t\t再次输入新密码:";
        cin >> pw3;
    
        p = head_ip ->next;
        while (p)
        {
            if (p ->id == ma.ip.id)
            {
                if (p ->password == pw1)
                {
                    if (pw2 == pw3)
                    {
                        p ->password = pw2;
                        cout << "\n\n\t\t\t\t密码修改成功!";
                        cout << " *按Enter键返回!*" << endl;
                        write(head_ip, "ManagerIP.txt");
                    }
                    else
                    {
                        cout << "\n\n\t\t\t\t两次新密码不一致!";
                    }
                    flag = 0;
                }
            }
            if (flag == 0)
                break;
            p = p ->next;
        }
        if (flag == 1)
            cout << "\n\n\t\t\t\t原密码输入错误!";
    }//Manager::modifyPwM
    
    void Manager::ShowSub()
    {
        Subject *head_sub = new Subject;
        head_sub ->next = NULL;
        head_sub = readSub();
        Subject *p = head_sub ->next;
        cout << setiosflags(ios_base::left) << setw(4) << "序号" << setw(13) << "  课程编号" << setw(16) << "  课程名" << setw(6) << "学分" << setw(7) << "剩余" << setw(10) << "最大容量" << setw(10) <<"任课老师" << "课程属性\n";
        cout << "===========================================";
        cout << "====================================" << endl;
        int i = 1;
        while (p)
        {
                cout << setiosflags(ios_base::left)  << " " << setw(4) << i++ << setw(14) << p ->subID << setw(14) << p ->subName << setw(6) << p ->mark  << setw(8) << p ->maxNum - p ->okNum << setw(10) << p ->maxNum << setw(10) << p ->subTeacher << setw(10) <<p ->subCate << endl << endl;
            p = p ->next;
        }
    }//Manager::ShowSub()
    
    /** load() **/
    int key;
    
    //登录界面
    void loadMenu(int t)
    {
        char pw[20];
        system("cls");
        cout << "\n\n\n\n\n\n\n";
        cout << "             ╔*☆***◎***◇***☆*** 欢迎光临 ***☆***◇***◎***☆*╗\n";
        cout << "         ************************* 教 务 系 统 ************************\n\n";
        cout << endl << endl;
        cout << "\t\t\t\t请输入用户名:";
        switch(t)
        {
            case 1: cin >> st.ip.id; break;
            case 2: cin >> tea.ip.id; break;
            case 3: cin >> ma.ip.id; break;
        }
        cout << "\n\t\t\t\t请输入密码: ";
        int i = 0;
        char c;
        do
        {
            c = getch();
            if (c == '\b')
            {
                cout << "\b";
                cout << '\0';
                i--;
                cout << "\b";
            }
            else if (c != '\r')
            {
                cout << "*";
                pw[i] = c;
                i++;
            }
        }while (c != '\r');
        pw[i] = '\0';
        string pw1 = (string) pw;
        switch(t)
        {
            case 1: st.ip.password = pw1; break;
            case 2: tea.ip.password = pw1; break;
            case 3: ma.ip.password = pw1; break;
        }
    }//loadMenu()
    
    //学生登录
    int load_student()
    {
        int flag = 0;
        loadMenu(1);
        ifstream in("studentIP.txt");
        if (!in)
        {
            cout << "Can't open \"studentIP.txt\"!" << endl;
            exit(0);
        }
        string ids, pws;
        while (in >> ids >> pws)
        {
            if (ids == st.ip.id)
            {
                flag = 1;
                break;
            }
        }
        in.close();
    
        if (flag == 0)
        {
            key = 0;
            cout << "\n\n\t\t\t\t账号不存在!";
            getchar();
            getchar();
            return 0;
        }
    
        if (pws == st.ip.password)
        {
            return 1;
        }
        return 0;
    }//load_student()
    
    //教师登录
    int load_teacher()
    {
        int flag = 0;
        loadMenu(2);
        ifstream in("TeacherIP.txt");
        if (!in)
        {
            cout << "Can't open \"TeacherIP.txt\"!" << endl;
            exit(0);
        }
        string ids, pws;
        while (in >> ids >> pws)
        {
            if (ids == tea.ip.id)
            {
                flag = 1;
                break;
            }
        }
        in.close();
    
        if (flag == 0)
        {
            key = 0;
            cout << "\n\n\t\t\t\t账号不存在!";
            getchar();
            getchar();
            return 0;
        }
    
        if (pws == tea.ip.password)
        {
            return 1;
        }
        return 0;
    }//load_teacher()
    
    //管理员登录
    int load_manager()
    {
        int flag = 0;
        loadMenu(3);
        ifstream in("ManagerIP.txt");
        if (!in)
        {
            cout << "Can't open \"ManagerIP.txt\"!" << endl;
            exit(0);
        }
        string ids, pws;
        while (in >> ids >> pws)
        {
            if (ids == ma.ip.id)
            {
                flag = 1;
                break;
            }
        }
        in.close();
    
        if (flag == 0)
        {
            key = 0;
            cout << "\n\n\t\t\t\t账号不存在!";
            getchar();
            getchar();
            return 0;
        }
    
        if (pws == ma.ip.password)
        {
            return 1;
        }
        return 0;
    }//load_manager()
    
    void Menu_Student()
    {
        int y = 1;
        int choice;
        while (y)
        {
            system("cls");
            cout << "                           ------------------\n";
            cout << "                              *选 课 系 统*\n";
            cout << "                           ------------------\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "               || 1-选课              2-查看可选课程    ||\n\n";
            cout << "               || 3-退课              4-查看已选课程    ||\n\n";
            cout << "               || 5-修改密码          0-退出系统        ||\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "                请输入所选择的序号:";
            cin >> choice;
            system("cls");
            switch (choice)
            {
                case 0: y = 0; break;
                case 1: st.selecSub(); getchar(); break;
                case 2: st.readShowSub(); cout << "按Enter键返回!"; getchar(); break;
                case 3: st.quitSub(); getchar(); break;
                case 4: st.querySub(); cout << "按Enter键返回!"; getchar(); break;
                case 5: st.modifyPw(); getchar(); break;
                default:
                    cout << "               输入错误,请重新输入!\n";
                    getchar();
                    break;
            }//switch(choice)
            getchar();
        }//while(y)
    }//Menu_Student()
    
    void Menu_Teacher()
    {
        int y = 1;
        int choice;
        while (y)
        {
            system("cls");
            cout << "                           ------------------\n";
            cout << "                              *选 课 系 统*\n";
            cout << "                           ------------------\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "               || 1-查看所教课程信息      2-修改密码    ||\n\n";
            cout << "               || 0-退出系统                            ||\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "                请输入所选择的序号:";
            cin >> choice;
            system("cls");
            switch (choice)
            {
                case 0: y = 0; break;
                case 1: tea.querySubInfo(); getchar(); break;
                case 2: tea.modifyPw(); getchar(); break;
                default:
                    cout << "               输入错误,请重新输入!\n";
                    getchar();
                    break;
            }//switch(choice)
            getchar();
        }//while(y)
    }//Menu_Teacher()
    
    void Menu_Manager()
    {
        int y = 1;
        int choice;
        while (y)
        {
            system("cls");
            cout << "                           ------------------\n";
            cout << "                              *选 课 系 统*\n";
            cout << "                           ------------------\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "               || 1-添加课程          2-修改课程信息    ||\n\n";
            cout << "               || 3-删除课程          4-修改密码        ||\n\n";
            cout << "               || 5-设置选课时间      6-设置退课时间    ||\n\n";
            cout << "               || 7-查看可选课程      0-退出系统        ||\n\n";
            cout << "               *******************************************\n\n";
            cout << "               *******************************************\n\n";
            cout << "                请输入所选择的序号:";
            cin >> choice;
            system("cls");
            switch (choice)
            {
                case 0: y = 0; break;
                case 1: ma.addSub(); getchar(); break;
                case 2: ma.modifySub(); getchar(); break;
                case 3: ma.deleteSub(); getchar(); break;
                case 4: ma.modifyPwM(); getchar(); break;
                case 5: ma.setSelSubTime(); getchar(); break;
                case 6: ma.setQuitSubTime(); getchar(); break;
                case 7: ma.ShowSub(); cout << "*按Enter键返回!"; getchar(); break;
                default:
                    cout << "               输入错误,请重新输入!\n";
                    getchar();
                    break;
            }//switch(choice)
            getchar();
        }//while(y)
    }//Menu_Manager()
    
    //登录
    void load()
    {
        int n;
        int y = 1;
        while (y)
        {
            key = 1;
            system("cls");
            cout << "\n\n\n\n\n\n\n";
            cout << "             ╔*☆***◎***◇***☆*** 欢迎光临 ***☆***◇***◎***☆*╗\n";
            cout << "         ************************* 教 务 系 统 ************************\n\n";
            cout << endl << endl;
            cout << "                      ============1-学生登录===========\n";
            cout << "                      ============2-教师登录===========\n";
            cout << "                      ============3-管理员登录=========\n";
            cout << "                      ============0-退出系统===========\n";
            cout << "       请输入您的选择:";
            cin >> n;
            cout << endl;
            switch(n)
            {
                case 0: y = 0; break;
                case 1: if (load_student() == 0 && key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t密码输入错误!";
                            getchar();
                            getchar();
                        }
                        else if (key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t登录成功,按Enter进入!";
                            getchar();
                            getchar();
                            Menu_Student();
                        }
                        break;
                case 2: if(load_teacher() == 0 && key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t密码输入错误!";
                            getchar();
                            getchar();
                        }
                        else if (key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t登录成功,按Enter进入!";
                            getchar();
                            getchar();
                            Menu_Teacher();
                        }
                        break;
                case 3: if(load_manager() == 0 && key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t密码输入错误!";
                            getchar();
                            getchar();
                        }
                        else if (key == 1)
                        {
                            cout << "\n\n\n\t\t\t\t登录成功,按Enter进入!";
                            getchar();
                            getchar();
                            Menu_Manager();
                        }
                        break;
                default : y = 1; cout << "\n\n\t\t\t\t输入错误!";
            }//switch
        }//while(y)
    }//load()
    
    int main()
    {
        load();
        return 0;
    }
    

     

    展开全文
  • 学生选课系统描述:  学生选课系统是一个面向管理员、教师、学生三个对象的小型选课系统,实现了管理员对教师、学生、课程等管理,教师任课信息查询和学生选课,以及修改密码等功能。本文将着重介绍教师的功能模块...

    学生选课系统描述:
      学生选课系统是一个面向管理员、教师、学生三个对象的小型选课系统,实现了管理员对教师、学生、课程等管理,教师任课信息查询和学生选课,以及修改密码等功能。本文将着重介绍教师的功能模块设计。
      
    语言和环境
      A、实现语言:Java
      B、实现技术: JavaSE、JDBC、Swing
      C、环境要求: NetBeans 8.0.2, SQLServer2008、JDK1.7

    系统业务流程(教师、学生):
    教师业务流程

    1、教师修改密码模块
    实现类:TeaUpdatePwdFrame
    成员变量:
    教师修改密码模块
    成员方法:
    a) public TeaUpdatePwdFrame()
    构造函数,初始化界面
    b) private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    点击修改按钮,触发修改密码事件
    c) private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)
    点击取消按钮,触发清空文本事件
    d) private void formInternalFrameClosed(javax.swing.event.InternalFrameEvent evt)
    关闭该内部窗口

    2、教师任课信息模块
    实现类:TeaSearchTeachFrame
    成员变量:
    任课信息
    成员方法:
    a) public TeaSearchTeachFrame()
    构造函数,初始化窗体
    b) private void formInternalFrameClosed(javax.swing.event.InternalFrameEvent evt)
    关闭该窗口
    c) private void initteach()
    初始化教师信息
    d) private void showOnTable(List<Course> list)
    将数据载入表中

    3、(教师所任课程的)选课信息模块
    实现类:TeaSearchSelectFrame
    成员变量:
    课程选课信息
    成员方法:
    a) public TeaSearchSelectFrame()
    初始化窗体及控件,并将数据填充进课程编号组合框里
    b) private void formInternalFrameClosed(javax.swing.event.InternalFrameEvent evt)
    关闭该内部窗体
    c) private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    点击搜索按钮出发事件进行查询该课程的学生信息
    d) private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt)
    点击导出文件按钮出发事件进行
    e) private void initcourse()
    对课程编号组合框的内容进行初始化
    f) private void showOnTable(List<StudentView> list)
    将数据填入表中

    4、成绩管理模块
    实现类:TeaScoreFrame
    成员变量:
    成绩管理
    成员方法:
    a) public TeaScoreFrame()
    构造函数,初始化窗体和控件
    b) private void initCourse()
    初始化课程编号组合框
    c) private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    点击搜索按钮触发事件搜索该课程的学生成绩信息
    d) private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)
    点击导出文件按钮触发事件导出学生成绩信息表
    e) private void jTable1MouseClicked(java.awt.event.MouseEvent evt)
    点击表选中一行数据触发事件
    f) private void formInternalFrameClosed(javax.swing.event.InternalFrameEvent evt)
    关闭该内部窗口
    g) private void jButton3ActionPerformed(java.awt.event.ActionEvent evt)
    点击保存按钮触发事件保存成绩
    h) private void showOnTable(List<SelectCourseView> list)
    将数据导入表中

    展开全文
  • 学生选课系统描述:  学生选课系统是一个面向管理员、教师、学生三个对象的小型选课系统,实现了管理员对教师、学生、课程等管理,教师任课信息查询和学生选课,以及修改密码等功能。本文将着重介绍管理员功能模块...
  • 一、源码描述 这是一款功能比较完整的选课系统源码,比较具有学习的价值, 该源码可以给做课程设计或者毕业设计的朋友们提供一些参考, 感兴趣的朋友可以下载看看啊。 二、系统分析 在本系统中,有三类用户:系统...
  • 学生选课管理信息系统

    万次阅读 多人点赞 2019-01-04 11:55:23
    设计本系统,模拟学生选课的部分管理功能。学生入校注册后需统一记录学生个人基本信息,对于面向学生开设的相关课程需要记录每门课程的基本信息,每个任课教师规定其可主讲三门课程,学生选课系统将相应的选课信息...
  • 毕业设计 学生选课系统

    热门讨论 2011-05-11 00:37:03
    (3)学生选课信息(StuCourse)表,保存学生的选课信息: 1 引言 6 1.1 课题背景 7 1.2 课题目标 7 1.3 课题意义 7 2 开发平台、相关技术的介绍 8 2.1 ASP.NET 8 2.2 SQL Server 10 2.3 C#简介 12 3 需求分析 14...
  • 选课系统主要供学生选课使用,在这里可以进行与选课有关的活动;教师可在教师反馈系统中对排课者提出反馈意见,供排课者在排课时可参考使用。 学生选排课系统使用Rational Rose进行UMI。建模;过程选择使用ASP编写...
  • ②教师管理用例:教师用户可见的功能,包含了查看学生选课和提交成绩两个用例功能。 ③信息管理用例:管理员可见的功能,这个用例进一步分为三个用例:学生信息管理用例、教师信息管理用例和课程信息管理用例。 ④...
  • 学生选课系统,包含需求分析,功能描述,以及一些处理方案,文档。。。。
  • Hi,大家好,今天分享的项目是《学生选课系统》,本系统有三种角色,分别为管理员、老师、学生。每种角色可以登录系统,操作的功能也不一样。总体功能模块如下: 个人信息管理 学生信息管理 课程排名 学生成绩分析 ...
  • XX大学学生选课系统需求规格说明书

    千次阅读 多人点赞 2019-04-09 20:30:19
    该文档是关于用户对于河北经贸大学学生选课系统功能和性能的要求, 重点描述了选课 系统的功能需求 系统的主要目的是为了方便学校对教师信息、学生基本信息、课程信息、学生成绩录入、修改、查询,提高学校的工作...
  • 学生选课系统要求具备以下功能: 1.系统以菜单方式工作 2.浏览所有的课程信息 3.浏览所有的学生选课情况 4.任意学生信息的查询和修改功能 5.学生选课功能(学生选课时要判断课程是否已经选满,同时还要判断学生...
  • 学习好资料 目录 1系统需求分析2 2总体设计3 3详细设计4 4界面...方便地进行自由选课主要的问题描述功能要求n 门课程每门课程有 课程编号课程名称课程性质总学时授课学时实验或上机学时学分 开课学期等信息学生可按要
  • 设计本系统,模拟学生选课的部分管理功能。学生入校注册后需统一记录学生个人基本信息,对于面向学生开设的相关课程需要记录每门课程的基本信息,每个任课教师规定其可主讲三门课程,学生选课系统将相应的选课信息...
  • 此报告完整呈现了我们开发“学生选课系统”的整个软件生命周期,包括需求分析阶段,软件设计与实现阶段和测试阶段。在需求分析阶段,明确所要开发的软件应具有的功能、性能与界面,使系统使用人员及系统开发人员能...
  • MySQL实现学生选课系统的成绩统计

    万次阅读 2015-05-15 21:19:09
    一、实验目的 熟悉使用存储过程来进行数据库应用程序的设计。...3, 将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。三、实验完成情况(主要内容,操作步骤、算法描述或程序代码) 1、由于之前建立的学生选
  • 4.22学生用户退选课的顺序图 5 4.23教师提交成绩顺序图 6 4.3协作图 7 4.31 学生用户选课协作图 7 4.32 教师提交成绩协作图 8 4.4运行环境规定 8 4.41设备 8 5 系统设计 9 5.1 设计问题域子系统 9 5.11总体设计图 9 ...
  • 功能描述:由于学校要进行毕业设计,教师和学生进行双向选择,即 学生可选择相应的毕业设计题目, 教师也可选择学生。 系统分为学生、教授及管理员三个用户界面: 1)教师: 1.1 教师可以
  • 项目描述系统在五大模块的基础上又分为几个模块。各模块的详细功能如下:(1)用户管理模块:管理员,学生,教师注册登陆功能。(2)教务管理模块包括四个子模块:学生信息管理、教师信息管理、课程信息管理、班级信息...
  • 管理员管理教师,管理公告,添加成绩,教师添加学生,课程,成绩,学生查看成绩学分等功能。 开发语言: Java,Html 技术框架: ssh,mvc 开发工具: MyEclipse8.5或以上 数据库 mysql 项目截图 ...
  • ​项目描述: 本系统从操作功能上可以分为两个类:一个是通用操作,主要实现用户的登录注销和修改密码等;另一种是为不同用户定制不同操作。 1.通用操作 (1)登录与注销 每个用户都可以用自己的帐号登录系统。...
  • 学生选课信息:包括学生编号、姓名、课程编号、课程名称、累 计学分等)。其他根据设计自行添加。 2、功能要求: (1)分角色登录:学生和管理员按照账号密码登录。 (2)管理员模块: ① 维护学生信息,包含...

空空如也

空空如也

1 2 3 4 5 6
收藏数 113
精华内容 45
关键字:

学生选课系统功能描述