一、概述
本系统主要实现了三端登录以及各端对应的功能。
思维导图
:
二、总体思路
- 注册:根据不同身份,将注册信息存入不同文件;
- 登录:根据不同端的登录选择,将不同文件信息读入链表,传头结点给相应函数,进行账户名密码匹配,若匹配成功,进入各自功能端;否则,退回主菜单;
- 功能:
1.学生端:只允许查看本人的成绩及个人信息以及个人的成绩分析;
2.教师端:录入、增、删、改、查主要是链表的增删改查,加上文件操作实现数据的存储;
3.管理员端:整体思路同教师端。
三、部分功能的实现
- 学生端只能查看个人信息:
学生登录成功后,该函数返回账户名给学生查询函数作为参数之一,遍历链表进行匹配,匹配成功时,输出学生信息。 - 管理员端与教师端主体功能都是链表的操作来实现,其中管理员可以修改不同端的信息就是通过对不同文件操作而实现的,在这里就不过多赘述了。
- 防止错输和乱输:
(1).学号:
int judge_no(char num[], int len)
{
int i;
if (strlen(num) != len) //判断输入长度
{
return 0;
}
for (i = 0; i<len; i++)//检查是否是数字
{
if (num[i] >= '0' && num[i] <= '9');
else break;
}
if (i == len)
return (1);
else
{
return 0;
}
}
(2).密码
组合键:ASCII码不是单个字符,是组合的。
①方向键:当按下方向键时,缓存区存入两个ASCII码,一负一正。 上:-32 72 下:-32 80 左:-32 75 右:-32 77
②功能键:如:按Fn+F1 缓存区会存入0 59,Fn+F2为 0 60。
若不对组合键进行判断,同时获取两个ASCII时,那么程序就会崩掉。
解决方案:首先对第一个ASCII码进行判断,当其小于等于0时,获取第二个字符不回显。
在这里只放了密码判断的一部分代码:
while ((ch = getch()) != '\r')//判断回车
{
if (ch <= 0)//排除上下左右键及功能键
{
getch();
continue;
}
else if (ch == '\b'&&i>0)//删除显示,i控制删除位数,防止多删
{
putchar('\b');
putchar(' ');
putchar('\b');
i--;
}
else if (!isdigit(ch)&&!isalpha(ch))//是否为数组或字符串
continue;
else if (i >= 15)
continue;
else
{
putchar('*');
pNew->password[i++] = ch;
}
}
pNew->password[i] = '\0';
if (strlen(pNew->password) < 6)//控制密码长度大于6
{
goto_xy(60,10);
printf("密码必须大于6位!");
goto_xy(65, 8);
printf(" ");
goto_xy(65, 8);
}
四、需要注意的点
- 读写是一种全缓存。在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。
因此,在写文件读取存储函数时,在fclose(文件指针)前应当清空缓存区,让强制缓存区的内容写入磁盘。若不这样,在多次连续执行带有文件读取存储函数的功能时,就会使程序停止运行。 - 输入密码时删除显示一个空格,但此时要对删除次数进行控制,否则将会删掉整个界面。具体解决方法,见上文中密码代码部分的注释。
五、源代码
学籍管理系统Github