C语言学生管理系统

功能:
1.登录
2.注册
3.添加学生
4.统计学生信息
5.打印学生信息
6.查询学生信息
7.修改学生信息
8.删除学生(逻辑删除)
9.退出
注意:里面些许功能只提供了接口没有完善
密码只做了掩码没有做回退
菜单展示图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#ifndef STUDENT_H_
#define STUDENT_H_
#include <stdio.h>


typedef struct tagUser
{
	char number[50];
	char pwd[50];
	int power;  //0普通  1超级
}TUser,*PTUser;


typedef struct tagUserMgr
{
	PTUser *userArr;
	int userLen;
	int userMaxlen;
}TUserMgr,*PTUserMgr;



//学生  动态数组
typedef struct tagStudent
{
	char Id[100];		//学号
	int age;			//年龄
	char name[100];
	char sex[10];
	char place[100];	//籍贯
	char fam[100];		//名族
	int bflag;			//删除索引
	char majorclass[100]; //专业班级
	char grade[100];     //年级
	char college[100];   //学院
}TStudent, * PTStudent;

//专业班级  动态数组
typedef struct tagStudentMgr
{
	PTStudent stuArr;
	int len;
	int Maxlen;
}TStuMgr, * PTStuMgr;


#endif

.c文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#include "student.h"

struct tagStudentMgr* stumgr;
static struct tagUserMgr* usermgr;


/********************************用户管理初始化函数************************************/

//初始化用户  动态数组
static void InitUserMgr()
{
	usermgr = malloc(sizeof(TUserMgr));
	usermgr->userMaxlen = 100;
	usermgr->userLen = 0;
	usermgr->userArr = malloc(sizeof(PTUser) * 100);
}


/********************************学生管理初始化函数************************************/
//void  不能return  void  需要传参
//初始化学生
static PTStudent InitStudent()
{
	PTStudent stu = malloc(sizeof(TStudent));
	stu->age = -1;
	//默认未删除
	stu->bflag = 1;
	memset(stu->Id, 0, sizeof(char) * 100);
	memset(stu->name, 0, sizeof(char) * 100);
	memset(stu->sex, 0, sizeof(char) * 10);
	memset(stu->fam, 0, sizeof(char) * 100);
	memset(stu->place, 0, sizeof(char) * 100);
	memset(stu->majorclass, 0, sizeof(char) * 100);
	memset(stu->grade, 0, sizeof(char) * 100);
	memset(stu->college, 0, sizeof(char) * 100);
	return stu;
}

static void InitStuentMgr()
{
	stumgr = malloc(sizeof(TStuMgr));
	stumgr->len = 0;
	stumgr->Maxlen = 100;
	stumgr->stuArr = malloc(sizeof(TStudent)*100);
}


/******************************操作函数********************************************/

//mgr 清屏函数
static void MgrClear()
{
	printf("\033[18;20H                                                                                              ");
	printf("\033[19;20H                                                                                              ");
	printf("\033[20;20H                                                                                              ");
	printf("\033[21;20H                                                                                              ");
	printf("\033[22;20H                                                                                              ");
	printf("\033[23;20H                                                                                              ");
	printf("\033[24;20H                                                                                              ");
	printf("\033[25;20H                                                                                              ");
	printf("\033[26;20H                                                                                              ");
	printf("\033[27;20H                                                                                              ");
	printf("\033[28;20H                                                                                              ");
	printf("\033[29;20H                                                                                              ");
	printf("\033[30;20H                                                                                              ");
	printf("\033[31;20H                                                                                              ");
	printf("\033[32;20H                                                                                              ");
	printf("\033[33;20H                                                                                              ");
	printf("\033[34;20H                                                                                              ");
	printf("\033[35;20H                                                                                              ");
	printf("\033[36;20H                                                                                              ");
	printf("\033[37;20H                                                                                              ");

}

/********************************学生管理函数************************************/
//删除就是把索引改为0   统一主键为学号

