算法c语言源码_C语言学生信息管理系统源码下载和思路解析(密码版)

在《C语言学生信息管理系统演示和说明(密码版)》一节中,我们对学生信息管理系统进行了介绍和演示,这节就来分析一下它的源码。学生信息管理系统源码下载地址:http://pan.baidu.com/s/1pKjMVij    提取密码:s2ki各位读者不妨先将源码下载下来浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。

一. 整体设计思路

要想持久化地保存数据,必须要将数据写入磁盘中;本程序也不例外,我们会将学生信息最终都保存到文件中。在《C语言学生信息管理系统源码下载和思路解析(文件版)》一节中我们看到,直接对文件数据进行增删改查操作不仅麻烦,而且低效,所以我们引入了数据结构中的单链表。当对学生信息进行插入、删除、修改操作时,我们需要先更新单链表,再将单链表中的所有数据(包括未修改的数据)更新到文件。如此,对文件进行的就是整体操作,就简单很多,可以先将文件内容清除,再写入新的数据。需要注意的是:只能将节点中的数据写入文件,不能将 next 节点的指针写入。例如:

typedef struct _NODE{

STU data;

struct _NODE *next;

}NODE;

只需要将成员 data 写入文件,而不能写入 next。这是因为,next 是指针,指向内存中的某个位置,程序重新启动时,它的内存布局和上次肯定不同,next 的指向也会发生改变,所以每次启动程序时都必须读取文件中的数据新建单链表,存储 next 是没有意义的。注意:数据在写入文件前要先进行加密,读取后也要先进行解密才能使用。

二. 关键知识点

大家需要先学习一下该程序中涉及到的几个关键知识点,有了这些必备条件,我们才能更容易理解代码。

1) 模块化编程

本程序的代码比较多,总共有670多行,需要分门别类、有规划地放到不同的源文件中,这就是所谓的模块化编程(也即多文件编程)。在模块化编程中,需要在 .c 文件中定义函数,在 .h 中声明函数、变量、自定义类型、结构体、宏等,请大家猛击《C语言多文件编程》一章了解详情。

2) 循环菜单

程序运行时,会不停地显示主菜单和子菜单,而不是执行完一次操作就退出,这是如何实现的呢?请大家猛击《C语言循环菜单的设计,让程序一直运行》了解详情。

3) 单链表

大家在阅读代码之前,需要对数据结构中的单链表有所了解,知道如何对节点信息进行增删改查。

4) 数据的加密解密

数据的加密方式有很多,这里我们使用一种相对简单的方式,就是异或运算,这在《C语言文件加密的原理--异或运算》一节中进行了详细讲解。

5) MD5

用于对数据加密解密的密码也得保存在文件中,否则下次使用时就无法判断用户输入的密码是否正确。但是,直接将密码保存到文件中是非常危险的,这无疑是将密码告诉了他人。为了避免这种情况,我们还需要对密码本身进行加密。用于对密码加密的算法有多种,MD5算法是常用的一种。本程序也使用MD5算法。不管密码有多长,包含什么字符,经过MD5算法处理后都会变成一个由数字和字母组成的字符串,并且这个字符串的长度始终是32。例如,123456 经MD5加密后的结果是:

e10adc3949ba59abbe56e057f20f883e

MD5算法具有唯一性和不可逆性,也就是说:

  • 同一个密码加密后的字符串始终是相同的;

  • 通过加密后的字符串不能逆向推算出原来的密码。

对密码进行MD5运算后,将得到的长度为32的字符串保存到文件中就非常安全了,即使被他人看到,也不知道密码是什么。

三. 程序的整体架构

程序由8个文件构成,其中包括4个头文件(.h)和4个源文件(.c)。1) main.c 是主文件,包含了主函数 main() 以及两个打印菜单的函数 printMainMenu()、printSubMain()。2) common.h 是程序的配置文件,每个文件都应该将它包含进去。配置文件中主要是宏定义,每一个宏都是一个配置选项,用户可以更改。例如:

  • FILENAME 宏定义了数据文件的路径,也就是将学生信息保存到何处,默认是当前目录下的 stu.data。如果你希望将文件放在其他目录下,完全可以改成诸如D:\\Demo\stu.dataC:\\data.stu的形式。

  • MAX_STU_AGE 宏定义了学生的最大年龄,如果用户输入的年龄大于该值,就会给出提示。

