C语言,学生管理系统

使用单链表存储相关内容。

包含增删查改操作。

分为三个登录身份:教师、学生、管理员。

学生可查看自己的班级和成绩。

教师可查看班级名单和录入成绩。

管理员负责人员信息添加删除等。

#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文件中。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值