教务管理系统C++文件系统

Data Structure

教务管理系统C++文件系统
注:编译环境为VC++6.0

文件说明
Teacher.cpp可运行文件
HandedHomeWork学生提交的作业
Grade.txt学生成绩及选课情况
HomeWork.txt教师发布的作业
Tealogin.txt教师账号及密码
Plagisrist.txt作业抄袭情况
Unsubmit.txt未提交作业的情况
  • 学号为20200000的作业存放在HandedHomeWork/20000(课程编号)/20200000(学号).txt
  • Grade.txt内按“学号 课程号 平时成绩 期末成绩 总评 ”次序,存放学生成绩及选课情况

教师端
已实现的功能:

  • 根据自己的帐号和密码进行登录。登录出错应提示。
  • 发布作业。作业被记录到文件中,供教师与学生查找。
  • 检查作业。统计交作业的情况,统计未提交作业的学生学号以及总人数。
  • 自动检查抄袭。
    比较作业目录下的作业文件,如果有任何两个文件的相似度超过80%,则自动判定为抄袭,向教师提示。
  • 提交课程成绩。
    成绩由平时分和期末分的平均得出,其中平时分和期末分由教师输入,计算总评时的比例由老师设置(比如平时分占30%,期末分占70%)。在教师输入了课程成绩之后,教务员端能查找到,学生端也能查找到自己的成绩。实现提示:在输入成绩后,该成绩被记录到文件中,以供查找。
  • 退出保存功能。当该软件被关闭,再打开时,数据没有丢失。

使用Open Hash存储教师的教师编号与密码。
图中结点的键值“88880001”至“88882000”均为教师编号。考虑到

  1. 几乎不注销账号,不经常使用删除操作。
  2. 它可以提供快速的插入操作和查找操作。
  3. 教师编号唯一,哈希函数设计为教师编号对教师总人数取余,使散列地址分布均匀。很少有冲突情况。

openhash.jpg

  • 注册时,
    根据教师编号计算出在数组的位置。如果这个位置上没有元素,那么直接将它存储在这个位置上;如果这个位置上已经有元素了,遍历链表,比较教师编号,若有相同(提示用户),若无相同,存在链表尾部。
  • 登录时,
    通过哈希函数计算,找到对应链表,再遍历链表,如果输入的教师编号、密码与结点的相匹配,则登陆成功。

下面是使用hash表 结合BST存储选课信息以及某个课程的学生成绩。
因为考虑到有两万个学生与200门课程,若使用一张哈希表,可能需要一个**200_2w_这么大的数组,所需要的空间太多。有的课程选课人多、有的课选课人少,可能出现空间没得到有效利用的情况。

一共有200门课,所以建立一个长度为200的哈希表和200个二叉查找树,
用200门课的课程编号映射到相应的BST,一棵树存放一门课程的信息,使用选课学生的学号作为二叉查找树的键。

hash_bst.jpg
由于学号随机,按学号放使整棵树高度变小。这也有效解决了有的课程选课人多、有的课选课人少情况下,空间的浪费。
当修改同一门课程的平时分占总分比时,可以大批量修改学生成绩。
所以,

  • 插入数据时,先根据课程编号找到在数组的位置。再对BST进行插入。
  • 查找数据,先根据课程编号找到在数组的位置。再对BST进行查找。
    将数据写入txt文档时,是用前序遍历写进去的,也就是按学号“中小大”顺序写入,在下次读取txt建立BST时,就可以避免BST成链的情况。

由于需要计算作业相似度,这里使用了最长公共子序列计算两文本的相似度。
如果最长公共子序列长为k,文本1长为n1,文本2长为n2,则相似度为

(2*k)/(n1+n2)

下面介绍最长公共子序列的实现:
LCS.jpg
用二维数组Cmn记录串X与Y的最长公共子序列长度,m、n分别为x、y长度。

  1. 当xi=yj时,找出Xi-1和Yj-1的最长公共子序列,然后在其尾部加上xi(或者yj)即可得X和Y的一个最长公共子序列。
  2. 当xi≠yj时,必须解两个子问题,即找出Xi和Yj-1的一个最长公共子序列及Xi-1和Yj的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。
    在算法中,每一次的递归调用使i或j减1,因此算法的计算时间为Θ(m+n)。构建c[m][n]表需要Θ(mn)。
    计算出最长公共子序列长为k后,如果文本1长为n1,文本2长为n2,则相似度为 (n1+n2)分之2k。若相似度大于80%,则判为抄袭。

list.jpg
这里使用了链表存放学号以及相应的作业。链表的键值为学号。由于需要两两比对,使用两个for循环遍历链表(先确定一个指针,另一个遍历,再移动那个指针)
比对过程,使用最长公共子序列计算每两个学生作业的相似度,如果相似度大于0.8,记录这两位同学的学号。
由于两两比对,使用两个for循环遍历链表、加上使用最长公共子序列计算所需时间较长。考虑到现实生活中,如果第一位与第二位相似度过大,则判定两位都存在抄袭情况,不需要再将第二位与其他同学比较。
故可以删掉一个相同的,除去重复比较的过程。
分析:
在选用数据结构时,如果使用哈希表存放学号以及相应的作业。如果使用定长哈希表,由于学生数不确定,开出的数组,容易出现空间的浪费。如果通过new创建哈希表,很难做到刚才说的删除操作。
若使用BST,BST的一个结点比链表的结点多了一个指针的空间。所以使用链表存放学号以及学生作业。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值