//直接插入学生
static void AddStudentMgr(char* Id, int  age, char* name, char* sex,
	char* place, char* fam, char* majorclass, char* grade, char* college)
{
	InitStudent();

	if (stumgr == NULL)
	{
		return;
	}
	//memset(stumgr->stuArr[stumgr->len].Id, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].name, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].sex, 0, sizeof(char) * 2);
	//memset(stumgr->stuArr[stumgr->len].place, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].fam, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].majorclass, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].grade, 0, sizeof(char) * 100);
	//memset(stumgr->stuArr[stumgr->len].college, 0, sizeof(char) * 100);
	//printf("%x=--=\n", stumgr->stuArr+stumgr->len);

	stumgr->stuArr[stumgr->len].age = age;
	stumgr->stuArr[stumgr->len].bflag = 1;
	strcpy(stumgr->stuArr[stumgr->len].Id, Id);
	strcpy(stumgr->stuArr[stumgr->len].name, name);
	strcpy(stumgr->stuArr[stumgr->len].sex, sex);
	strcpy(stumgr->stuArr[stumgr->len].place, place);
	strcpy(stumgr->stuArr[stumgr->len].fam, fam);
	strcpy(stumgr->stuArr[stumgr->len].majorclass, majorclass);
	strcpy(stumgr->stuArr[stumgr->len].grade, grade);
	strcpy(stumgr->stuArr[stumgr->len].college, college);

	if (stumgr->len == stumgr->Maxlen)
	{
		int nlenMax = stumgr->Maxlen * 2;
		PTStudent p = malloc(sizeof(TStudent) * nlenMax);
		for (int i = 0; i < stumgr->Maxlen; i++)
		{
			p[i] = stumgr->stuArr[i];
		}
		free(stumgr->stuArr);
		stumgr->stuArr = p;
		stumgr->Maxlen = nlenMax;
	}
	stumgr->len++;
}

//插入学生
static void AddStudent()
{
bf:
	;
	while (1)
	{
		int bflag = 0;

		InitStudent();

		if (stumgr == NULL)
		{
			return;
		}
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[26;20H\033[36m=========================================================================\033[0m");
		printf("\033[19;20H请输入增加的学生的信息:");
		//memset(stumgr->stuArr[stumgr->len].Id, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].name, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].sex, 0, sizeof(char) * 2);
		//memset(stumgr->stuArr[stumgr->len].place, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].fam, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].majorclass, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].grade, 0, sizeof(char) * 100);
		//memset(stumgr->stuArr[stumgr->len].college, 0, sizeof(char) * 100);
		char Id[100];		//学号
		int age;			//年龄
		char name[100];
		char sex[10];
		char place[100];	//籍贯
		char fam[100];		//名族
		char majorclass[100]; //专业班级
		char grade[100];     //年级
		char college[100];   //学院

		printf("\033[36m\033[20;20H|学号|\033[0m");
		printf("\033[36m\033[20;44H|年龄|\033[0m");
		printf("\033[36m\033[20;68H|姓名|\033[0m");

		printf("\033[36m\033[21;20H|性别|\033[0m");
		printf("\033[36m\033[21;44H|籍贯|\033[0m");
		printf("\033[36m\033[21;68H|名族|\033[0m");

		printf("\033[36m\033[22;20H|专业班级|\033[0m");
		printf("\033[36m\033[22;44H|年级|\033[0m");
		printf("\033[36m\033[22;68H|学院|\033[0m");

		printf("\033[?25h");

		COORD coord;
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &Id);
		coord.X = 50;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%d", &age);
		coord.X = 74;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &name);


		coord.X = 26;
		coord.Y = 20;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &sex);
		coord.X = 50;
		coord.Y = 20;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &place);
		coord.X = 74;
		coord.Y = 20;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &fam);


		coord.X = 30;
		coord.Y = 21;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &majorclass);
		coord.X = 50;
		coord.Y = 21;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &grade);
		coord.X = 74;
		coord.Y = 21;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &college);




		stumgr->stuArr[stumgr->len].age = age;
		stumgr->stuArr[stumgr->len].bflag = 1;
		strcpy(stumgr->stuArr[stumgr->len].Id, Id);
		strcpy(stumgr->stuArr[stumgr->len].name, name);
		strcpy(stumgr->stuArr[stumgr->len].sex, sex);
		strcpy(stumgr->stuArr[stumgr->len].place, place);
		strcpy(stumgr->stuArr[stumgr->len].fam, fam);
		strcpy(stumgr->stuArr[stumgr->len].majorclass, majorclass);
		strcpy(stumgr->stuArr[stumgr->len].grade, grade);
		strcpy(stumgr->stuArr[stumgr->len].college, college);

		if (stumgr->len == stumgr->Maxlen)
		{
			int nlenMax = stumgr->Maxlen * 2;
			PTStudent p = malloc(sizeof(TStudent) * nlenMax);
			for (int i = 0; i < stumgr->Maxlen; i++)
			{
				p[i] = stumgr->stuArr[i];
			}
			free(stumgr->stuArr);
			stumgr->stuArr = p;
			stumgr->Maxlen = nlenMax;
		}
		stumgr->len++;
		printf("\033[23;20H学号:%s 年龄:%d 姓名:%s 性别:%s 籍贯:%s 名族:%s 专业班级:%s 年级:%s 学院:%s",
			Id,
			age,
			name,
			sex,
			place,
			fam,
			majorclass,
			grade,
			college);
		printf("\033[24;20H\033[36m添加学生成功!!!!\033[0m");
		printf("\033[25;20H\033[31m按z退出,按其他键继续添加\033[0m");
		printf("\033?25l");
		char c = _getch();
		switch (c)
		{
		case 'z':
			bflag = 1;
			break;
		default:
			MgrClear();
			goto bf;
			break;
		}
		if (bflag)
		{
			break;
		}

	}
	//Sleep(2000);
}