3) tools.c 和 tools.h 主要提供了工具类函数。所谓工具类函数,也就是通用函数,它们不针对具体程序编写,可以用在当前程序中,也可以用在其他程序中,在移植的过程中一般不需要修改代码。4) stu.c 和 stu.h 是主要的两个文件,包含了对学生信息进行增删改查的函数。5) md5.c 和 md5.h 是MD5算法的源文件和头文件。大家不必理解MD5算法是如何实现的,阅读源代码时可以将这两个文件跳过,只要知道 MD5() 函数如何使用就可以。下面是MD5()函数的原型:

void MD5(unsigned char *original, unsigned char cipher[33]);

original 是要加密的数据,cipher 是加密后的数据。cipher 的长度之所以为 33,而不是32,是因为在最后要添加字符串结束标志 \0。

四. 密码的保存以及数据的加密

本程序中,我们将MD5加密后的密码保存在文件的开头,占用32个字节。也就是说,从第33个字节才开始,存储的才是学生信息。不妨将原始密码称为 pwd,将一次MD5加密后的密码称为 pwdMD5。我们可以把 pwdMD5 保存在文件开头,并用 pwd 对文件数据(学生信息)进行加密。程序运行后,读取用户输入的密码 pwd,然后进行MD5运算得到 pwdMD5,将 pwdMD5 与文件前32字节进行比较就知道用户输入的密码是否正确。如果密码正确,就用 pwd 对学生信息进行解密,否则提示用户密码错误。

0b03a6577394ad6e2f2ecdf7b13651c9.png

C语言课程设计——学生信息管理系统_带数据文件 系统的功能要求 学校现状分析 1、某学校有本科生和研究生两类学生。 A. 本科生信息:学号、姓名、性别、专业、班级、高数成绩、英语成绩、C语言、总成绩、班级排名、校级排名。其中:学号、姓名、性别、专业、班级、高数成绩、英语成绩、C语言成绩为输入项,总成绩是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。 B. 研究生信息:学号、姓名、性别、专业、班级、课程综合成绩、论文成绩、总成绩、班级排名、校级排名。其中:学号、姓名、性别、专业、班级、课程综合成绩、论文成绩为输入项,总成绩是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。 2、学生总成绩计算方法。 A.本科生:总成绩=高数成绩+英语成绩+C语言成绩; B.研究生:总成绩=课程综合成绩+论文成绩; 请使用结构化的程序设计方法,开发一个学生成绩管理系统对学生成绩进行有效管理。 1.2 主要任务 系统的功能要求 1. 添加功能:分本科生和研究生两类人员,实现下列添加功能。 A.本科生:能够添加学生信息,如果高数成绩、英语成绩、C语言成绩都输入,则系统自动计算总成绩。 B.研究生:能够添加学生信息,如果课程综合成绩、论文成绩都输入,则系统自动计算总成绩。 2. 修改功能:分本科生和研究生两类人员,实现下列修改功能。 A.本科生:根据学号来修改任意学生的除学号外的信息。如果高数成绩、英语成绩、c语言成绩都存在,则系统自动计算总成绩。 B.研究生:根据学号来修改任意学生的除学号外的信息。如果课程综合成绩、论文成绩都存在,则系统自动计算总成绩 3. 删除功能:分本科生和研究生两类人员,能够根据学号删除一个学生。 4. 查询功能:分本科生和研究生两类人员,实现下列查询功能。 1) 分页显示全部学生的信息。分页功能:每页显示10条学生的信息,有上一页、下一页、首页和最后一页的功能。 2) 能够按班级显示本班全部学生信息。 3) 能够根据学号或者姓名查询学生信息。 4) 能够在某个班级中查询某门课成绩不及格学生信息。 5. 排序功能:分本科生和研究生两类人员,实现下列排序功能。 1) 所有学生信息按总成绩从高到低排序并显示。 2) 某个班学生信息按总成绩从高到低排序并显示。 6. 统计功能:分本科生和研究生两类人员,实现下列统计与显示功能。 1) 统计某班级某课程的平均成绩、最高成绩、最低成绩。如果学生该门课没有成绩,统计平均成绩时忽略该生。 2) 统计某班级某课程超过课程平均成绩的学生名单及人数。 3) 统计某班级某课程不及格学生名单及人数。 4) 统计某班级某课程不同等级的学生人数。等级标准:优—大于等于90;良—大于等于80且小于90;中:大于等于70且小于80;及格:大于等于60且小于70;不及格:小于60。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值