一. 登录
首先我们需要一个结构体来存放账号密码,另外创建一个文件存放所有账号和密码。
代码如下:
typedef struct Login {
char id[6];
char password[4];
struct Login *next;
} login;
然后我们每次进行登录的时候就需要创立一个新链表将文件中的数据读入链表然后在进行比较。
代码如下:
void Student_login() {
Repeat:
int flag = 0;
char s[6];
int i, j;
FILE *fp = fopen("StudentTest.txt", "r");
if (fp == NULL) {
printf("未找到文件:\n");
exit(1);
}
while (!(feof(fp))) {
struct passport *p = (struct passport *)malloc(sizeof(struct passport));
fscanf(fp, "%s %s", p->id, p->password);
if (head1 == NULL) {
head1 = p;
tail1 = p;
} else {
tail1->next = p;
tail1 = p;
}
}
tail1->next = NULL;
passport *q = (struct passport *)malloc(sizeof(struct passport));
q = head1;
printf("请输入你的账号:\n");
scanf("%s", s);
printf("请输入你的密码:\n");
char t[4];
scanf("%s", t);
char a;
while (q) {
if (strcmp(s, q->id) == 0 && strcmp(t, q->password) == 0) {
flag = 1;
break;
} else {
q = q->next;
}
}
if (flag == 1) {
printf("登录成功!");
} else {
printf("账号密码有误,登录失败!\n");
system("pause");
system("cls");
goto Repeat;
}
}
二. 注册
如果我们没有账号,我们就需要先注册账号。
代码如下:
void logon() {
login *a;
a = (struct Login *)malloc(sizeof(struct Login));
FILE *fp;
char s[20];
int cnt = 0;
printf("欢迎来到学生管理系统注册界面!\n");
Sleep(1000);
fp = fopen("Login.txt", "r");
if (fp == NULL) {
printf("未找到文件:\n");
exit(1);
}
while (!feof(fp)) {
struct Login *p = (struct Login *)malloc(sizeof(struct Login));
fscanf(fp, "%s %s\n", p->id, p->password);
if (head2 == NULL) {
head2 = p;
tail2 = p;
} else {
tail2->next = p;
tail2 = p;
}
}
tail2->next = NULL;
login *b = head2;
printf("请输入您的用户名!\n");
scanf("%s", &a->id);
while (b) {
if (strcmp(a->id, b->id) == 0) {
cnt = 1;
break;
} else {
b = b->next;
}
}
if (cnt == 1) {
printf("此用户名已经存在无法注册!");
return;
}
else {
printf("请输入密码:\n");
scanf("%s", &a->password);
char temp[4];
printf("请重新输入密码:\n");
scanf("%s", &temp);
do {
if (!strcmp(a->password, temp)) {
fp = fopen("Login.txt", "a");
fprintf(fp, "%s %s", a->id, a->password);
printf("注册成功!请登录!\n");
Sleep(1000);
fclose(fp);
return;
} else {
printf("两次密码不一致!请重新输入!\n");
scanf("%s", &a->password);
printf("请再次输入密码\n");
scanf("%s", &temp);
}
} while (1);
}
system("cls");
}
记住一定要将账号密码写入文件中。
三.界面
当我们进入界面时,若出现用户“乱按”现象,为了防止系统崩溃,我们可以将选项定义为字符串。然后判断第一位的ASC||,同时利用goto语句,达到即使用户按错我们的程序依然不会崩溃。
代码如下:
int main() {
Repeat:
menu1();
char choose[100];
char s;
gets(choose);
int i;
i = strlen(choose);
if (i == 1) {
for (int j = 0; j < i; j++) {
s = choose[j];
}
switch (s) {
case 49:
Teacher();
break;
case 50:
Student1();
break;
case 51:
Guanliyuan();
break;
default:
printf("非法输入!请重新输入!\n");
system("pause");
system("cls");
goto Repeat;
break;
}
} else {
printf("非法输入!请重新输入!\n");
system("pause");
system("cls");
goto Repeat;
}
}
四.成绩申诉
我们可以利用一个文件,将每次学生 的申诉写入文件中,然后我们将文件的内容在管理员界面读取出来。
学生成绩申诉代码如下:
void appeal() {
system("cls");
FILE *fp;
fp = fopen("学生成绩申诉.txt", "a");
char s[1000];
printf("请给管理员留言!\n");
scanf("%s", s);
fprintf(fp, "%s", s);
fclose(fp);
printf("申诉成功!");
system("pause");
return;
}
管理员查看学生成绩申诉代码如下:
char s[1000];
FILE *fp;
fp = fopen("学生成绩申诉.txt", "r");
while (!feof(fp))
{
fscanf(fp, "%s", &s);
printf("%s", s);
}
printf("成功查看!");
system("pause");
五.总结
通过写这次学生管理系统时,我遇到了很多问题但是都解决了,然后通过本次学习到了链表的使用,以及文件的使用,同时也使自己的逻辑得到了提升。