0. 运行效果图(部分)

源码下载

关注微信公众号:seeCode 回复C语言进行获取GitHub下载地址


设计要求:

管理员:添加用户(教师、班主任)

添加班级(班级班主任、班级教师)

教师 :录入所教班级学生信息

修改所教班级学生信息

查看所教班级学生信息

班主任:导出所管班级学生信息

录入所管班级学生信息

查看所管班级学生信息

学生 :查看自己的成绩

如果是管理员权限的话那么就不能再具备教师和班主任的权限


大致逻辑:

使用多文件编写,避免出现混乱

学生只需要查询无需登录,因此user文件中只需要存在管理员、班主任、教师就可以了,使用关键字判断是不是管理员

教师和班主任的重复点是班级,因此可以在class文件中存放这个班级的班主任和教师信息,进行判断登录人是否存在该权限

学生需要具有对应的班级、成绩、姓名、学号放在student文件中


注意事项:

当程序运行读取文件的时候,为了避免文件不存在而导致异常,因此在读取的时候会先判断是否存在文件,如果不存在的话那么就会自己创建文件并且添加内置内容

系统所操作的任何文件都放在D盘下,包括导出的文件,如果是自己创建的文件那么需要注意格式问题和文件编码避免乱码(需要ASCII编码)

内置内容:

class文件:班级:软件2102 班主任:c9noo C语言老师:test Java老师:c9noo

student文件:学号:10086 姓名:李金蛋 班级:软件2102 C语言成绩:32.140000 Java成绩:43.230000

user文件:

账号:admin 密码:123456 管理员:是

账号:c9noo 密码:123456 管理员:否

账号:test 密码123456 管理员:否


部分源码讲解:

在部分选择页面上面,采用了光标移动的方式,只需要通过上下方向键就可以进行移动,并且提示语句进行了变色处理

//设置字体颜色
void text_Attribute(int key) {
	//	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE); 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
	if (key == 0) {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//恢复字体颜色
	}
}

//光标跳转函数
void gotoxy(int x, int y)
{
	COORD pos = { x,y };
	//SetConsoleCursorPosition是一个Windows api,作用是设置控制台光标位置,跟上面的COORD进行了结合,p0变成了结构体变量
	//GetStdHandle 也是一个Windows api函数,从一个特定的标准设备(标准输入、标准输出、标准错误)中取得一个句柄(用来标识不同设备的数值) 返回值是HANDLE
	//STD_INPUT_HANDLE 标准输入句柄	STD_OUTPUT_HANDLE 标准输出句柄	STD_ERROR_HANDLE 标准错误句柄
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //Set设置 Console控制台 Cursor光标 Position坐标,需要两个参数,第一个是HANDLE类型 第二个是COORD类型
}

为了避免空间浪费或是溢出的问题,因此学生、班级、用户数组都使用了动态内存申请和扩展的方式进行处理

例如:

//初始化用户数组
void ini_User_Arr(urArr* pu) {
	user* Q = (user*)malloc(ARRLEN * sizeof(user));
	if (Q == NULL) {
		printf("用户数组创建失败!");
	}
	else {
		pu->ur = Q;
		memset(pu->ur, 0, sizeof(pu->ur));
		pu->index = 0;
		pu->maxIndex = ARRLEN;
	}
	Q = NULL;
	read_User_File(pu);
}
//用户数组增容
void add_User_Memory(urArr* pu) {
	if (pu->index == pu->maxIndex) {
		user* Q = realloc(pu->ur, (pu->maxIndex + ADDLEN) * sizeof(user));
		if (Q == NULL) {
			printf("用户数组增容失败!");
		}
		else {
			pu->ur = Q;
			pu->maxIndex += ADDLEN;
		}
		Q = NULL;
	}
}

模拟了密码输入的加密方式

//模拟密码输入
void getpwd(char* pwd, int pwdlen) {
	char ch = 0;
	int i = 0;
	while (i < pwdlen) {
		ch = getch();
		if (ch == '\r') {  //回车结束输入
			printf("\n");
			break;
		}
		if (ch == '\b' && i > 0) {  //按下删除键
			i--;
			printf("\b \b");
		}
		else if (isprint(ch)) {  //输入可打印字符
			pwd[i] = ch;
			printf("*");
			i++;
		}
	}
	pwd[i] = 0;
}

其他的就是逻辑问题了 也没什么好说的

Logo

快速构建 Web 应用程序

更多推荐