当前位置: 首页 > ops >正文

C语言程序设计:学生成绩管理系统(附代码以及编写逻辑)

0. 运行效果图(部分)

源码下载

关注公众号:S3cD  即可获取Github或是Gitee的下载地址


设计要求:

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

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

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

修改所教班级学生信息

查看所教班级学生信息

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

录入所管班级学生信息

查看所管班级学生信息

学生 :查看自己的成绩

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


大致逻辑:

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

学生只需要查询无需登录,因此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;
}

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

http://www.xdnf.cn/news/11237.html

相关文章:

  • SAP 金税接口介绍
  • 文件快速定位神器(C++小项目实战)
  • 【Maven学习】Nexus OSS私服仓库的安装和配置
  • 从osCommerce到Zen Cart,再到CubeCart
  • java环境变量
  • 区块链的介绍和应用场景以及发展趋势
  • TP-link路由器如何进行端口映射?
  • 程序设计模式
  • jdk 命令大全
  • iText输出中文的三种字体选择方式
  • 常用邮箱的 IMAP/POP3/SMTP 设置
  • 回溯经典-m图着色问题(和地图4色问题的区别)
  • php+html+mysql实现购物商城在线购物系统服装购物系统计算机源码获取php+mysql电子商务系统电商系统php毕业设计课程设计大作业
  • VC皮肤库SkinSharp 1 0 6 6的使用
  • Servlet基础详解)
  • 共享打印机无法打印?常见的12种解决方法【详解】
  • 防不胜防 这些游戏被外挂活生生地毁了
  • YTM32的Flash控制器EFM模块详解
  • Apache启动失败解决办法
  • 中国顶级黑客Top10,混得最好的你猜是谁
  • 十大MySQL开发工具
  • Linux打怪通关攻略(1)Linux用户管理
  • 最简单明了的QQ在线客服代码
  • 【MySQL】MySQL中的四大约束(非空约束、唯一性约束、主键约束、外键约束)详解【附源码】
  • shlwapi.h所包含的函数
  • 我理解的组件和控件的区别
  • Linux服务器搭建
  • Hibernate初学教程
  • java基础总结(三十)--java 2和java有什么区别
  • 什么是SOA