精华内容
下载资源
问答
  • 学生成绩管理系统 实现学生信息,课程信息,课程类别,成绩信息的集中化电子化处理;实现学生成绩管理工作制度化、标准化、规范化;建立关于学生(成绩)数据比较全面详细的数据库
  • 信息系统分析设计课程大作业,主要写的成绩管理系统的详细设计分析,业务流程分析、数据流程分析、数据字典等
  • 2.2学生成绩管理系统业务规划 11 2.3学生成绩管理系统的数据规划 14 3学生成绩管理系统的系统分析 15 3.1可行性分析 15 3.1.1 技术可行性 15 3.1.2 经济可行性 15 3.1.3 法律可行性 16 3.2业务需求分析 16 3.2.1...
  • 成绩管理业务流程

    2018-01-24 16:35:44
    关于学生考试成绩管理系统业务流程图,在未使用该系统之前的操作,也就是排除了系统的操作。
  • 学生成绩管理系统,可以运行,有源码!!!适合论文模板 本系统依据开发要求主要应用于教育系统,完成对日常的教育工作中学生成绩档案的数字化管理。开发本系统可使学院教职员工减轻工作压力,比较系统地对教务、...
  • 3.1业务流程图 - 4 - 3.2数据流程图 - 5 - 3.3数据字典 - 7 - 3.3.1数据元素项目: - 7 - 3.3.2数据结构条目: - 8 - 3.3.3数据存储条目 - 8 - 3.3.4数据流条目 - 9 - 3.3.5数据处理条目: - 9 - 3.3.6外部实体 - 10...
  • 第一章 系统概述组织结构功能图:现行系统业务流程图 第二章 系统分析功能需求描述:业务流程分析,第一二层数据流程图,数据字典卡片系统测试计划 第三章 系统设计:组织结构图系统管理模块设计说明书,数据库结构 ...
  • 学生成绩管理系统

    2008-06-25 15:58:27
    学生成绩管理系统 powerdesign 建模,包括需求说明、业务流程模型、概念数据模型、物理数据模型、实习报告 参考了网上很多资料,花了比较长的时间,希望对大家有用。
  • 本系统依据开发要求主要应用于教育系统,完成对日常的教育工作中学生成绩...其主要任务是用计算机对学生各科成绩进行管理,如修改、增加、删除,另外还考虑到学生名次的排序等,针对这些要求设计了学生成绩管理系统
  • 学生成绩管理系统源码 目的:通过调研目前教学管理系统中的成绩管理子系统,了解成绩管理子系统的业务流程;通过分析比较,结合用户对成绩管理子系统的改进意见与实现情况,运用面向对象思想方法,设计和实现一个...
  • 通过调研目前教学管理系统中的学生成绩管理子系统,了解学生管理子系统的业务流程;通过分析比较,结合用户对学生管理系统的改进意见与实现情况,运用面向对象思想方法,设计和实现一个满足功能和性能,并有所创新的...
  • 组长张林 组员鲁雪彭著... 处理 判断用户名是否与密码匹配 需要对于成绩录入判断是否符合业务规则 对于符合规则的成绩计算总分并分出成 绩档次后按照总评进行排序;类图;关键问题及解决方案;导出数据;心得体会;谢谢观赏
  • asp.net 学生成绩管理系统

    热门讨论 2011-05-11 17:22:57
    目的:通过调研目前教学管理系统中的成绩管理子系统,了解成绩管理子系统的业务流程;通过分析比较,结合用户对成绩管理子系统的改进意见与实现情况,运用面向对象思想方法,设计和实现一个满足功能和性能,并有所...
  • jsp学生成绩管理系统

    2009-05-27 16:24:52
    用户在使用《学生成绩管理系统》之前,应注意以下事项: (1)管理员用户名和密码为:mr、mrsoft。 业务流程 要想运行本系统,请按照以下流程操作: (1)在“系统管理”/“用户管理”中添加操作员。 (2)在“参数...
  • 本次毕业设计根据学生在校的基本情况,分析现状各个学校的基本需求情况,进行设计的一款学生成绩管理系统,通过本系统可以方便的管理学校的基本情况,包括院系管理,考试成绩管理等等,基本情况的管理。本次设计包括...

    摘 要

    本次毕业设计根据学生在校的基本情况,分析现状各个学校的基本需求情况,进行设计的一款学生成绩管理系统,通过本系统可以方便的管理学校的基本情况,包括院系管理,考试成绩管理等等,基本情况的管理。本次设计包括 3 个角色,一个是系统的管理员,还有就是系统的教师以及学生,不同的角色具有不同的权限,管理员对整个系统进行维护,教师进行整个教务系统的维护,学生进行个人信息以及成绩等相关问题的维护。
    本次毕业设计采用 SpringBoot 技术,MySql 数据库,设计一款学生成绩管理系统, 目的是为了解决学生的管理以及学生考试和成绩管理的问题。通过本系统教务管理人员可以更方便的进行学生的管理。
    关键词:学生成绩管理系统;SpringBoot;MySql

    Abstract

    This graduation design analyzes the basic needs of each school based on the basic situation of the school, analyzes the basic needs of each school, and designs a basic information management system for students. Through this system, you can easily manage the basic situation of the school, including department management , Exam score management, etc., basic situation management. This design includes 3 roles, one is the system administrator, and the system is the teacher and the student. Different roles have different permissions. The administrator maintains the entire system, the teacher maintains the entire educational system, and the student performs Maintenance of personal information and related issues.
    This graduation design uses JavaWeb technology, MySql database, design a student information management system, the purpose is to solve the problems of student management and student examination and score management. Through this system, the teaching management personnel can conveniently manage the students.

    Key Words:Score entry form entry system; JavaWeb; MySql

    目 录

    第 1 章 绪论 1
    1.1开发背景 1
    1.2系统描述 1
    1.3开发环境和使用工具 1
    1.3.1开发语言 Java 简介 2
    1.3.2数据库 MySql 简介 2
    1.3.3开发工具 IDEA 简介 2
    1.3.4服务器 Tomcat 简介 2
    第 2 章 系统分析 4
    2.1可行性分析 4
    2.1.1经济可行性分析 4
    2.1.2技术可行性分析 4
    2.1.3成本收益可行性分析 4
    2.1.4后期开发及维护可行性分析 4
    2.2需求分析 4
    2.2.1业务需求 4
    2.2.2用户需求 5
    第 3 章 概要设计 7
    3.1系统功能模块设计 7
    3.2数据库设计 7
    3.2.1数据库概念模型设计 7
    3.2.2数据库表结构设计 10
    第 4 章 系统的设计与实现 14
    4.1管理员端实现 14
    4.1.1登录页面 14
    4.1.2学生信息维护 14
    4.1.3教师信息维护 15
    4.1.4基础信息维护 15
    4.2教师端实现 16
    4.2.1考试信息维护 16
    4.2.2成绩登记 16
    4.2.3教师通讯录 17
    4.2.4个人信息维护 17
    4.3学生端实现 18
    4.3.1成绩查看 18
    4.3.2班级通讯录 18
    4.3.3个人信息维护 19
    第 5 章 系统测试 20
    5.1测试介绍 20
    5.2代码测试 20
    5.3测试概述 20
    5.4单元测试 20
    5.4.1注册测试 21
    5.4.2登录测试 22
    5.5集成测试 23
    结论 24
    参考文献 25
    致谢 26

    第 1 章 绪论

    1.1开发背景
    随着科技的发展,基本上所有的具有一定数据的机构都开始使用计算机数据库来做管理,几乎所有的学校也都已经在使用计算机管理数据的机制,大大的减小了学校学生成绩管理的工作量。通过本次设计,应该达到理论知识更加的巩固加深,加强动手能力与实践能力,学以致用,与现实生活中的应用充分的结合起来。
    开发学生成绩管理系统可以使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用,加快查询速度、加强管理,以及国家各部门关于信息化的步伐,使各项管理更加规范化。目前,学校工作繁杂、资料重多,管理信息系统已进入高校,但还未普及,而对于学生成绩管理来说,目前还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的系统是很有必要的。

    1.2系统描述
    本次开发也具有很重要的实际意义,它能有效的帮助学校解决现有教学教务中存在的对学生成绩信息进行录入、修改、删除、查询操作问题。使得教师、学生可以在自己的权限内对信息进行访问,修改及查询。简化现有系统的流程是指更加便捷合理易操作。尽可能实现无纸化管理,以解决手工耗时巨大、效率很低的问题。
    通过本系统可以方便的管理学校的基本情况,包括院系管理,考试成绩管理等等, 基本情况的管理。本次设计包括 3 个角色,一个是系统的管理员,还有就是系统的教师以及学生,不同的角色具有不同的权限,管理员对整个系统进行维护,教师进行整个教务系统的维护,学生进行个人信息以及成绩等相关问题的维护。

    1.3开发环境和使用工具
    页面使用超文本语言 JSP 结合 CSS 层叠样式表与脚本语言 JavaScript 设计完成。后台主要使用 Java 语言并结合 SQL 语句。使用框架为 SSM,即 Spring,SpringMVC, MyBatis。
    JavaScript 是一个脚本语言,是在浏览器中解释执行的一个语言,依赖浏览器而运行,现在的 JavaScript 最新的版本已经是 ESCM6 版本,js 是一个很灵活的语言,前端页面的一些校验,提醒等等都可以通过 js 来完成,同时 js 是一个基于对象的脚本语言,

    它的安全性同时也是非常的好,不能访问本地的文件,同时也不允许将数据直接写入到数据库,还有就是 js 是一个可跨平台的语言,现在无论是 pc 端还是移动端的开发都已经离不开 js 语言。
    1.3.1开发语言 Java 简介
    Java 编程语言是一种全新的开发语言,它是由 Sun Microsystems 发布的,具有面向对象的特点,而且运行需要.framework(类库)提供支持,Java 编程语言和 Java 语言有很多的类似特点,如在使用,编译语句及在接口继承上等。Java 语言同时结合了 C 和C++语言的优点,回避了他们的不足,具有高效稳定的特点,如:Java 没有有关宏的使用概念,而且 Java 还结合了 VB 等语言的面向对象和 C++高效运行等特点,由此 Java 已成为网站开发的首选。

    1.3.2数据库 MySql 简介
    MySql 是一个小型的数据库,安装包只有几十兆,相比 oracle 等大型数据库体积要小的多。MySql 数据库是 Microsoft 发布的一个新的数据存储平台,它管理的数据量超出了时间和位置的限制。 数据库还可以存储在半结构化或结构化数据中。 MySql 提供了多种用于查找,查询和分析数据的集成服务,但由于数据存储在服务器上,因此无法控制特定于数据存储库的地址。MySql 支持使用 Eclipse 开发的程序处理数据,MySql 提供了一组高效可靠的数据存储平台,满足几乎所有格式的数据存储要求。

    1.3.3开发工具 IDEA 简介
    IDEA 全称 IntellJ IDEA,和 eclipse 相似,是 java 编程中公认最好的 IDE,提供了大量的智能工具,例如语法提示、代码分析、格式化等。
    IDEA 最核心的特色是它的快捷键,利用快捷键可以极大提高开发效率。
    IDEA 的特点:沉浸式的开发体验(根本停不下来),超强快捷键体系,智能的代码助手,全栈开发环境,丰富的模板支持。

    1.3.4服务器 Tomcat 简介
    Tomcat 是 Apache Software Foundation 项目的中心项目,由 Apache,Sun 以及其他公司和个人开发。在 Sun 的帮助和支持下,Tomcat 始终反映最新的 Servlet 和 JSP 规范。 Tomcat 技术具有先进,稳定的性能,而且免费,因此受到 Java 爱好者的喜爱,得到一部分软件开发者的认可,成为现在比较流行的 Web 应用服务器。许多程序员都喜欢Tomcat。Tomcat 在运行时使用的系统资源更少,可扩展性更高,并且支持开发应用程序系统中常用的功能。

    1.4研究意义
    在学校建设校园网的环境下,学生成绩管理系统是作为学校校园网的重要组成部分。一个功能齐全的学生成绩管理系统不但能够让高层管理者能够更加方便快捷的对所需要的工作进行管理,降低了工作难度,提高了工作效率,同时还为学生和教师提供了极大的方便。学生成绩系统主要是为了提供给学校管理者和学校老师来对学校的工作管理和安排、学生进行查询等方面的操作,能够对学生的成绩进行更加系统高效的管理。根据学生成绩管理系统把学校中各个班级的学生的成绩进行汇总和分析,能够为学校工作人员和教师对学生成绩的分析、管理和查询提供一个平台基础,使学校对学生的成绩信息能够更加全面的了解分析,从而达到提高学生成绩管理统计高效率和提高学校教育教学成绩的目的。

    第 2 章 系统分析

    2.1可行性分析

    2.1.1经济可行性分析
    本次的开发,无需要购买一些额外的器材。只需要一台笔记本电脑即可,所有需要用到的软件都可以到网络上下载,另外需要的参考资料可以到学校的图书馆以及网络上查找,所以本次开发在经济上是可行的。

    2.1.2技术可行性分析
    本网站是基于 JavaWeb,采用现在流行的 SSM 框架实现的,使用的语言、技术等在现在比较流行。数据库使用的是 MySql 数据库,在企业或个人应用中比较常见,由于其体积小、优化了 SQL 查询算法、有效地提高了查询速度,因此方便使用。页面主体框架搭建使用 bootstrap,实现响应式页面,设计的界面简洁大方。总体难度不大,技术有可行性。

    2.1.3成本收益可行性分析
    本系统开发成本不高,花费一个多月在空闲时间完成。开发环境,使用的工具都是免费的。前期投入较少,项目投入运行后开始或许收支不平衡,但随着网站的运营,后期收益是可观的。

    2.1.4后期开发及维护可行性分析
    本次毕业设计的代码的耦合性非常的低,可以方便后期的维护。后期还可以添加个人中心模块。采用的技术是目前的主流技术,如开发语言 Java,框架 SSM,大多数开发人员对此比较熟悉,并且系统设计较合理,便于后期添加功能与维护。

    2.2需求分析

    2.2.1业务需求
    当信息在软件中移动时,将被一系列“变换”所修改。数据流图是一种图形化技术, 它描绘信息流和数据从输入移动到输出的过程中所经受的变换。在数据流图中没有任何的具体物理元素,它只是描绘信息在软件中流动和被处理的情况。数据流图只需要考虑系统必须完成的基本逻辑功能,完全不考虑怎样具体的实现这些功能。
    根据系统功能描述,对系统画数据流图如下:在这里插入图片描述
    图 2-1 系统数据流图

    2.2.2用户需求
    1、学生基本情况录入模块:
    主要功能用来对学生的成绩进行收集和录入。在学生信息保存在系统中的前提下, 成绩录入需要输入学生资料,比如班级,学号,姓名。在准确录入学生资料后,就可以对该学生的各科成绩进行录入。该学生各科成绩录入成功后,系统会提示是否继续进行操作,如果想继续录入学生成绩就输入 y,不想再输入学生成绩的话就输入 n,再输入 n 之后,系统返回到主菜单。
    2、按学生学号查找并显示学生资料模块:
    主要功能是用来查找学生资料。在系统保存了某学生资料的前提下,想要查找该学生资料,可以输入该学生姓名,这样系统就会显示该学生资料和各科成绩等信息 。
    3、按学生学号计算基点成绩,计算规则参考长春工业大学学分基点计算规则。
    4、按照某门课程学生成绩进行排列模块:
    主要功能是用来对学生的某门课程成绩进行排序。在系统保存学生资料,成绩的前提下,使用此功能可以对学生的资料按成绩进行排序,这样方便对学生成绩进行排序, 对某一分数段的学生有多少、有谁一目了然。
    5、按姓名查找,删除该学生资料模块:
    主要功能是用来删除学生资料,在系统保存学生资料的前提下,想删除某学生的资料,可以输入学生姓名,系统查找该学生资料后,就可以删除了。由于学生辍学,毕业等原因,及时对系统进行更新,删除一些没用的信息,可以使系统更加优化
    6、储存学生资料并退出系统模块:

    主要功能是用来储存学生资料。在对系统进行一系列操作,比如添加、删除、修改学生资料后,对系统的最新操作进行保存,及时更新系统,方便下一次第 3 章 概要设计

    3.1系统功能模块设计
    本次毕业设计一共有 3 个角色,分别是管理员,教师,以及学生,3 个角色,下面分表从 3 个角色进行分析本次毕业设计的结构,见下图 3-1.在这里插入图片描述
    论文下载地址:请点击

    展开全文
  • 目的:通过调研目前教学管理系统中的成绩管理子系统,了解成绩管理子系统的业务流程;通过分析比较,结合用户对成绩管理子系统的改进意见与实现情况,运用面向对象思想方法,设计和实现一个满足功能和性能,并有所...
  • 需求分析 2.1功能需求 业务流程图 3.1文字描述 3.2业务流程 数据流程图 4.1数据流程文字描述 4.2顶层图 4.3一级细化 ... 6.1学生成绩管理系统的实体 6.2实体之间的联系 6.3各实体属性的ER-图
  • 11 2.2学生成绩管理系统业务规划 11 2.3学生成绩管理系统的数据规划 14 3学生成绩管理系统的系统分析 15 3.1可行性分析 15 3.1.1 技术可行性 15 3.1.2 经济可行性 15 3.1.3 法律可行性 16 3.2业务需求分析 16 ...
  • 学生成绩管理系统 doc

    2011-01-19 15:24:53
    第一章 系统规划 3 1.1 可行性分析(简述) 3 1.1.1 运行可行性 3 ...4.1.3学生信息管理 16 第五章 系统测试 22 5.1. 概述 22 5.2 测试方法 22 5.2.1 界面测试 22 5.2.2 功能测试 23 第六章 结束语 24 参考文献 25
  • 目前,学校工作繁杂、资料重多,虽然各类管理信息系统已进入高校,但还未普及,而对于学生成绩管理来说,目前还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的系统是很有必要的。 本系统在开发...
  • 学生管理系统流程分析

    万次阅读 多人点赞 2012-08-25 09:51:11
    学生管理系统基本完成,上一篇我的博客写了关于我在写学生管理系统的一些常见错误的总结 ...这篇博客主要写写关于学生管理系统的一些流程分析图等信息      整个学生管理系统包含六大模块


    学生管理系统基本完成,上一篇我的博客写了关于我在写学生管理系统的一些常见错误的总结


    这是原文链接http://blog.csdn.net/yudandan10/article/details/7905428    


    这篇博客主要写写关于学生管理系统的一些流程分析图等信息

     

     

     整个学生管理系统包含六大模块   


     

    1.系统用户 :这里面包含添加用户,修改密码,退出系统三个小部分


    2.学籍管理 :添加学籍信息,修改学籍信息,查询学籍信息

     

    3.班级管理  :添加班级信息,修改班级信息


    4.课程设置:添加课程信息,修改课程信息,设置课程信息

     

    5,成绩管理:添加成绩信息,修改成绩 信息,查询成绩信息

     

    6.帮助: 关于  ,使用说明

     

    据图的流程图如下:


    对于每个模块都有自己相应的功能,但大体上都差不多    

    整个系统的流程图 判断大概如下:


    除了这些模块的设置以外, 我们还需要创建数据库 和表  

    首先分析需求


    1学生基本信息:学号 ,姓名,性别, 出生日期,班号,电话,入校日期,家庭住址,备注等。

     

    2班级信息:班号,所在年级,班主任姓名,所在教室

     

    3课程基本信息:课程号,课程名称,课程类别,课程描述

     

    4课程设置信息:年级信息,所学课程等。

     

    5学生成绩信息:考试编号,所在班级,学生学号,学生姓名,所学课程,考试分数



    根据分析创建相应的数据库和表,在这个系统中一共需要六个表   


    1创建系统用户表格 user-Info


    2创建学生基本信息表格 student_Info


    3创建课程基本信息表course_Info


    5创建年级课程设置信息表gradecourse_Info


    6创建学生成绩信息表 result_Info


    通过这六个表的连接,我们就可以实现数据的存储和调用了,各个窗体代码的实现和一些细节以及可能出现的问题,大概都在上一篇博客中了. 这就是一个完整的学生管理系统分析图  .   

    展开全文
  • C语言实现—学生成绩管理系统

    千次阅读 多人点赞 2019-07-13 11:58:01
    开发环境:Linux(ps:已新增...登录“管理员子系统” 登录“教师子系统” 登录“学生系统” 相关功能:参考码云中的文档 /********************************************************************...

    前言

    开发环境:Linux(ps:已新增Windows版)

    开发语言:C

    相关文件下载

    码云:传送门  GitHub:传送门

    程序主界面:

    登录“管理员子系统” 

     登录“教师子系统”

     登录“学生子系统”

    相关功能:参考码云中的文档

    /*************************************************************************************************************

    校长 老师的登录信息存储在对应的txt文件中

    校长的账号是admin 密码是123,某教师账号1,密码1。某学生账号1,密码123。

    *************************************************************************************************************/

    文件结构:

    main.c ,student.c ,student.h ,teacher.c , teacher.h , admin.c , admin.h, tools.c , tools.h, struct.h, sams.c, sams.h, stu.txt, tea.txt , admin.txt, project_create.sh, Makefile

    相关文件下载在文件开头的超链接里

    结构

    1. 主界面:“1.学生登录”“2.教师登录”“3.校长登录”“0.退出系统”,4个选项进行跳转。(main.c)
    2.1 选择1,跳转“学生登录界面”,输入学号及默认密码(三次错误及锁定此学号,登录成功后即进入“修改密码子界面”)
    
    2.2 选择2,跳转“教师登录界面”,输入工号及默认密码(三次错误及锁定此工号,登录成功后即进入“修改密码子界面”)
    
    2.3 选择3,跳转“校长登录界面”,输入学号及默认密码(登录成功后即进入“修改密码子界面”)
    
    2.4 选择0,关闭程序。
    
    3.1 成功登录及修改密码后,跳转“学生功能界面”(student.c, student.h)
    
        1、第一次登录强制修改密码。
    
        2、查询成绩
    
           排名 不显示姓名和学号。
    
           平均分
    
           最高分
    
           最低分
    
        3、修改密码
    
        4、查看个人信息
    
        5、三次密码错误锁定帐号,由教师解锁
    
        0、返回上一级
    
    
    
    3.2 成功登录及修改密码后,跳转“教师功能界面”(teacher.c ,teacher.h)
    
        1、第一次登录强制修改密码。
    
        2、添加学生(学生的学号自动生成)
    
            单个添加
    
            批量导入
    
        3、删除学生
    
            输入两人次学号确定
    
            删除的学生要记录保存在已退学的文件中
    
        4、查找学生
    
            按姓名查找
    
            按学号查找
    
        5、修改学生信息
    
            修改学生基础信息
    
            修改学生成绩
    
        6、录入学生成绩
    
            单个录入
    
            批量导入
    
        7、重置学生密码
    
        8、显示所有在校学生信息
    
        9、显示所有退出学生信息
    
        10、三次密码错误锁定帐号,由校长解锁
    
    0、返回上一级
    
    
    
    3.3 成功登录及修改密码后,跳转“校长功能界面”(admin.c ,admin.h)
    
        1、第一次登录强制修改密码。
    
        2、能重置自己的密码
    
        3、能重置教师密码
    
        4、添加教师
    
        5、删除教师
    
        6、显示所有在职教师
    
        7、显示所有离职教师
    
        0、返回上一级

     

     

    效果展示:

     

    我给Windows单独写了个。

    补上 stu.txt, tea.txt , admin.txt。编译运行,数据参考结构体。

    main.c

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <conio.h>
    //#include "getch.h"
    #include <string.h>
    #include <stddef.h>
    
    #define pf printf
    #define sf scanf
    #define MAX_STU 100
    #define MAX_TEA 50
    
    typedef struct Student
    {
    	char name[20];
    	char sex;
    	char id[20];
    	char passwd[20];
    	short chinese;
    	short english;
    	short math;
    	short time;
    	short birth;
    	short exist;
    }Student;
    
    typedef struct Teacher
    {
    	char name[20];
    	char sex;
    	char id[20];
    	char passwd[20];
    	short time;
    	short birth;
    	short exist;
    }Teacher;
    
    typedef struct Admin
    {
    	char id[20];
    	char passwd[20];
    	short birth;
    }Admin;
    
    // 声明全局变量
    Student* STU;
    Teacher* TEA;
    Admin* ADM;
    
    // 下标
    int temp = 0;
    int pos = 0;
    int i = 0;
    
    // 系统初始化
    void sams_init(void);
    // 系统开始运行
    void sams_start(void);
    // 系统结束
    void sams_exit(void);
    
    // 管理子系统菜单
    void admin_menu(void);
    // 管理员添加老师
    void admin_add_tea(void);
    // 管理员删除老师
    void admin_del_tea(void);
    // 管理员重置老师
    void admin_reset_tea(void);
    // 管理员显示在职教师列表
    void admin_list_tea(void);
    // 管理员显示离职教师列表
    void admin_list_ubtea(void);
    // 管理员修改密码
    void admin_change_pw(void);
    // 管理员登录
    bool admin_login(void);
    // 运行管理员子系统
    void admin_start(void);
    
    // 学生子系统菜单
    void student_menu(void);
    // 学生查询成绩
    void student_find_score(void);
    // 学生查询成绩
    void student_find_score(void);
    // 学生修改密码
    void student_ch_pw(void);
    // 学生查询个人信息
    void student_find_info(void);
    // 学生登录
    int student_login(void);
    // 运行学生子系统
    void student_start(void);
    
    // 老师子系统菜单
    void teacher_menu(void);
    // 老师添加学生
    void teacher_add_stu(void);
    // 老师删除学生
    void teacher_del_stu(void);
    // 老师查询学生
    void teacher_find_stu(void);
    // 老师修改学生信息
    void teacher_ch_stu_info(void);
    // 老师添加学生成绩
    void teacher_add_stu_score(void);
    // 老师重置学生密码
    void teacher_reset_stu_pw(void);
    // 老师显示在校学生列表
    void teacher_list_stu(void);
    // 老师显示退学学生列表
    void teacher_list_ubstu(void);
    // 老师修改密码
    void teacher_ch_pw(void);
    // 老师登录
    int teacher_login(void);
    // 老师登录
    int teacher_login(void);
    // 运行老师子系统
    void teacher_start(void);
    
    // 获取字符串
    char* get_str(char* str,size_t len);
    // 清理缓冲区
    void clear_stdin(void);
    // 获取性别
    char get_sex(void);
    // 获取键盘指令
    char get_cmd(char start,char end);
    // 获取密码
    char* get_pw(char* passwd,bool is_show,size_t size);
    
    // 主函数
    int main()
    {
    	sams_init();
    	
    	sams_start();
    
    	sams_exit();
    }
    
    // 主菜单
    void sams_menu(void)
    {
    	pf("***欢迎使用指针学生成绩管理系统***\n");
    	pf("1、管理员子系统\n");
    	pf("2、教师子系统\n");
    	pf("3、学生子系统\n");
    	pf("4、退出系统\n");
    	pf("-----------------------------\n");
    }
    
    // 系统初始化
    void sams_init(void)
    {
    	// 申请堆内存、加载数据
    	STU = calloc(MAX_STU,sizeof(Student));
    	TEA = calloc(MAX_TEA,sizeof(Teacher));
    	ADM = calloc(1,sizeof(Admin));
    	pf("系统初始化...\n");
    
    	FILE* afrp = fopen("admin.txt","r");
    	int num = 0;
    	num = fscanf(afrp,"%s %s %hd",ADM[0].id,ADM[0].passwd,&ADM[0].birth);
    	fclose(afrp);
    
    	FILE* sfrp = fopen("stu.txt","r");
    	for(i=0; i<100; i++)
    	{
    		int num = 0;
    		num = fscanf(sfrp,"%s %c %s %s %hd %hd %hd %hd %hd %hd",STU[i].name,&STU[i].sex,STU[i].id,STU[i].passwd,&STU[i].chinese,&STU[i].english,&STU[i].math,&STU[i].time,&STU[i].birth,&STU[i].exist);
    	}
    	fclose(sfrp);
    
    	FILE* tfrp = fopen("tea.txt","r");
    	for(i=0; i<50; i++)
    	{
    		int num = 0;
    		num = fscanf(tfrp,"%s %c %s %s %hd %hd %hd",TEA[i].name,&TEA[i].sex,TEA[i].id,TEA[i].passwd,&TEA[i].time,&TEA[i].birth,&TEA[i].exist);
    	}
    	fclose(tfrp);
    }
    
    // 系统开始运行
    void sams_start(void)
    {
    	// 进入系统的业务流程控制
    	pf("系统开始运行...\n");
    	while(true)
    	{
    		sams_menu();
    		switch(get_cmd('1','4'))
    		{
    			case '1': admin_start(); break;
    			case '2': teacher_start(); break;
    			case '3': student_start(); break;
    			case '4': return;
    		}
    	}
    }
    
    // 系统结束
    void sams_exit(void)
    {
    	FILE* afwp = fopen("admin.txt","w");	
    	int num = 0;
    	num = fprintf(afwp,"%s %s %hd",ADM[0].id,ADM[0].passwd,ADM[0].birth);
    	fclose(afwp);
    
    	FILE* sfwp = fopen("stu.txt","w");
    	for(i=0; i<100; i++)
    	{
    		int num = 0;
    		if(STU[i].sex != 0)
    		{
    			num = fprintf(sfwp,"%s %c %s %s %hd %hd %hd %hd %hd %hd\n",STU[i].name,STU[i].sex,STU[i].id,STU[i].passwd,STU[i].chinese,STU[i].english,STU[i].math,STU[i].time,STU[i].birth,STU[i].exist);
    		}
    	}
    	fclose(sfwp);
    
    	FILE* tfwp = fopen("tea.txt","w");
    	for(i=0; i<50; i++)
    	{
    		int num = 0;
    		if(TEA[i].sex != 0)
    		{
    			num = fprintf(tfwp,"%s %c %s %s %hd %hd %hd\n",TEA[i].name,TEA[i].sex,TEA[i].id,TEA[i].passwd,TEA[i].time,TEA[i].birth,TEA[i].exist);
    		}	
    	}
    	fclose(tfwp);
    	// 释放内存、保存数据
    	free(STU);
    	free(TEA);
    	free(ADM);
    	pf("系统退出...\n");
    }
    
    // 管理子系统菜单
    void admin_menu(void)
    {
    	pf("\n进入管理子系统...\n");
    	pf("1、添加教师\n");
    	pf("2、删除教师\n");
    	pf("3、重置并解锁教师密码\n");
    	pf("4、显示在职教师\n");
    	pf("5、显示已离职教师\n");
    	pf("6、修改自己密码\n");
    	pf("7、返回上一级\n");
    	pf("-----------------\n");
    }
    
    // 管理员添加老师
    void admin_add_tea(void)
    {
    	pf("添加教师\n");
    	char Cteacher_name[20];
    	char Cteacher_sex;
    	char Cteacher_id[20];
    	char Cteacher_pw[20];
    	pf("请输入教师姓名:");
    	get_str(Cteacher_name,20);
    	pf("请输入教师性别:");
    	Cteacher_sex = get_sex();
    	pf("请输入教师工号:");
    	get_str(Cteacher_id,20);
    	pf("请输入教师密码:");
    	get_str(Cteacher_pw,20);
    	int pos = -1; //插入的位置
    	pf("id:%s。\n",TEA[0].id);
    	for(i=0; i<50; i++)
    	{
    		if(TEA[i].sex == '\0' && pos == -1)
    		{
    			pf("pos已定位\n");
    			pos = i;
    		}
    		if(strcmp(TEA[i].id,Cteacher_id)==0)
    		{
    			pf("工号重复,请重新输入!\n");
    			break;
    		}
    		if(i==49)
    		{
    			strcpy(TEA[pos].name,Cteacher_name);
    			TEA[pos].sex = Cteacher_sex;
    			strcpy(TEA[pos].id,Cteacher_id);
    			strcpy(TEA[pos].passwd,Cteacher_pw);
    			pf("添加成功。\n");
    		}
    	}
    	pf("id:%s。\n",TEA[0].id);
    }
    
    // 管理员删除老师
    void admin_del_tea(void)
    {
    	pf("删除教师\n");
    	pf("请输入教师工号:");
    	char Cteacher_id[20]={};	
    	get_str(Cteacher_id,20);
    	for(i=0; i<50; i++)
    	{
    		if(strcmp(Cteacher_id,TEA[i].id)==0)
    		{
    			TEA[i].exist = 1;
    			pf("删除成功!\n");			
    			break;
    		}
    		if(i==49)
    		{
    			pf("无此工号!\n");
    		}
    	}
    	
    }
    
    // 管理员重置老师
    void admin_reset_tea(void)
    {
    	pf("重置密码\n");
    	pf("请输入教师工号:");
    	char Cteacher_id[20]={};
    	get_str(Cteacher_id,20);
    	char Cteacher_pw[20] = "123";
    	for(i=0; i<50; i++)
    	{
    		if(strcmp(TEA[i].id,Cteacher_id)==0)
    		{
    			TEA[i].time = 0;
    			TEA[i].birth = 0;
    			TEA[i].exist = 0;
    			strcpy(TEA[i].passwd,Cteacher_pw); 
    			pf("重置成功!\n");
    			break;
    		}
    		if(i==49)
    		{
    			pf("无此工号.\n");	
    		}	
    	}
    
    }
    
    // 管理员显示在职教师列表
    void admin_list_tea(void)
    {
    	pf("显示在职教师");
    	for(i=0; i<50; i++)
    	{
    		if(TEA[i].sex != '\0')
    		{
    			if(TEA[i].exist != 1)
    			{
    				pf("\n姓名:%s 性别:%c 工号:%s",TEA[i].name,TEA[i].sex,TEA[i].id);
    			}
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    // 管理员显示离职教师列表
    void admin_list_ubtea(void)
    {
    	pf("显示离职教师");
    	for(i=0; i<50; i++)
    	{
    		if(TEA[i].sex != '\0')
    		{
    			if(TEA[i].exist == 1)
    			{
    				pf("\n姓名:%s 性别:%c 工号:%s",TEA[i].name,TEA[i].sex,TEA[i].id);
    			}
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    //char admin_pw[20]="123";
    //strcpy(admin_pw,admin_passwd);
    
    // 管理员修改密码
    void admin_change_pw(void)
    {
    	char old_pw[20]={};
    	char new_pw[20]={};
    	char new_two_pw[20]={};
    	pf("请输入原密码:");
    	get_pw(old_pw,true,20);
    	printf("\n");
    	pf("请输入新密码:");
    	get_pw(new_pw,true,20);
    	printf("\n");
    	pf("请再次输入新密码:");
    	get_pw(new_two_pw,true,20);
    	printf("\n");
    	if(strcmp(old_pw,ADM[0].passwd)==0)
    	{
    		if(strcmp(new_pw,new_two_pw)==0)
    		{
    			pf("修改密码成功\n");
    			if(ADM[0].birth==0)
    			{
    				ADM[0].birth = 1;
    			}
    			strcpy(ADM[0].passwd,new_pw);
    		}
    		else
    		{
    			pf("两次密码不一致\n");
    		}
    	}
    	else
    	{
    		pf("原密码错误。\n");
    	}
    }
    
    // 管理员登录
    bool admin_login(void)
    {
    	//char admin_id[20] = "admin";
    	char Cadmin_id[20]={};
    	char Cadmin_pw[20]={};
    	pf("请输入用户名:");
    	get_str(Cadmin_id,20);
    	if(Cadmin_id[0]=='\0')
    	{
    		pf("用户名不能为空!\n");
    		return false;
    	}
    	//pf("*%s*\n",Cadmin_id);
    	pf("请输入密码:");
    	get_pw(Cadmin_pw,true,20);
    	//printf("\n*%s*",Cadmin_pw);
    	printf("\n");
    	if(strcmp(Cadmin_id,ADM[0].id)==0 && strcmp(Cadmin_pw,ADM[0].passwd)==0)
    	{
    		//printf("正确\n");
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    // 运行管理员子系统
    void admin_start(void)
    {
    	if(!admin_login())
    	{
    		pf("登录失败!\n");
    		return;
    	}
    	while(true)
    	{
    		if(ADM[0].birth==0)
    		{
    			admin_change_pw();
    		}
    		else
    		{
    			admin_menu();
    			switch(get_cmd('1','7'))
    			{
    				case '1': admin_add_tea(); break;
    				case '2': admin_del_tea(); break;
    				case '3': admin_reset_tea(); break;
    				case '4': admin_list_tea(); break;
    				case '5': admin_list_ubtea(); break;
    				case '6': admin_change_pw(); break;
    				case '7': return;
    			}
    		}
    	}
    }
    
    
    // 学生子系统菜单
    void student_menu(void)
    {
    	pf("进入学生子系统...\n");
    	pf("1、查询成绩\n");
    	pf("2、修改密码\n");
    	pf("3、查看个人信息\n");
    	pf("4、返回上一级\n");
    	pf("---------------\n");
    }
    
    // 学生查询成绩
    void student_find_score(void)
    {
    	pf("成绩查询\n");
    	pf("语文:%hd ,英语: %hd ,数学: %hd\n",STU[temp].chinese,STU[temp].english,STU[temp].math);
    }
    
    // 学生修改密码
    void student_ch_pw(void)
    {
    	char old_stu_pw[20]={};
    	char new_stu_pw[20]={};
    	char new_stu_two_pw[20]={};
    	pf("请输入原密码:");
    	get_pw(old_stu_pw,true,20);
    	printf("\n");
    	pf("请输入新密码:");
    	get_pw(new_stu_pw,true,20);
    	printf("\n");
    	pf("请再次输入新密码:");
    	get_pw(new_stu_two_pw,true,20);
    	printf("\n");
    	if(strcmp(old_stu_pw,STU[temp].passwd)==0)
    	{
    		if(strcmp(new_stu_pw,new_stu_two_pw)==0)
    		{
    			pf("修改密码成功\n");
    			if(STU[temp].birth==0)
    			{
    				STU[temp].birth = 1;
    			}
    			strcpy(STU[temp].passwd,new_stu_pw);
    		}
    		else
    		{
    			pf("两次密码不一致\n");
    		}
    	}
    	else
    	{
    		pf("原密码错误。\n");
    	}
    }
    
    // 学生查询个人信息
    void student_find_info(void)
    {
    	pf("个人信息\n");
    	pf("姓名:%s ,性别:%c ,学号: %s\n",STU[temp].name,STU[temp].sex,STU[temp].id);
    }
    
    // 学生登录
    int student_login(void)
    {
    	char Cstudent_id[20]={};
    	char Cstudent_pw[20]={};
    	pf("请输入用户名:");
    	get_str(Cstudent_id,20);
    	if(Cstudent_id[0]=='\0')
    	{
    		pf("用户名不能为空!\n");
    		return -1;
    	}
    	//pf("*%s*\n",Cstudent_id);
    	pf("请输入密码:");
    	get_pw(Cstudent_pw,true,20);
    	//printf("\n*%s*",Cstudent_passwd);
    	printf("\n");
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(Cstudent_id,STU[i].id)==0)
    		{
    			if(STU[i].time==3)
    			{
    				pf("此学号已被锁定,请找教师解锁。\n");
    				return -1;
    			}
    			if(STU[i].exist==1)
    			{
    				pf("此学生已退学。\n");
    				return -1;
    			}
    			if(strcmp(Cstudent_pw,STU[i].passwd)==0)
    			{
    				return i;
    			}
    			else
    			{	
    				STU[i].time++;
    				pf("密码错误.\n");
    				return -1;
    			}
    		}
    	}
    	pf("不存在此学生。\n");
    	return -1;
    }
    
    // 运行学生子系统
    void student_start(void)
    {
    	temp = student_login();
    	if(temp==-1)
    	{
    		pf("登录失败!\n");
    		return;
    	}
    	while(true)
    	{
    		if(STU[temp].birth==0)
    		{
    			student_ch_pw();
    		}
    		else
    		{
    			student_menu();
    			switch(get_cmd('1','4'))
    			{
    				case '1': student_find_score(); break;
    				case '2': student_ch_pw(); break;
    				case '3': student_find_info(); break;		
    				case '4': return;
    			}		
    		}	
    	}
    }
    
    
    // 老师子系统菜单
    void teacher_menu(void)
    {
    	pf("\n进入教师子系统...\n");
    	pf("1、添加学生\n");
    	pf("2、删除学生\n");
    	pf("3、查找学生\n");
    	pf("4、修改学生信息\n");
    	pf("5、录入学生成绩\n");
    	pf("6、重置学生密码\n");
    	pf("7、显示所有在校学生信息\n");
    	pf("8、显示所有退学学生信息\n");
    	pf("9、修改自己密码\n");
    	pf("0、返回上一级\n");
    	pf("-----------------\n");
    }
    
    // 老师添加学生
    void teacher_add_stu(void)
    {
    	pf("添加学生\n");
    	char Cstudent_name[20];
    	char Cstudent_sex;
    	char Cstudent_id[20];
    	char Cstudent_pw[20];
    	pf("请输入学生姓名:");
    	get_str(Cstudent_name,20);
    	pf("请输入学生性别:");
    	Cstudent_sex = get_sex();
    	pf("请输入学生工号:");
    	get_str(Cstudent_id,20);
    	pf("请输入学生密码:");
    	get_str(Cstudent_pw,20);
    	int pos = -1; //插入的位置
    	pf("id:%s。\n",STU[0].id);
    	for(i=0; i<100; i++)
    	{
    		if(STU[i].sex == '\0' && pos == -1)
    		{
    			pf("pos已定位\n");
    			pos = i;
    		}
    		if(strcmp(STU[i].id,Cstudent_id)==1)
    		{
    			pf("学号重复,请重新输入!\n");
    			break;
    		}
    		if(i==99)
    		{
    			strcpy(STU[pos].name,Cstudent_name);
    			STU[pos].sex = Cstudent_sex;
    			strcpy(STU[pos].id,Cstudent_id);
    			strcpy(STU[pos].passwd,Cstudent_pw);
    			pf("添加成功。\n");
    		}
    	}
    	pf("id:%s。\n",STU[0].id);
    }
    
    // 老师删除学生
    void teacher_del_stu(void)
    {
    	pf("删除学生\n");
    	pf("请输入学生学号:");
    	char Cstudent_id[20]={};	
    	get_str(Cstudent_id,20);
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(Cstudent_id,STU[i].id)==0)
    		{
    			STU[i].exist = 1;
    			pf("删除成功!\n");			
    			break;
    		}
    		if(i==99)
    		{
    			pf("无此学号!\n");
    		}
    	}
    	
    }
    
    // 老师查询学生
    void teacher_find_stu(void)
    {
    	pf("请输入学生学号:");
    	char Cstudent_id[20]={};
    	get_str(Cstudent_id,20);
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(Cstudent_id,STU[i].id)==0)
    		{
    			pf("姓名:%s 性别:%c 学号:%s\n",STU[i].name,STU[i].sex,STU[i].id);
    			break;
    		}
    		else if(i==99)
    		{
    			pf("无此学号。\n");
    		}
    	}
    }
    
    // 老师修改学生信息
    void teacher_ch_stu_info(void)
    {
    	pf("请输入学生学号:");
    	char Cstudent_id[20]={};
    	get_str(Cstudent_id,20);
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(Cstudent_id,STU[i].id)==0)
    		{
    			char ch_name[20];
    			char ch_sex;
    			char ch_id[20];
    			pf("原信息:姓名:%s 性别:%c 学号:%s\n",STU[i].name,STU[i].sex,STU[i].id);
    			pf("请输入新姓名:");
    			get_str(ch_name,20);
    			pf("请输入新性别:");
    			if(sf("%c",&ch_sex)==1)
    			{
    				getchar();
    			}
    			pf("请输入新学号:");
    			get_str(ch_id,20);
    			
    			strcpy(STU[i].name,ch_name);
    			STU[i].sex = ch_sex;
    			strcpy(STU[i].id,ch_id);
    
    			pf("信息修改成功。\n");
    			break;
    		}
    		else if(i==99)
    		{
    			pf("无此学号。\n");
    		}
    	}
    }
    
    // 老师添加学生成绩
    void teacher_add_stu_score(void)
    {
    	pf("请输入学生学号:");
    	char Cstudent_id[20]={};
    	get_str(Cstudent_id,20);
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(Cstudent_id,STU[i].id)==0)
    		{
    			short chinese = 0;
    			short english = 0;
    			short math = 0;
    			pf("原信息:语文:%hd 英语:%hd 数学:%hd\n",STU[i].chinese,STU[i].english,STU[i].math);
    			pf("请输入新语文成绩:");
    			if(sf("%hd",&chinese)==1)
    			{
    				getchar();
    			}
    			pf("请输入新英语成绩:");
    			if(sf("%hd",&english)==1)
    			{
    				getchar();
    			}
    			pf("请输入新数学成绩:");
    			if(sf("%hd",&math)==1)
    			{
    				getchar();
    			}
    			
    			STU[i].chinese = chinese;
    			STU[i].english = english;
    			STU[i].math = math;
    
    			pf("信息修改成功。\n");
    			break;
    		}
    		else if(i==99)
    		{
    			pf("无此学号。\n");
    		}
    	}
    }
    
    // 老师重置学生密码
    void teacher_reset_stu_pw(void)
    {
    	pf("重置密码\n");
    	pf("请输入学生学号:");
    	char Cstudent_id[20]={};
    	get_str(Cstudent_id,20);
    	char Cstudent_pw[20] = "123";
    	for(i=0; i<100; i++)
    	{
    		if(strcmp(STU[i].id,Cstudent_id)==0)
    		{
    			STU[i].time = 0;
    			STU[i].birth = 0;
    			STU[i].exist = 0;
    			strcpy(STU[i].passwd,Cstudent_pw); 
    			pf("重置成功!\n");
    			break;
    		}
    		if(i==99)
    		{
    			pf("无此学号.\n");	
    		}	
    	}
    }
    
    // 老师显示在校学生列表
    void teacher_list_stu(void)
    {
    	pf("显示在校学生");
    	for(i=0; i<100; i++)
    	{
    		if(STU[i].sex != '\0')
    		{
    			if(STU[i].exist != 1)
    			{
    				pf("\n姓名:%s 性别:%c 学号:%s",STU[i].name,STU[i].sex,STU[i].id);
    			}
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    // 老师显示退学学生列表
    void teacher_list_ubstu(void)
    {
    	pf("显示退学学生");
    	for(i=0; i<100; i++)
    	{
    		if(STU[i].sex != '\0')
    		{
    			if(STU[i].exist == 1)
    			{
    				pf("\n姓名:%s 性别:%c 工号:%s",STU[i].name,STU[i].sex,STU[i].id);
    			}
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    // 老师修改密码
    void teacher_ch_pw(void)
    {
    	char old_pw[20]={};
    	char new_pw[20]={};
    	char new_two_pw[20]={};
    	pf("请输入原密码:");
    	get_pw(old_pw,true,20);
    	printf("\n");
    	pf("请输入新密码:");
    	get_pw(new_pw,true,20);
    	printf("\n");
    	pf("请再次输入新密码:");
    	get_pw(new_two_pw,true,20);
    	printf("\n");
    	if(strcmp(old_pw,TEA[pos].passwd)==0)
    	{
    		if(strcmp(new_pw,new_two_pw)==0)
    		{
    			pf("修改密码成功\n");
    			if(TEA[pos].birth==0)
    			{
    				TEA[pos].birth = 1;
    			}
    			strcpy(TEA[pos].passwd,new_pw);
    		}
    		else
    		{
    			pf("两次密码不一致\n");
    		}
    	}
    	else
    	{
    		pf("原密码错误。\n");
    	}
    }
    
    // 老师登录
    int teacher_login(void)
    {
    	char Cteacher_id[20]={};
    	char Cteacher_pw[20]={};
    	pf("请输入用户名:");
    	get_str(Cteacher_id,20);
    	if(Cteacher_id[0]=='\0')
    	{
    		pf("用户名不能为空!\n");
    		return -1;
    	}
    	//pf("*%s*\n",Cteacher_id);
    	pf("请输入密码:");
    	get_pw(Cteacher_pw,true,20);
    	//printf("\n*%s*",Cadmin_passwd);
    	printf("\n");
    	for(i=0; i<50; i++)
    	{
    		if(strcmp(Cteacher_id,TEA[i].id)==0)
    		{
    			if(TEA[i].time==3)
    			{
    				pf("此工号已被锁定,请找管理员解锁。\n");
    				return -1;
    			}
    			if(TEA[i].exist==1)
    			{
    				pf("此教师已离职。\n");
    				return -1;
    			}
    			if(strcmp(Cteacher_pw,TEA[i].passwd)==0)
    			{
    				return i;
    			}
    			else
    			{	
    				TEA[i].time++;
    				pf("密码错误.\n");
    				return -1;
    			}
    		}
    	}
    	pf("不存在此教师。\n");
    	return -1;
    }
    
    // 运行老师子系统
    void teacher_start(void)
    {
    	pos = teacher_login();
    	if(pos==-1)
    	{
    		pf("登录失败!\n");
    		return;
    	}
    	while(true)
    	{
    		if(TEA[pos].birth==0)
    		{
    			teacher_ch_pw();
    			
    		}
    		else
    		{
    			teacher_menu();
    			switch(get_cmd('0','9'))
    			{
    				case '1': teacher_add_stu(); break;
    				case '2': teacher_del_stu(); break;
    				case '3': teacher_find_stu(); break;
    				case '4': teacher_ch_stu_info(); break;
    				case '5': teacher_add_stu_score(); break;
    				case '6': teacher_reset_stu_pw(); break;
    				case '7': teacher_list_stu(); break;
    				case '8': teacher_list_ubstu(); break;
    				case '9': teacher_ch_pw(); break;		
    				case '0': return;
    			}		
    		}
    	}
    }
    
    /** tools **/
    // 清理输入缓冲区
    void clear_stdin(void)
    {
    	//stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
    }
    
    // 获取字符串
    char* get_str(char* str,size_t len)
    {
    	if(NULL == str)
    	{
    		puts("empty ptr!");
    		return NULL;
    	}
    
    	char *in=fgets(str,len,stdin);
    
    	size_t cnt = strlen(str);
    	if('\n' == str[cnt-1])
    	{
    		str[cnt-1] = '\0';
    	}
    	else
    	{
    		scanf("%*[^\n]");
    		scanf("%*c");
    	}
    	
    	clear_stdin();
    
    	return str;
    }
    
    // 获取性别
    char get_sex(void)
    {
    	printf("(m男,w女):");
    	while(true)
    	{
    		char sex = getch();
    		if('w' == sex || 'm' == sex)
    		{
    			printf("%s\n",'w'==sex?"女":"男");
    			return sex;
    		}
    	}
    }
    
    // 获取键盘指令
    char get_cmd(char start,char end)
    {
    	clear_stdin();
    
    	printf("请输入指令:");
    	while(true)
    	{
    		char val = getch();
    		if(val >= start && val <= end)
    		{
    			printf("%c\n",val);
    			return val;
    		}
    	}
    }
    
    // 获取密码
    char* get_pw(char* passwd,bool is_show,size_t size)
    {
    	if(NULL == passwd) return NULL;
    
    	int count = 0;
    	do{
    		char val = getch();
    		if(8 == val)
    		{
    			if(count > 0)
    			{
    				if(is_show)printf("\b \b");
    				count--;
    			}
    			continue;
    		}
    		else if(13 == val)
    		{
    			break;
    		}
    		passwd[count++] = val;
    		if(is_show) printf("*");
    	}while(count < size -1);
    
    	passwd[count] = '\0';
    	return passwd;
    }
    

     

    展开全文
  • 一个大学课程设计,关于 学生成绩管理系统的数据库设计 具体内容有:数据库设计的VSD图,业务流程图,上下文图,顶层数据流图,以及CDM模型,还有建表语句,以及系统开发文档。
  • 有关学生成绩管理的数据库课程设计,有需求分析业务流程图,数据字典等
  • MySQL学生成绩管理系统设计实验报告

    千次阅读 多人点赞 2020-12-01 21:46:15
    主要介绍学生成绩管理系统项目开发的背景、目的、对象以及研究内容。 1.1项目背景 每个学校都需要在期末进行考试成绩的统计分析工作,而这些工作都必须在考试结束后一个星期的时间内完成。大量的成绩数据的统计工作...

    一、概述

    主要介绍学生成绩管理系统项目开发的背景、目的、对象以及研究内容。

    1.1项目背景

    每个学校都需要在期末进行考试成绩的统计分析工作,而这些工作都必须在考试结束后一个星期的时间内完成。大量的成绩数据的统计工作如果只靠人工完成,费时费力,还容易出错。随机计算机技术的快速发展,计算机在日常管理应用中迅速普及,利用计算机进行学生成绩管理势在必行。因此需要开发出一个满足学校进行成绩的录入、查询、修改等需求的功能完善,安全可靠,迅速便捷的成绩管理系统。
    

    1.2编写目的

    开发出一个操作简便、界面友好、灵活实用、安全可靠的学生成绩管理系统。该系统的开发以任课教师和学生服务为对象,能够提高学校对学生成绩的统计分析效率,减轻教务管理人员对学生成绩管理和统计的负担,能提高学校对学生成绩的规范化管理。
    该成绩系统能够及时对学生成绩进行收集整理,使学校相关部门及时获取可靠的学生成绩信息,便于管理。方便各任课教师记录,统计所带班级学生成绩,提高工作效率,减轻负担,提高教学质量。实现快速方便地处理大量成绩数据信息,完成成绩的录入、修改、删除、查询等处理要求。方便学生查询自己各科目成绩。

    1.3软件定义

    学生成绩管理系统是记录了学生成绩的系统,可以实现查询、更新、插入、删除等功能。根据不同用户设置不同的权限,来确保学生成绩信息的安全行和完整性。

    1.4开发环境

    windows10操作系统,mysql5.6.17数据库服务器,Eclipse4.12.0,Navicat。

    二、可行性分析

    由于本系统管理的对象单一,且每个数据内容具有较强的关联性,涉及的计算过程不是很复杂。因此,比较适合于采用数据库管理。在技术难度方面,由于有指导老师的指导和相关参考文献,特别是网上资料,特别是参考其它程序的功能,因此完全可以实现。

    2.1经济可行性分析

    随着科学技术的不断发展与创新,计算机作用的日益突显,计算机软件成为人们解决问题的一个有效手段,当然,它的作用也越来越重要。在当今信息时代,国民经济和国防建设、社会发展、人民生活都离不开软件,软件也无处不在。软件产业也是一个新兴产业,尽管起步晚,但是发展迅速,已经成为增长最快的产业,是具有高投入/高产出、无污染、低能耗的绿色产业。学生成绩管理系统是一个基于教务处数据库的一个管理系统,对已经使用的类似的系统进行调查分析、类比,本课题具有的特点:开发工作量小,可以有两个人合作开发或一个人独立开发,开发周期短,有熟练的开发人员一个月就可以完成系统的开发与测试。

    2.2技术可行性分析

    从技术方面来说,Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。可以利用所学的Java知识进行编程,再与数据库连接,通过SQL语句即可轻松查询和更新后台数据库中的数据。

    三、需求分析

    3.1功能要求

    根据用户需求,系统需向用户提供以下功能:
    1、系统登录功能:根据教师、学生两种身份设计不同用户的操作权限和登录方式。
    2、班级管理功能:班级的添加、修改、删除功能。
    3、成绩管理功能:录入、修改、删除、查询、统计学生成绩,能一次性录入某班全部学生成绩。
    4、信息管理功能:添加、修改、删除、查询学生基本信息,能一次性导入某班全部学生信息。
    5、成绩查询功能:每个学生可以查询自己所有课程的成绩。教师可以查询所带班级的成绩,可以对成绩进行排序和统计。
    在这里插入图片描述
    图3-1-1 学生成绩管理系统功能结构图

    3.2性能要求

    1、易操作性:所开发的系统应做到操作简单,尽量使系统操作不受用户对电脑知识水平的限制。
    2、可维护性:系统应易于修改、易于扩充、易于维护,能够适应业务不断发展变化的需要。
    3、可靠性:系统在运行中要不发生或极少发生故障,在偶然事故及操作失误时,系统应具有较强的出理能力,而不应造成信息的丢失或破坏。
    4、安全性:保证系统的物理安全、数据存储和获取的安全与保密,做好使用人员的授权管理。
    5、实用性:系统的设计应最大限度发挥计算机的高速处理、海量存储能力。
    6、开放性:系统能够在开放的硬件体系结构中运行,并且能与其他系统顺利连接,不会因外部系统的不同面要做在量的修改工作。

    四、数据库设计

    4.1 数据库需求分析

    数据库对系统操作和处理的数据具有综合管理的作用,在具有信息管理的系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的执行效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整性和一致性。
    数据库需求分析就是分析用户的需求,根据用户的需求,分析确定该系统会操作处理那些数据,对确定好的数据根据它们之间的关联关系进行结构设计。需求分析结果直接反映客户的要求,需求分析结果是否准确将直接影响到后面各个阶段的设计结果是否合理和正确。因此做好数据库的需求分析是非常重要的环节。
    数据库需求分析的任务就是通过详细调查现实中要处理的对象,明确用户的各种需求,然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库。
    针对该系统的要求,对该系统的数据库需求做了详细的分析。基于学生成绩管理系统的数据库功能主要体现在多用户登录信息、学生基本信息、教师基本信息、学生成绩信息的管理上。

    4.2用户对系统的要求

    4.2.1信息要求

    老师能查询所有成绩相关信息,包括某一学生的学号、成绩等详细信息,学生能查到关于自己具体的信息,包括每门课的成绩,学院,专业,班级等

    4.2.2处理要求

    1、需查询学生相关信息时能进行查询;
    2、学生成绩信息发生变更时,能进行修改、插入、删除等;
    3、学生的信息发生变更时,能进行更新、删除。

    4.2.3安全性与完整性要求

    安全性要求:
    1、系统应设置访问用户的标识以鉴别是否为合法用户,并设置密码,保证用户身份不被盗用;
    2、对不同的数据设置不同的访问级别,限制访问用户可查询和处理数据的类别和内容;
    3、对不同用户设置不同的权限,区分不同用户,如学生、成绩管理员。

    4.3数据需求描述

    数据流图:

    在这里插入图片描述

    图4-3-1 顶层数据流图

    数据字典:
    ①学生Student(学号Sno、姓名Sname、性别Sex、专业号Mno、班号Cnum)
    属性名 字段类型 长度 主键或外键 说明
    SNO INT 5 主键 学号
    SNAME CHAR 20 姓名
    SEX CHAR 2 性别
    MNO INT 5 外键 专业号
    CNUM INT 5 外键 班号

    ②教师Teacher(职工号Tno、姓名Tname、职称Title)
    属性名 字段类型 长度 主键或外键 说明
    TNO INT 5 主键 职工号
    TNAME CHAR 20 姓名
    TITLE CHAR 5 职称

    ③课程Course(课程号Cno、课程名Cname、学分Credit)
    属性名 字段类型 长度 主键或外键 说明
    CNO INT 5 主键 课程号
    CNAME CHAR 30 课程名
    CREDIT CHAR 2 学分

    ④班级Class(班号Cnum、人数Num)
    属性名 字段类型 长度 主键或外键 说明
    CNUM INT 5 主键 班号
    NUM INT 5 人数

    ⑤系Depart(系号Dno、系名Dname)
    属性名 字段类型 长度 主键或外键 说明
    DNO INT 5 主键 系号
    DNAME CHAR 30 系名

    ⑥专业Major(专业号Mno、专业名Mname、系号Dno)
    属性名 字段类型 长度 主键或外键 说明
    MNO INT 5 主键 专业号
    MNAME CHAR 20 专业名
    DNO INT 5 外键 系号
    ⑦选课CV(学号Sno、课程号Cno、成绩Result)
    属性名 字段类型 长度 主键或外键 说明
    SNO INT 5 学号
    CNO INT 5 课程号
    RESULT CHAR 5 成绩

    ⑧学生—教师ST(学号Sno、职工号Tno、课程号Cno)
    属性名 字段类型 长度 主键或外键 说明
    SNO INT 5 学号
    TNO INT 5 职工号
    CNO INT 5 课程号

    4.4逻辑结构设计

    一个系有若干个专业,一个专业有若干个班级,一个学生可以选修多门课程。
    

    关系模式表:
    ①学生Student(学号Sno、姓名Sname、性别Sex、专业号Mno、班号Classno)
    学号->姓名,学号->性别,学号->专业号,班号->专业号;
    ②教师Teacher(职工号Tno、姓名Tname、职称Title)
    职工号->姓名,职工号->职称;
    ③课程Course(课程号Cno、课程名Cname、学分Credit)
    课程号->课程名,课程号->学分;
    ④班级Class(班号Cnum、人数Num)
    班号->人数;
    ⑤系Depart(系号Dno、系名Dname)
    系号->系名;
    ⑥专业Major(专业号Mno、专业名Mname、系号Dno)
    专业号->专业名,专业号->系号;
    ⑦选课CV(学号Sno、课程号Cno、成绩Result)
    学号、课程号->成绩;
    ⑧学生—教师ST(学号Sno、职工号Tno、课程号Cno)
    学号、职工号->课程号

    其中①为第三范式,②③④⑤⑥⑦⑧均为BCNF范式

    4.5 物理设计

    4.5.1索引设计:

    CREATE TABLE Student1 (
    Sname CHAR(20),
    Sno INT(5),
    Sex CHAR(2),
    Mno INT(5),
    Classno INT(5),
    PRIMARY KEY (Sno),
    Index Student1(Sno)
    );
    CREATE TABLE Teacher1 (
    Tno INT(5),
    Tname CHAR(20),
    Title CHAR(5),
    Index Teacher1(Tno)
    );
    CREATE TABLE Course1 (
    Cname CHAR(20),
    Cno INT(5),
    Credit CHAR(2),
    Index Course1(Cno)
    );
    CREATE TABLE Class1 (
    Cnum INT(5),
    Num INT(5),
    Index Class1(Cnum)
    );
    CREATE TABLE Depart1 (
    Dname CHAR(20),
    Dno INT(5),
    Index Depart1(Dno)
    );
    CREATE TABLE Major1 (
    Mname CHAR(20),
    Mno INT(5),
    Dno INT(5),
    Index Major1(Mno)
    );
    CREATE TABLE CV1 (
    Sno INT(5),
    Cno INT(5),
    Result CHAR(5),
    Index CV1(Sno,Cno)
    );
    CREATE TABLE ST1 (
    Sno INT(5),
    Tno INT(5),
    Cno INT(5),
    Index ST1(Sno,Tno)
    );

    4.5.2触发器设计:

    1、删除课程表中的课程号,相应删除选课表和学生-教师表中的课程号:
    DELIMITER %%
    Create trigger deletorder
    after delete on Course
    for each row
    begin
    delete from CV where Cno=old.Cno;
    delete from ST where Cno=old.Cno;
    end %%
    DELIMITER %%

    4.6数据库实施

    4.6.1用户模式设计

    视图设计:
    1、成绩查询
    Create view Rselect
    As
    Select cnum,CV.sno,sname,cno,result
    From Student,CV
    Where Student.sno=CV.sno;
    2、学生所学课程及学分统计
    Create view Total
    As
    Select Sno,CV.Cno,Cname,Credit
    From Course,CV
    Where Course.Cno=CV.Cno;
    3、学生总成绩、平均成绩
    Create view sum
    As
    Select CV.Sno 学号,sname 姓名,sum(result) 总成绩,avg(result) 平均成绩
    From Student,CV
    Where Student.Sno=CV.Sno;

    存储过程设计:
    1、修改成绩
    DELIMITER CREATEPROCEDUREXiugai(INSno1INT(5),INCno1INT(5),INResult1CHAR(5))BEGINupdateCVsetResult=Result1whereSno=Sno1andCno=Cno1;END CREATE PROCEDURE Xiugai (IN Sno1 INT(5), IN Cno1 INT(5),IN Result1 CHAR(5)) BEGIN update CV set Result=Result1 where Sno=Sno1 and Cno=Cno1; END
    DELIMITER ;
    2、查询总学分
    DELIMITER CREATEPROCEDUREXuefen(INSno1INT(5),INSnameCHAR(20))BEGINSelectSno,Sname,Sum(Credit)asFromstudent,CVWhereStudent.sno=CV.snoGroupbySno;END CREATE PROCEDURE Xuefen (IN Sno1 INT(5),IN Sname CHAR(20)) BEGIN Select Sno,Sname,Sum(Credit) as 总学分 From student,CV Where Student.sno=CV.sno Group by Sno; END
    DELIMITER ;

    4.6.2安全性设计

    新建表
    create table user(username varchar(10),passw1 varchar(40),passw2 varchar(40));
    insert into user values (‘user1’,MD5(‘110’),SHA1(‘110’));
    insert into user values (‘user2’,MD5(‘120’),SHA1(‘120’));
    insert into user values (‘user3’,MD5(‘112’),SHA1(‘112’));

    Create user ‘cu1’@‘localhost’ identified by ‘110’;
    Create user ‘cu2’@‘localhost’ identified by ‘120’;
    Create user ‘cu3’@‘localhost’ identified by ‘112’;

    cus1@ localhost授权,即管理员的权限
    Grant all on Stu.Student to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.Teacher to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.Course to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.Depart to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.Major to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.CV to ‘cu1’@‘localhost’ with grant option;
    Grant all on Stu.ST to ‘cu1’@‘localhost’ with grant option;

    cus2@ localhost授权,即学生的权限
    Grant select on Stu.CV to ‘cu2’@‘localhost’ with grant option;

    cus3@ localhost授权,即教师的权限
    Grant select,update on Stu.CV to ‘cu3’@‘localhost’ with grant option;

    4.6.3事务设计

    1、修改某一门课程的学分:
    Delimiter //
    Create Procedure BB(IN Cno1 INT(5),IN Cname1 CHAR(20),IN Credit1 CHAR(2))
    Begin
    declare t_err int default 0;
    declare CONTINUE HANDLER FOR SQLEXCEPTION SET t_err = 1;

    Start Transaction;
    Select Cno修改前的课程号 from Course where Cno=Cno1;
    Select Cname修改前的课程名 from Course where Cname=Cname1;
    Select Credit修改前的学分 from Course where Cno=Cno1;
    do sleep(20);/暂停20秒/
    Update Course set Credit = Credit1 where Cno=Cno1;
    Select Credit 修改后的学分 from Course where Cno=Cno1;
    if t_err =1 then
    Rollback; /* 有sql 错误 回滚 /
    else
    commit; /
    无 sql 错误 提交 */
    end if;
    end //

    Delimiter ;

    2、修改成绩:
    Delimiter //
    Create Procedure BC(IN Sno1 INT(5),IN Cno1 INT(5),IN Result1 CHAR(5))
    Begin
    declare t_err int default 0;
    declare CONTINUE HANDLER FOR SQLEXCEPTION SET t_err = 1;

    Start Transaction;
    Select sum(Result)修改成绩前的总分 from CV where Sno=Sno1;
    Select avg(Result)修改成绩前的平均分 from CV where Sno=Sno1;
    Select Result查询需要修改的课程号的成绩 from CV where Sno=Sno1 and Cno=Cno1;
    do sleep(20);/暂停20秒/
    Update CV set Result = Result1 where Sno=Sno1 and Cno=Cno1;
    Select Result查询修改后的课程号的成绩 from CV where Sno=Sno1 and Cno=Cno1;
    Select sum(Result)修改成绩后的总分 from CV where Sno=Sno1;
    Select avg(Result)修改成绩后的平均分 from CV where Sno=Sno1;

       if t_err =1 then
          Rollback; /* 有sql 错误 回滚 */
       else
          commit; /* 无 sql 错误 提交 */
       end if;
    

    end //

    Delimiter ;

    五、软件设计

    5.1登陆界面

    在这里插入图片描述

    图5-1-1 登陆界面
    在这里插入图片描述

    图5-1-2 登陆成功界面

    5.2学生成绩查询界面

    在这里插入图片描述

    图5-2-1 学生成绩查询界面图

    5.3教师界面

    在这里插入图片描述

    图5-3-1 教师界面图
    在这里插入图片描述

    图5-3-2 新增学生信息界面图
    在这里插入图片描述

    图5-3-3 更新学生信息界面图
    在这里插入图片描述

    图5-3-4 删除学生信息界面图

    六、项目设计总结

    通过学生成绩管理系统项目设计,加深了对数据库设计的理解,对于设计一个数据库项目的流程有了一定的概念。在这次项目设计中,回顾了以前很多的知识点,但是也发现了很多问题,最终解决了,所以也收获了很多。
    此次项目的设计让我们对Mysql数据库的了解更加深入,了解到了更多的知识点,也对Navicat软件有了一定的了解。在整个设计过程中,通过把各个管理信息连接起来的分析,锻炼了我们对事情的分析能力,通过怎么解决过程中遇到的问题,提高了我们查找文献的能力,对网络资源利用的能力与同学交流的能力。 项目最终开发出来的程序实现的功能比较简单,但也基本达到了项目设计的要求,可以看出设计程序的组员是花了不少心思的。
    最重要的是,这次数据库项目的设计,为我们以后程序开发的道路打下了扎实的基础。

    需要源代码的小伙伴点击以下链接下载
    https://download.csdn.net/download/weixin_43372169/19481547?spm=1001.2014.3001.5503

    展开全文
  • 目前,学校工作繁杂、资料重多,虽然各类管理信息系统已进入高校,但还未普及,而对于学生成绩管理来说,目前还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的系统是很有必要的。 本系统在开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,256
精华内容 2,502
关键字:

学生成绩管理系统业务流程分析