既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
因其独特,因其始终如一
文章目录
2. Student Management System.c
前言:
学生成绩管理系统含教师登录入口和学生登录入口,可实现学生信息的添加,删除,查找,排名、保存等
一、学生成绩管理系统介绍
该项目分为5个文件,其中4个 .c源文件和1个 .h头文件
test.c项目实现的整体框架及成绩管理系统的初始登录界面等
Student Management System.c实现教师系统和学生系统的登录界面和系统成员数据的初始化
Stu_System.c实现学生登录系统等相关功能
Teacher.c实现老师登录系统等相关功能
Student Management System.h存放项目中的各种头文件、#define 定义的常变量、函数、结构体的声明等
推荐使用集编译链接于一体的翻译环境
推荐环境:
Visual Studio 2017版及或更高、Dev-C++、Visual Studio Code等 C/C++编译器
学生成绩管理系统介绍
该成绩管理系统有两个登录入口,分为教师入口和学生入口。
一个学生的成绩信息包括:学生姓名,年龄、性别,学号,专业、成绩。
教师系统可以添加学生信息、删除学生信息、查询学生信息、查看学生总排名;学生系统可以查看所输入的学生的信息、排名等。教师每添加一个学生,在退出学生成绩管理系统后,程序会自动将学生信息以二进制文本的形式保存为一个txt文件,下次登录成绩管理系统时,程序会自动加载信息,教师也可以手动将某个或所有学生信息永久删除
学生成绩管理系统运行界面
二、学生成绩管理系统设计思路
首先要封装一个系统总界面,这个比较简单,只需要控制好间距,用printf即可实现,然后用 switch…case 语句来选择教师登录还是学生登录,并用do…while循环封装,保证该系统可以多次使用;在教师系统和学生系统中,也用类似的printf、switch…case选择语句加do…while循环来实现相应的选择功能。
其次是对学生系统进行初始化,为了节省内存,达到系统运行效率最大化,项目使用了动态内存管理的方法,初始化时先用动态内存函数开辟三个学生的空间,后面随着学生数量的增加,当系统空间被填满后,就再多开辟两个学生的空间,满了之后继续开辟,如此往复,每次只多开辟两个学生的空间。这里使用动态内存管理可以避免内存过度浪费。
接下来是老师录入信息,删除学生等。录入信息直接采用scanf函数即可,删除学生信息首先得找到这个学生,所以得单独再封装一个由学生姓名查找学生信息的函数,也方便后面查学生信息时使用,找到这个学生后,用这个学生个的下一个学生的数据覆盖它,然后用后面的进皆覆盖前面的信息,最后使学生人数减1即可,这里的覆盖使用memset函数完成即可。
还有对学生的成绩排名的功能,在教师系统和学生系统的排名处都要展示排名。因为学生信息在结构体中,所以推荐用 qsort快速排序函数完成,但需要将qsort函数由原来的升序改为降序。
最后就是学生信息的保存及加载。在整个项目的最后可以添加一个而进行写文件的语句,并将学生信息逐条通过rwrite函数循环写入文件中;而加载文件中的二进制学生信息则是在初始化学生信息的时候,单独封装一个读文件的函数,用来加载学生数据。读写文件都用二进制的方式是为了防止学生信息泄露。
三、源代码
1. test.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
void menu()
{
printf("————————————————————————————————————————————————————————————————\n");
printf(" 学生成绩管理系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
printf(" 1.教师登录 2.学生登录 \n");
printf(" 0.退出系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
int main()
{
int input = 0;
System Mge;
Init_System(&Mge);
int ret = 0;
do
{
menu();
printf("请选择:-> ");
scanf("%d", &input);
switch (input)
{
case 1:
//进入教师系统
Teacher_System(&Mge);
break;
case 2:
Stu_System(&Mge);
break;
case 3:
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
2. Student Management System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int Increase_Capacity2(System* Mge)//先判断是否够
{
assert(Mge);
if (Mge->sz == Mge->Max_Space)
{
Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));
if (Mge->data == NULL)
{
perror("realloc");
return 1;
}
Mge->data = tmp;
Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/
return 0;
}
else
return 0;
}
void Load_Sy(System* Mge)
{
assert(Mge);
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL)
{
return;
}
else
{
Stu tmp = { 0 };
while (fread(&tmp, sizeof(Stu), 1, pf))
{
if (1 == Increase_Capacity2(Mge))
return;//开辟失败
else
{
Mge->data[Mge->sz] = tmp;
Mge->sz +=1;
}
}
}
fclose(pf);
pf = NULL;
}
void Menu_Teacher()
{
printf("\n—————————— 教师系统 ————————————\n");
printf(" 1.录入学生信息 2.删除学生信息 \n");
printf(" 3.显示所有学生信息 4.查看排名 \n");
printf(" 5.查询学生信息 6.一键删除所有学生信息 \n");
printf(" 0.退出教师系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Menu_Stu()
{
printf("\n—————————— 学生系统 ————————————\n");
printf(" 1.查看我的信息 \n");
printf(" 0.退出学生系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Init_System(System* Mge)
{
//初始化系统
assert(Mge);
Mge->data = (Stu*)malloc(Inti_Data * sizeof(Stu));//初始化三个学生的空间
if (Mge->data == NULL)
{
perror("malloc");
return;
}
else
{
Mge->sz=0;
Mge->Max_Space = Inti_Data;
//加载通讯录
Load_Sy(Mge);
}
}
void Teacher_System(System* Mge)//教师系统
{
assert(Mge);
int input = 0;
do
{
Menu_Teacher();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
Add_Stu(Mge);//增加学生信息
break;
case 2:
Del_Stu(Mge);//删除学生信息
break;
case 3:
Show_Stu(Mge);//打印
break;
case 4:
Sort(Mge);//查看排名
break;
case 5:
SearchStu(Mge);//查找学生
break;
case 6:
Del_Exit(Mge);//删除所有信息
break;
case 0:
De_System(Mge);
break;
default:
printf("退出教师系统\n");
break;
}
} while (input);
}
void Stu_System(System* Mge)
{
assert(Mge);
int input = 0;
do
{
Menu_Stu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
View(Mge);
break;
case 0:
break;
default:
printf("输入错误,请重新输入:");
break;
}
} while (input);
}
3.Stu_System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName1(System* Mge, char* str1)
{
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
if (strcmp(str1, Mge->data[i].Name) == 0)
return i;//找到了
}
return Mge->sz;
}
int Comper2(const void* p1, const void* p2)
{
return(((Stu*)p2)->Garde-(((Stu*)p1)->Garde));
}
void View(System* Mge)
{
assert(Mge);
printf("请输入你的名字:->\n");
char str1[10] = "0";
scanf("%s",str1);
qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper2);
int i=FindName1(Mge,str1);
if (i == Mge->sz)
{
printf("请检查你的信息是否正确或找老师查询信息是否录入\n");
return;
}
else
{
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩", "排名");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
![img](https://img-blog.csdnimg.cn/img_convert/06f810ceb0463c9f29f860eb9b649488.png)
![img](https://img-blog.csdnimg.cn/img_convert/8c1e5e2918a42c84d3622c54feb8b0fe.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
"姓名", "年龄", "学号", "性别", "专业", "成绩", "排名");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
[外链图片转存中...(img-0LydJVh4-1715790760118)]
[外链图片转存中...(img-HSNxGbxa-1715790760118)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**