C语言程序设计:学生成绩管理系统(附代码以及编写逻辑)
学生成绩管理系统总体来说还不错,这篇文章中用到了动态内存申请和动态内存扩展以及结构体的定义、结构体指针和文件操作在编写文件操作的时候 一定要注意以下几点:1. 因为我使用的时候fscanf函数和fprintf函数所以一定要注意格式控制符2. 如果是自己创建的文件那么在读取之前一定要确保该文件是ASCII编码否者会乱码3. 一个函数中要做到一个指针只释放一次和指向NULL,避免成为野指针和跑异常4.
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;
}
其他的就是逻辑问题了 也没什么好说的
更多推荐
所有评论(0)