基础学生成绩管理系统有源码(C语言)
前些天,晚上没事情做,想着用C语言基础和数据结构的一些简单东西来做一个基础版的学生成绩管理系统。
简单无非是增、删、改、查,同时需要支持导出到文件等等。
在这里,将模块的声明和功能写出:
首先,毫无疑问需要结构体:
struct Student
struct StudentNode
在这里,我定义了学生结构体,其中包括学号、姓名、成绩等信息。第二个结构体是为了单链表而做准备,包含了学生结构体(数据域)以及一个指针域
初始化结构体:
Students InitStudents()
添加学生信息:
void AddStudentNode(Students head,struct Student data)
查找学生信息:
void SearchStudent(Students head,int StuId)
修改学生信息:
void ModifyStuInfo(Students head,int StuId)
删除学生信息:
void DeleteStu(Students head,int StuId)
显示目前所有学生信息:
void DisplayStudents(Students head)
导出学生信息到txt(有可能出现乱码,调一下编码方式就好):
1.文件初始化:
void createFile(FILE *fp)
2.在初始化文件中写入学生信息:
void SaveInfo(Students head,FILE *fp)
显示不及格学生信息:
void DisplayLowGrade(Students head)
菜单:
void menu()
以及最重要的主函数。
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
/*学生信息结构体*/
struct Student
{
int id;
char name[10];
int grade;
};
/*学生结构体管理*/
typedef struct StudentNode
{
struct Student Stu;
struct StudentNode* next;
}StudentNode,*Students;
/*初始化结构体*/
Students InitStudents()
{
Students headNode = (Students)malloc(sizeof(StudentNode));
headNode->next=NULL;
return headNode;
}
/*添加学生信息*/
void AddStudentNode(Students head,struct Student data)
{
struct StudentNode* Node = (struct StudentNode*)malloc(sizeof(struct StudentNode));
/*头插法添加学生信息*/
Node->Stu = data;
Node->next=head->next;
head->next=Node;
printf("添加成功!\n");
}
/*按学号查找学生成绩*/
void SearchStudent(Students head,int StuId)
{
if (head->next==NULL)
{
printf("请先添加学生信息!\n");
}else
{
Students s = head->next;
while (s!=NULL)
{
if (s->Stu.id==StuId)
{
break;
}
s=s->next;
}
if (s!=NULL)
{
printf("学号:%d\n姓名:",s->Stu.id);
puts(s->Stu.name);
printf("成绩:%d\n",s->Stu.grade);
}else
{
printf("未找到该学生!请确认没有错误!\n");
}
}
}
/*按学号查找修改学生信息*/
void ModifyStuInfo(Students head,int StuId)
{
if (head->next==NULL)
{
printf("请先添加学生信息!\n");
}else
{
Students s = head->next;
while (s!=NULL)
{
if (s->Stu.id==StuId)
{
break;
}
s=s->next;
}
if (s!=NULL)
{
int i=5;
while (i!=-1)
{
printf("请输入需要修改的目标的序号(1.学号 2.姓名 3.成绩):");
scanf("%d",&i);
printf("\n");
switch (i)
{
case 1:
scanf("%d",&s->Stu.id);
i=-1;
break;
case 2:
scanf("%s",&s->Stu.name);
i=-1;
break;
case 3:
scanf("%d",&s->Stu.grade);
i=-1;
break;
default:
printf("您选择的功能错误!请从新选择!\n");
break;
}
}
}else
{
printf("未找到该学生!请确认没有错误!\n");
}
}
}
/*根据学号删除结点*/
void DeleteStu(Students head,int StuId)
{
if (head->next==NULL)
{
printf("请先添加学生信息!\n");
}else
{
Students s = head->next;
Students p = head;
while (s!=NULL)
{
if (s->Stu.id==StuId)
{
break;
}
s=s->next;
p=p->next;
}
if (s!=NULL)
{
p->next = s->next;
free(s);
printf("删除成功!\n");
}else
{
printf("未找到该学生!请确认没有错误!\n");
}
}
}
/*显示目前学生信息以及成绩*/
void DisplayStudents(Students head)
{
if (head->next==NULL)
{
printf("当前无学生信息,请添加后再操作!\n");
}else
{
Students s = head->next;
while (s!=NULL)
{
printf("学号:%d\n姓名:",s->Stu.id);
puts(s->Stu.name);
printf("成绩:%d\n\n",s->Stu.grade);
s=s->next;
}
printf("输出信息完成!\n");
}
}
/*菜单*/
void menu()
{
printf("*********************************************************\n");
printf("* *\n");
printf("* 学 生 成 绩 管 理 系 统 *\n");
printf("* 1、添加学生信息 *\n");
printf("* 2、查询学生信息 *\n");
printf("* 3、修改学生信息 *\n");
printf("* 4、删除学生信息 *\n");
printf("* 5、显示所有学生 *\n");
printf("* 6、导出到文件夹 *\n");
printf("* 7、不及格的学生 *\n");
printf("* 8、退出学生系统 *\n");
printf("* 9、清理屏幕信息 *\n");
printf("* *\n");
printf("*********************************************************\n");
}
/*导出学生信息到文件*/
/*1.文件初始化*/
void createFile(FILE *fp)
{
fp=fopen("Students.txt","w");
if (!fp)
{
printf("文件打开失败!\n");
exit(0);
}
fprintf(fp,"%s %s %s\n","学号","姓名","成绩");
fclose(fp);
printf("文件创建成功!\n");
}
/*2.在初始文件后加入学生信息*/
void SaveInfo(Students head,FILE *fp)
{
fp=fopen("Students.txt","a");
if(!fp)
{
printf("文件打开失败!\n");
exit(0);
}
if(head->next==NULL)
{
printf("请先添加学生信息,再导出学生信息!\n");
}
else
{
Students s=head->next;
while (s!=NULL)
{
fprintf(fp,"%d %s %d\n",s->Stu.id,s->Stu.name,s->Stu.grade);
s=s->next;
}
fclose(fp);
printf("学生信息文件初始化成功!\n");
}
}
/*显示不及格学生信息*/
void DisplayLowGrade(Students head)
{
if (head->next==NULL)
{
printf("学生信息为空!请添加后再操作!\n");
}else
{
Students s=head->next;
printf("学号 姓名 成绩\n");
while(s!=NULL)
{
if (s->Stu.grade<60)
{
printf("%d %s %d\n",s->Stu.id,s->Stu.name,s->Stu.grade);
}
s=s->next;
}
printf("输出不及格成绩完成!\n");
}
}
/*主函数*/
int main()
{
FILE *fp;
Students head=InitStudents(head);
struct Student StuInfo;
int StuID;
int j=999;
while (j!=1000)
{
menu();
printf("请输入要选择的功能:");
scanf("%d",&j);
switch (j)
{
case 8:
j=1000;
break;
case 1:
printf("请输入学生信息(格式:学号 姓名 成绩):");
scanf("%d %s %d",&StuInfo.id,&StuInfo.name,&StuInfo.grade);
AddStudentNode(head,StuInfo);
break;
case 2:
printf("请输入学生学号:");
scanf("%d",&StuID);
SearchStudent(head,StuID);
break;
case 3:
printf("请输入学生学号:");
scanf("%d",&StuID);
ModifyStuInfo(head,StuID);
break;
case 4:
printf("请输入学生学号:");
scanf("%d",&StuID);
DeleteStu(head,StuID);
break;
case 5:
DisplayStudents(head);
break;
case 6:
createFile(fp);
SaveInfo(head,fp);
break;
case 7:
DisplayLowGrade(head);
break;
case 9:
system("cls");
break;
default:
printf("您选择的功能有误!请重新选择!\n");
break;
}
}
system("pause");
return 0;
}
当然,代码还能有很多可以改进和升级的地方。比如:成绩降序排列,从文件中载入学生信息等等,可以根据自己的需要在基础版本的学生成绩管理系统的基础上添加自己所需要的功能。
本人编写和运行的环境是:Visual Studio Code + GCC 。
代码复制下来是可以直接运行的。
谢谢您的收看,谢谢!如有不懂或者错误指出,请留言交流!