使用单链表存储相关内容。
包含增删查改操作。
分为三个登录身份:教师、学生、管理员。
学生可查看自己的班级和成绩。
教师可查看班级名单和录入成绩。
管理员负责人员信息添加删除等。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//学生信息
typedef struct Student
{
char name[10];
char sex[5];
int age;
int id;
int data;
int _class;
float score;
struct Student* next;
}Stu;
//教师信息
typedef struct Teacher
{
char id[10];
char pas[10];
int t_class;
struct Teacher* next;
}Teacher;
void cread_File()
{
FILE* sf;
sf = fopen("studmassage.txt", "a");
fclose(sf);
FILE* tf;
tf = fopen("teacher.txt", "a");
fclose(tf);
}
//初始化学生链表
Stu* init_List()
{
Stu* S = (Stu*)malloc(sizeof(Stu));
if (S == NULL)
{
printf("内存开辟失败!\n");
}
else
{
S->score = 0.0;
S->data = 0;
S->next = NULL;
}
return S;
}
//录入学生
void add_Stu(Stu* S)
{
Stu* head = S; //头指针
Stu* node = (Stu*)malloc(sizeof(Stu));
node->score = 0;
printf("请输入学生姓名、性别(m表示男,f表示女)、年龄、学号、班级\n");
scanf("%s%s%d%d%d", node->name, node->sex, &node->age, &node->id,&node->_class);
while(node->sex[0] != 'm' && node->sex[0] != 'f')//判断性别是否输入正确
{
printf("请重新输入性别");
scanf("%s", node->sex);
}
node->next = NULL;
/*S = S->next;*/
while (S->next) //采用尾插法插入数据
{
S = S->next;
}
S->next = node;
head->data++;
}
//删除学生
void del_Stu(Stu* S, int id)
{
if (S->next == NULL)
{
printf("还没有学生信息,失败!\n");
}
else
{
Stu* pre = S;
Stu* cur = S->next;
while (cur)
{
if (cur->id == id)
{
pre->next = cur->next;
free(cur); //删除结点,释放内存
cur = NULL;
printf("成功删除学号为:%d的所有信息!\n", id);
return;
}
pre = cur;
cur = cur->next;
}
printf("未找到该生信息,删除失败!\n");
}
}
//修改学生信息
void mod_Stu(Stu* S, int id)
{
S = S->next;
if (S == NULL)
{
printf("当前学生名单为空!\n");
}
else
{
while (S)
{
if (S->id == id)
{
printf("请输入姓名、性别(男:m,女:f)、年龄、班级\n");
scanf("%s%s%d%d", S->name, S->sex, &S->age, &S->_class);
while (S->sex[0] != 'm' && S->sex[0] != 'f')//判断性别是否输入正确
{
printf("请重新输入性别");
scanf("%s", S->sex);
}
printf("修改成功!\n");
return;
}
S = S->next;
}
printf("未找到学号为:%d的信息", id);
}
}
//打印学生名单
void print_Stu(Stu *S)
{
S = S->next;
if (S == NULL)
{
printf("当前学生名单为空!\n");
}
else
{
while (S)
{
printf("姓名:%s,性别:%s,年龄:%d,学号:%d,成绩:%.1f,班级:%d.\n", S->name,
S->sex, S->age, S->id, S->score, S->_class);
S = S->next;
}
}
}
//保存学生文件
void write_Stu(Stu* S)
{
FILE *fp;
fp = fopen("studmassage.txt", "w");
Stu* cur = S->next;
while (cur)
{
fprintf(fp, "姓名:%s 性别:%s 年龄:%d 学号:%d 成绩:%f 班级:%d\n", cur->name,
cur->sex, cur->age, cur->id, cur->score, cur->_class);
cur = cur->next;
}
fclose(fp);
}
//读取学生文件
void read_Stu(Stu* S)
{
FILE* fp;
fp = fopen("studmassage.txt", "r");
char name[10];
char sex[5];
int age;
int id;
float score = 0;
int _class;
if (fp == NULL)
{
return;
}
while (fscanf(fp, "姓名:%s 性别:%s 年龄:%d 学号:%d 成绩:%f 班级:%d\n", name, sex, &age, &id, &score, &_class) != EOF)
{
Stu* node = (Stu*)malloc(sizeof(Stu));
strcpy(node->name, name);
strcpy(node->sex, sex);
node->age = age;
node->id = id;
node->score = score;
node->_class = _class;
node->next = NULL;
while (S->next) //每从文件中读取一份信息保存到结点中就插入链表
{
S = S->next;
}
S->next = node;
}
fclose(fp);
}
//初始化教师链表
Teacher* init_Teacher()
{
Teacher* T = (Teacher*)malloc(sizeof(Teacher));
if (!T)
{
exit(-1);
}
T->next = NULL;
return T;
}
//添加教师信息
void add_Teacher(Teacher* T)
{
Teacher* node = (Teacher*)malloc(sizeof(Teacher));
if (!node)
{
exit(-1);
}
printf("请输入账号:\n");
scanf("%s", node->id);
printf("请输入密码:\n");
scanf("%s", node->pas);
printf("请输入班级:\n");
scanf("%d", &node->t_class);
while (T->next)
{
T = T->next;
}
T->next = node;
node->next = NULL;
}
//修改教师信息
void mod_Tea(Teacher* T)
{
char temp[10] = { '\0' };
printf("请输入要修改的教师账号:\n");
scanf("%s", temp);
while (strcmp(temp, T->id))
{
T = T->next;
}
if(!strcmp(temp, T->id))
{
printf("请输入账号:\n");
scanf("%s", T->id);
printf("请输入密码:\n");
scanf("%s", T->pas);
printf("请输入班级:\n");
scanf("%d", &T->t_class);
printf("修改成功!\n");
}
else
{
printf("未查找到教师信息!\n");
}
}
//删除教师信息
void del_Tea(Teacher* T)
{
Teacher* pre = T;
Teacher* cur = T->next;
char temp[10] = { '\0' };
printf("请输入要删除的教师id:\n");
scanf("%c", temp);
while (strcmp(temp, cur->id))
{
pre = cur;
cur = cur->next;
}
pre->next = cur->next;
free(cur);
}
//打印教师名单
void printf_Tea(Teacher* T)
{
T = T->next;
if (T == NULL)
{
printf("教师名单为空!\n");
}
else
{
while (T)
{
printf("账号:%s 密码:%s 班级:%d班\n", T->id, T->pas, T->t_class);
T = T->next;
}
}
}
//保存教师文件
void write_Tea(Teacher* T)
{
FILE* fp;
fp = fopen("teacher.txt", "w");
Teacher* cur = T->next;
while (cur)
{
fprintf(fp, "账号:%s 密码:%s 班级:%d班\n", cur->id,
cur->pas, cur->t_class);
cur = cur->next;
}
fclose(fp);
}
//读取教师文件
void read_Tea(Teacher* T)
{
FILE* fp;
fp = fopen("teacher.txt", "r");
char id[10];
char pas[10];
int t_class;
while (fscanf(fp, "账号:%s 密码:%s 班级:%d班\n", id, pas, &t_class) != EOF)
{
Teacher* node = (Teacher*)malloc(sizeof(Teacher));
strcpy(node->id, id);
strcpy(node->pas, pas);
node->t_class = t_class;
while (T->next)
{
T = T->next;
}
T->next = node;
node->next = NULL;
}
}
//管理员端
void _Manager(Stu* S, Teacher* T)
{
int ch;
int id;//用于查找对应学生
while (1)
{
printf("1.增加学生\n");
printf("2.删除学生\n");
printf("3.修改学生\n");
printf("4.打印学生名单\n");
printf("5.增加教师\n");
printf("6.删除教师\n");
printf("7.修改教师\n");
printf("8.打印教师名单\n");
printf("0.退出\n");
scanf("%d", &ch);
switch (ch)
{
case 1:
add_Stu(S);
break;
case 2:
printf("请输入要删除学生的id\n");
scanf("%d", &id);
del_Stu(S, id);
break;
case 3:
printf("请输入要修改学生的id:\n");
scanf("%d", &id);
mod_Stu(S, id);
break;
case 4:
print_Stu(S);
break;
case 5:
add_Teacher(T);
break;
case 6:
del_Tea(T);
break;
case 7:
mod_Tea(T);
break;
case 8:
printf_Tea(T);
break;
case 0:
write_Stu(S);
write_Tea(T);
return;
}
system("pause");
system("cls");
}
}
//学生端
void _Stu(Stu* S)
{
int ch;
while (1)
{
printf("1.查询成绩\n");
printf("2.查询班级\n");
printf("0.退出\n");
scanf("%d", &ch);
switch(ch)
{
case 1:
printf("你的成绩为:%.1f", S->score);
break;
case 2:
printf("你的班级为:%d班", S->_class);
break;
case 0:
return;
}
system("pause");
system("cls");
}
}
//学生登录
int stu_Login(Stu* S)
{
int id;
char name[20] = {'\0'};
S = S->next;
printf("请输入学号:\n");
scanf("%d", &id);
printf("请输入姓名:\n");
scanf("%s", name);
while (S)
{
if (S->id == id && !(strcmp(S->name, name)))
{
printf("登陆成功!\n");
_Stu(S);
return 1;
}
S = S->next;
}
if (S == NULL)
return 0;
}
//教师录入成绩
void add_Score(Stu* S)
{
printf("请输入学生学号:\n");
int id;
scanf("%d", &id);
S = S->next;
while (S)
{
if (S->id == id)
{
float score;
printf("请输入成绩\n");
scanf("%f", &score);
S->score = score;
return;
}
S = S->next;
}
if (S == NULL)
{
printf("未找到该学生!\n");
return;
}
}
//教师查询班级名单
void printf_Class(Stu* S)
{
printf("请输入要查询的班级:\n");
int i;
scanf("%d", &i);
S = S->next;
while (S)
{
if (S->_class == i)
{
printf("姓名:%s 学号:%d 班级:%d班\n", S->name, S->id, S->_class);
}
S = S->next;
}
}
//教师端
void _Teacher(Stu* S)
{
int ch;
while (1)
{
printf("1.录入学生成绩\n");
printf("2.查询班级名单\n");
printf("0.退出\n");
scanf("%d", &ch);
switch (ch)
{
case 1:
add_Score(S);
break;
case 2:
printf_Class(S);
break;
case 0:
return;
}
system("pause");
system("cls");
}
}
//教师登录
int tea_Login(Teacher* T, Stu* S)
{
char id[10] = { '/0' };
char pas[10] = { '/0' };
T = T->next;
printf("请输入账号:\n");
scanf("%s", id);
printf("请输入密码:\n");
scanf("%s", pas);
while (T)
{
if (!(strcmp(T->id, id)) && !(strcmp(T->pas, pas)))
{
printf("登陆成功!\n");
_Teacher(S);
return 1;
}
T = T->next;
}
if (S == NULL)
return 0;
}
void Meau()
{
Stu* S = init_List();
Teacher* T = init_Teacher();
read_Stu(S);
read_Tea(T);
int ch;
while (1)
{
printf("1.学生登陆\n");
printf("2.教师登陆\n");
printf("3.管理员登陆\n");
printf("0.退出\n");
scanf("%d", &ch);
switch (ch)
{
case 1:
if (!stu_Login(S))
printf("登陆失败!\n");
break;
case 2:
if(!tea_Login(T,S));
break;
case 3:
_Manager(S, T);
break;
case 0:
write_Stu(S);
write_Tea(T);
return;
}
system("pause");
system("cls");
}
}
int main()
{
cread_File();
Meau();
return 0;
}
运行结果:
文件中内容:
这里设计保存文件在退出前保存,因此需按要求进行退出才能正确保存至.txt文件中。