//根据学号查找学生
static void FindStuById()
{
	while (1)
	{
		int bflag = 0;
		int b = 0;
		char number[100] = { 0 };
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[26;20H\033[36m=========================================================================\033[0m");
		printf("\033[19;20H请输入学生的学号:");
		printf("\033[20;20H\033[36m|学号|\033[0m");
		printf("\033[?25h");
		COORD coord;
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &number);
		printf("\033[?25l");
		TStudent stu;
		for (int i = 0; i < stumgr->len; i++)
		{

			if (strcmp(stumgr->stuArr[i].Id, number) == 0)
			{
				b = 1;
				stu = stumgr->stuArr[i];
				break;
			}
		}
		if (b == 0)
		{
			printf("\033[21;20H\033[31m未找到改学生请重新输入!\033[0m");
			Sleep(1000);
			MgrClear();
			continue;
		}
		printf("\033[21;20H|学号|%s\033[21;38H|年龄|%d\033[21;58H|姓名|%s",
			stu.Id, stu.age, stu.name);
		printf("\033[22;20H|籍贯|%s\033[22;38H|名族|%s\033[22;58H|性别|%s",
			stu.place,
			stu.fam,
			stu.sex);

		printf("\033[23;20H|专业班级|%s\033[23;38H|年级|%s\033[22;58H|学院|%s",
			stu.majorclass,
			stu.grade,
			stu.college);
		printf("\033[24;20H\033[35m[是否删除(0->删除)/(1->正常)]==>%d\033[0m", stu.bflag);
		printf("\033[25;20H\033[34m输入z返回主菜单,其他任意键继续查找\033[0m");
		char c = _getch();
		switch (c)
		{
		case 'z':bflag = 1;
			break;
		default:
			MgrClear();
			continue;
			break;
		}
		if (bflag)
		{
			break;
		}

	}

}

//查看学生  索引为0的不显示
static void PrintStu()
{
	while (1)
	{
		int bflag = 0;
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		COORD coord;
		coord.X = 20;
		coord.Y = 18;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("所有学生信息为:\n");
		if (stumgr == NULL)return;
		for (int i = 0; i < stumgr->len; i++)
		{
			TStudent stu = stumgr->stuArr[i];
			coord.X = 20;
			++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("\033[36m------------------------------------------------------------------------\033[0m");
			coord.X = 20;
			++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|学号|%s", stu.Id);//年龄:%d 姓名:%s 性别:%s 籍贯:%s 名族:%s 专业班级:%s 年级:%s 学院:%s\n",
			coord.X = 44;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|年龄|%d", stu.age);
			coord.X = 68;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|性别|%s", stu.sex);
			coord.X = 20;
			++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|籍贯|%s", stu.place);
			coord.X = 44;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|名族|%s", stu.fam);
			coord.X = 68;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|专业班级|%s", stu.majorclass);
			coord.X = 20;
			++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|年级|%s", stu.grade);
			coord.X = 44;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("|学院|%s", stu.college);
			coord.X = 68;
			//++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("[是否删除]=>%d", stu.bflag);

		}
		coord.X = 20;
		++coord.Y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[36m=========================================================================\033[0m");
		coord.X = 20;
		++coord.Y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[31m按任意按键退出!!!\033[0m");
		printf("\033[?25l");
		char c = _getch();
		switch (c)
		{
		default:bflag = 1;
			break;
		}
		if (bflag)
		{
			break;
		}
	}
	system("cls");
}

//删除就是把学生的状态改为0
static void DeleteStu()
{

	while (1)
	{
		int bflag = 0;
		int b = 0;
		if (stumgr == NULL) return;
		printf("\033[?25h");
		char Id[100] = { 0 };
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[23;20H\033[36m=========================================================================\033[0m");
		printf("\033[19;20H请输入删除的学生的学号:");
		printf("\033[36m\033[20;20H|学号|\033[0m");
		COORD coord;
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &Id);
		printf("\033[?25l");
		for (int i = 0; i < stumgr->len; i++)
		{
			if (strcmp(stumgr->stuArr[i].Id, Id) == 0)
			{
				stumgr->stuArr[i].bflag = 0;
				b = 1;
				break;
			}
		}
		if (b)
		{
			printf("\033[21;20H\033[31m删除成功!!!!\033[0m");
		}
		else
		{
			printf("\033[21;20H\033[31m输入的学号无效请重新输入!!!\033[0m");
			Sleep(1000);
			MgrClear();
			continue;
		}
		printf("\033[22;20H按z退出,按其他键继续删除");
		char c = _getch();
		switch (c)
		{
		case 'z':
			bflag = 1;
			break;
		default:
			MgrClear();
			break;
		}
		if (bflag)
		{
			break;
		}
	}
}

// 修改学生信息
static void ChangeStu()
{
	while (1)
	{
		if (stumgr == NULL)
		{
			return;
		}
		COORD coord;
		int bflag = 0;
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[31;20H\033[36m=========================================================================\033[0m");
		printf("\033[19;20H请输入要修改的学生的学号:");
		printf("\033[36m\033[20;20H|学号|\033[0m");
		char Id[100] = { 0 };
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[?25h");
		scanf("%s", &Id);
		printf("\033[?25l");
		for (int i = 0; i < stumgr->len; i++)
		{
			TStudent stu = stumgr->stuArr[i];
			if (strcmp(stumgr->stuArr[i].Id, Id) == 0)
			{
				printf("\033[21;20H|学号|%s\033[21;38H|年龄|%d\033[21;58H|姓名|%s",
					stu.Id, stu.age, stu.name);
				printf("\033[22;20H|籍贯|%s\033[22;38H|名族|%s\033[22;58H|性别|%s",
					stu.place,
					stu.fam,
					stu.sex);
				printf("\033[23;20H|专业班级|%s\033[23;38H|年级|%s\033[22;58H|学院|%s",
					stu.majorclass,
					stu.grade,
					stu.college);
				printf("\033[24;20H\033[35m[是否删除(0->删除)/(1->正常)]==>%d\033[0m", stu.bflag);
				printf("\033[25;20H\033[36m=========================================================================\033[0m");
			}

		}
		printf("\033[26;20H请输入要修改的内容");
		printf("\033[27;20H|1->状态|\033[27;38H|2->年龄|\033[27;58H|3->姓名|");
		printf("\033[28;20H|3->籍贯|\033[28;38H|4->名族|\033[28;58H|5->性别|");
		printf("\033[29;20H|6->专业班级|\033[29;38H|7->年级|\033[29;58H|8->学院|");
		printf("\033[30;20H\033[31m输入1->8选择修改的内容,输入0重新搜索,输入z退出修改!!!");
		char c = _getch();
		switch (c)
		{
			// TODO 修改学生的8个信息
		case '1':
			break;
		case 'z':
			bflag = 1;
			break;
		case '0':
			MgrClear();
			continue;
			break;
		default:
			break;
		}
		if (bflag)
		{
			break;
		}

	}
}

/********************************用户管理函数************************************/
//插入用户
static int AddUser(int power, char* number, char* pwd)
{

	PTUser user = malloc(sizeof(TUser));
	//printf("%x==\n", user);
	memset(user->number, 0, 50);
	memset(user->pwd, 0, 50);
	strcpy(user->number, number);
	strcpy(user->pwd, pwd);
	user->power = power;

	if (usermgr == NULL || user == NULL)
	{
		return 0;
	}

	//扩容
	/*if (usermgr->userLen == usermgr->userMaxlen)
	{
		int nlenMax = usermgr->userMaxlen * 2;
		PTUser* p = malloc(sizeof(PTUser) * nlenMax);
		for (int i = 0; i < usermgr->userLen; i++)
		{
			p[i] = usermgr->userArr[i];
		}
		free(usermgr->userArr);
		usermgr->userArr = p;
		usermgr->userMaxlen = nlenMax;
	}*/
	usermgr->userArr[usermgr->userLen++] = user;
	//usermgr->userLen++;
	return 1;
}


//管理员添加用户
static void MgrAddUser()
{
	while (1)
	{
		int bflag = 0;
		printf("\033[?25h");
		printf("\033[18;20H请输入新增加的用户的信息(权限0->普通用户  1->管理员):");
		printf("\033[20;20H\033[31m|权限|\033[0m");
		printf("\033[21;20H\033[36m|账号|\033[0m");
		printf("\033[22;20H\033[36m|密码|\033[0m");
		COORD coord;
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		int power = 0;
		char number[50] = { 0 };
		char pwd[50] = { 0 };
		scanf("%d", &power);
		if (power >= 0 && power <= 1)
		{
			bflag = 1;
		}
		if (bflag == 0)
		{
			printf("\033[?25l");
			printf("\033[24;20H增加用户失败,请输入正确权限!");
			Sleep(1000);
			MgrClear();
			continue;
		}
		printf("\033[?25h");
		coord.X = 26;
		coord.Y = 20;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &number);
		coord.X = 26;
		coord.Y = 21;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &pwd);
		printf("\033[?25l");
		int p = AddUser(power, number, pwd);
		if (p)
		{
			printf("\033[24;20H增加用户成功,请继续操作!");
			Sleep(500);
			break;
		}

	}
}


//根据用户账号查找用户
static void FindUserByNumber()
{
	while (1)
	{
		int bflag = 0;
		int b = 0;
		COORD coord;
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[23;20H\033[36m=========================================================================\033[0m");
		char number[50] = { 0 };
		printf("\033[19;20H请输入需要查找的用户的账号:");
		printf("\033[36m\033[20;20H|账号|\033[0m");
		printf("\033[?25h");
		coord.X = 26;
		coord.Y = 19;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", number);
		printf("\033[?25l");
		for (int i = 0; i < usermgr->userLen; i++)
		{
			if (strcmp(usermgr->userArr[i]->number, number) == 0)
			{
				b = 1;
				printf("\033[21;20H用户:%s  密码:%s  权限:%d",
					usermgr->userArr[i]->number,
					usermgr->userArr[i]->pwd,
					usermgr->userArr[i]->power);

			}
		}
		if (b == 0)
		{
			printf("\033[21;20H没有此用户,请重新输入!");
			Sleep(1000);
			MgrClear();
			continue;
		}
		printf("\033[22;20H\033[34m输入z返回主菜单,输入其他任意键继续查找\033[0m");
		char c = _getch();
		switch (c)
		{
		case 'z':bflag = 1;
			break;
		default:MgrClear();
			continue;
			break;
		}
		if (bflag)
		{
			break;
		}

	}
}



//根据用户账号修改用户权限  0只读   1可读可写
static void UpdateUserPower()
{

	while (1)
	{
		int bflag = 0;

		if (usermgr == NULL)
		{
			return;
		}
		char number[50] = { 0 };
		printf("\033[18;20H\033[36m=========================================================================\033[0m");
		printf("\033[26;20H\033[36m=========================================================================\033[0m");
		printf("\033[19;20H请输入被修改的用户的账号:");
		COORD coord;
		coord.Y = 19;
		coord.X = 26;
		printf("\033[?25h");
		printf("\033[36m\033[20;20H|账号|\033[0m");
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &number);
		printf("\033[?25l");
		PTUser user = NULL;
		for (int i = 0; i < usermgr->userLen; i++)
		{
			if (strcmp(usermgr->userArr[i]->number, number) == 0)
			{
				user = usermgr->userArr[i];
				printf("\033[21;20H用户:%s  密码:%s  权限:%d",
					usermgr->userArr[i]->number,
					usermgr->userArr[i]->pwd,
					usermgr->userArr[i]->power);
				bflag = 1;
				break;
			}
		}
		//没找到
		if (bflag == 0)
		{
			printf("\033[21;20H没有找到改用户,请重新输入!");
			Sleep(1000);
			MgrClear();
			continue;
		}
		//找到了
		printf("\033[22;20H请输入需要修改的权限(0->只读  1->可读可写)");
		printf("\033[36m\033[23;20H|权限|\033[0m");
		int power = -1;
		while (1)
		{
			printf("\033[?25h");
			coord.X = 26;
			coord.Y = 22;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			scanf("%d", &power);
			printf("\033[?25l");
			if (power > 1 || power < 0)
			{

				printf("\033[24;20H请输入正确的权限索引(0->只读)/(1->可读可写)");
				Sleep(1000);
				printf("\033[36m\033[23;20H|权限|                          \033[0m");
				printf("\033[24;20H                                                ");
				continue;
			}
			break;
		}
		printf("\033[?25l");
		//修改用户权限
		user->power = power;
		if (power == 1)
		{
			printf("\033[24;20H\033[31m修改用户|%s|的权限为可写可读成功\033[0m", user->number);
		}
		else
		{
			printf("\033[24;20H\033[31m修改用户|%s|的权限为只读成功\033[0m", user->number);
		}
		printf("\033[25;20H\033[31m按z退出,按其他键继续修改!!!\033[0m");
		char c = _getch();
		switch (c)
		{
		case 'z':bflag = 1;
			break;
		default:
			MgrClear();
			continue;
			break;
		}
		if (bflag)
		{
			break;
		}
	}
}


//查看用户
static void PrintUser()
{
	while (1)
	{
		int bflag = 0;
		COORD coord;
		coord.X = 19;
		coord.Y = 18;

		if (usermgr == NULL)
		{
			return;
		}
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[31m=========================================================================\033[0m\n");
		coord.X = 19;
		coord.Y += 1;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[20;20H所有用户信息如下(权限:0->只读 1->可读可写):\n");
		for (int i = 0; i < usermgr->userLen; i++)
		{
			++coord.Y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
			printf("用户:%s  密码:%s  权限:%d\n",
				usermgr->userArr[i]->number,
				usermgr->userArr[i]->pwd,
				usermgr->userArr[i]->power);
		}
		++coord.Y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		++coord.Y;
		printf("\033[31m按任意键退出!!!!\033[0m");
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		printf("\033[31m=========================================================================\033[0m\n");
		char c = _getch();
		switch (c)
		{
		default:
			bflag = 1;
			break;
		}
		if (bflag)
		{
			break;
		}
	}

}

//删除用户 根据账号
static void DeleteUser(char* number)
{
	if (usermgr == NULL)
	{
		return;
	}
	int k = 0;

	for (int i = 0; i < usermgr->userLen; i++)
	{
		if (strcmp(usermgr->userArr[i]->number, number) == 0)
		{
			k = i;
			break;
		}

	}

	for (int i = k; i < usermgr->userLen; i++)
	{
		usermgr->userArr[i] = usermgr->userArr[i + 1];
	}
	usermgr->userLen--;
}

//二进制写入
static void FileWrite()
{
	FILE* pfile = fopen("Student.bin", "wb");
	if (usermgr == NULL)
	{
		return;
	}
	fwrite(usermgr, 1, sizeof(TUserMgr), pfile);
	printf("存档成功!\n");
	fclose(pfile);
	Sleep(1000);
}

//二进制读出
static void FileRead()
{
	FILE* pfile = fopen("Student.bin", "rb");
	if (usermgr == NULL)
	{
		return;
	}
	fread(usermgr, 1, sizeof(TUserMgr), pfile);
	fclose;
}











//管理员菜单   16   20 列 截至
static void MgrMenu()
{

	//主要逻辑 先有一个用户作为超级管理员然后这个用户增加别的用户
	//打开界面先登录  登陆后匹配身份和权限
	//显示用户身份 管理员/普通用户     管理员可增加增加用户信息     管理员可修改学生信息   普通用户只可以查看
	while (1)
	{
		int bflag = 0;
		printf("\033[?25h");
		printf("\033[8;20H\033[36m===========================学生管理系统(管理员)==========================\033[0m");
		printf("\033[10;22H 1->增加用户");
		printf("\033[10;42H 2->查看所有用户");
		printf("\033[10;62H 3->查找用户(根据账号)");
		printf("\033[11;22H 4->修改权限");
		printf("\033[11;42H 5->增加学生信息");
		printf("\033[11;62H 6->查找学生(根据学号)");
		printf("\033[12;22H 7->查找所有学生");
		printf("\033[12;42H 8->删除学生(学号)");
		printf("\033[12;62H 9->修改学生信息");
		printf("\033[13;22H 0->修改登录密码");
		printf("\033[13;42H z->退出系统");
		printf("\033[14;23H请选择内容->");
		printf("\033[16;20H\033[36m=========================================================================\033[0m");
		printf("\033[?25l");
		char c = _getch();
		printf("\033[?25l");
		switch (c)
		{
		case '1':
			MgrClear();
			MgrAddUser();
			MgrClear();
			break;
		case '2':
			MgrClear();
			PrintUser();
			MgrClear();
			break;
		case '3':
			MgrClear();
			FindUserByNumber();
			MgrClear();
			break;
		case '4':
			MgrClear();
			UpdateUserPower();
			MgrClear();
			break;
		case '5':
			MgrClear();
			AddStudent();
			MgrClear();
			break;
		case '6':
			MgrClear();
			FindStuById();
			MgrClear();
			break;
		case '7':
			MgrClear();
			PrintStu();
			MgrClear();
			break;
		case '8':
			MgrClear();
			DeleteStu();
			MgrClear();
			break;
		case '9':
			MgrClear();
			ChangeStu();
			MgrClear();
			break;
		case '0':
			MgrClear();
			MgrClear();
			break;
		case 'z':
			bflag = 1;
			break;
		default:
			break;
		}
		printf("\033[?25l");
		if (bflag)
		{
			system("cls");
			printf("\033[10;45H\033[33m***感谢使用***\033[0m");
			printf("\033[20;30H      ");
			Sleep(2000);
			break;
		}
	}
}


//普通用户菜单
static void NormalMeun()
{
	while (1)
	{
		int bflag = 0;
		printf("\033[?25h");
		printf("\033[8;20H\033[36m==========================学生管理系统(普通用户)=========================\033[0m");
		printf("\033[10;22H 1->查找学生(根据学号)");
		printf("\033[10;48H 2->查找所有学生");
		printf("\033[10;74H 3->修改学生信息");
		printf("\033[12;22H 4->修改登录密码");
		printf("\033[12;48H z->退出系统");
		printf("\033[14;22H请选择内容->");
		printf("\033[16;20H\033[36m=========================================================================\033[0m");
		printf("\033[?25l");
		char c = _getch();
		switch (c)
		{
		case '1':FindStuById();
			break;
		case '2':PrintStu();
			break;
		case '3':ChangeStu();
			break;
		case '4':
			break;
		case 'z':
			bflag = 1;
			break;
		default:
			break;
		}
		if (bflag)
		{
			system("cls");
			printf("\033[10;45H\033[33m***感谢使用***\033[0m");
			printf("\033[20;30H      ");
			Sleep(2000);
			break;
		}
	}
}


//登录菜单
static void LoadUser()
{
	int k = 0;
	while (1)
	{
		int time = 0;
		int bflag = 0;
		//X  列  Y 行 
		COORD coord;
		printf("\033[?25h");
		//先有一个超级用户
		char number[50] = { 0 };
		char pwd[50] = { 0 };
		printf("\033[8;20H==========================欢迎登录学生管理系统==========================\n");
		printf("\033[10;49H\033[31m***用户登录***\033[0m");
		printf("\033[9;21H|");
		printf("\033[10;21H|");
		printf("\033[11;21H|");
		printf("\033[12;21H|");
		printf("\033[13;21H|");
		printf("\033[14;21H|");
		printf("\033[15;21H|");
		printf("\033[16;21H|");
		printf("\033[9;90H|");
		printf("\033[10;90H|");
		printf("\033[11;90H|");
		printf("\033[12;90H|");
		printf("\033[13;90H|");
		printf("\033[14;90H|");
		printf("\033[15;90H|");
		printf("\033[16;90H|");

		printf("\033[17;20H========================================================================\n");


		printf("\033[13;58H                        ");
		printf("\033[15;58H                        ");
		printf("\033[13;52H\033[36m|账号|\033[0m");
		printf("\033[15;52H\033[36m|密码|\033[0m");
		coord.X = 58;
		coord.Y = 12;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &number);
		coord.X = 58;
		coord.Y = 14;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		COORD coord1;
		coord1.X = 58;
		coord1.Y = 14;
		int i = 0;
		for ( i = 0; i < 50; i++)
		{
			pwd[i] = _getch();
			if (pwd[i]=='\r')
			{
				break;
			}
			coord1.X += 1 ;
			coord1.Y = 14;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord1);
			printf("*");
		}
		pwd[i] = '\0';
		/*coord.X = 58;
		coord.Y = 14;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		scanf("%s", &pwd);*/
		for (int i = 0; i < usermgr->userLen; i++)
		{
			if ((strcmp(usermgr->userArr[i]->number, number) == 0) &&
				(strcmp(usermgr->userArr[i]->pwd, pwd) == 0))
			{
				k = i;
				printf("\033[?25l");
				system("cls");
				printf("\033[10;35H验证成功真在登录!!!!!!!!!!");
				bflag = 1;
				Sleep(1000);
				printf("\033[10;35H                                      ");
				break;
			}
		}
		if (bflag)
		{
			break;
		}
		printf("\033[20;35H输入的密码错误请重新登录!!!!!!!!!!!");
		time++;
		Sleep(1000);
		printf("\033[20;35H                                          ");
		if (time == 3)
		{
			system("cls");
			printf("\033[5;35H\033[31m输入密码错误超过3次不可再登录\033[0m");
			return;
		}
	}
	if (usermgr->userArr[k]->power == 1)
	{
		MgrMenu();
	}
	if (usermgr->userArr[k]->power == 0)
	{
		NormalMeun();
	}



}

/**********************************************************************************/




int main()
{
	printf("\033[?25l");
	InitUserMgr(usermgr);
	InitStuentMgr(stumgr);
	AddUser(1, "123456", "111111");
	AddUser(1, "221975", "222222");
	AddUser(0, "852456", "333333");

	AddStudentMgr("427", 21, "张三", "男", "邵阳", "汉族", "软工四班", "2018", "计算机学院");
	AddStudentMgr("428", 22, "李四", "男", "邵阳", "汉族", "软工四班", "2018", "计算机学院");
	//AddStudentMgr("429", 23, "王五", "女", "邵阳", "汉族", "软工四班", "2018", "计算机学院");

	//printf("%s    %s  ", usermgr->userArr[usermgr->userLen]->number, usermgr->userArr[usermgr->userLen]->pwd);
	LoadUser();
	//MgrMenu();
	//PrintUser();
	//FileWrite();
	//FileRead();
	//PrintUser();
	/*UpdateUserPower("123456", 1);
	PrintUser();*/

	//InitStudent();
	//InitStuentMgr();



	//PrintStu();
	//DeleteStu("0");
	//PrintStu();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值