1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 干货干货~C语言版学生成绩管理系统【数据结构课程设计 百行代码实现功能强化版(内附

干货干货~C语言版学生成绩管理系统【数据结构课程设计 百行代码实现功能强化版(内附

时间:2019-05-06 12:38:23

相关推荐

干货干货~C语言版学生成绩管理系统【数据结构课程设计 百行代码实现功能强化版(内附

前言

关于这个系统是我们专业要求做的一个课程设计,本来是上个学期交的,我也是上个学期弄好的,打算发出来,但是一直没交上去(怕交上去之前发出来老师说我作弊。。。),今天就把我做的这个系统分享给大家,不足之处一起改进。下面的大量文字来源于我的实验报告,这报告写了我差不多一个星期,足足写了一万三千字,可能会有人觉得没有必要弄这么多,但是我觉得既然是一次设计,那就认真一点吧,认真对待每一次设计也是每个软件开发者必备的思想吧,哈哈哈,进入正题吧。

运行环境

开发工具:Dev C+

需求分析

此课程设计的题目为学生成绩管理系统,该系统模拟学校在考完试之后对学生成绩的处理。为了方便管理者对学生成绩的处理,本系统设有录入、显示、查找、修改、排序、删除、保存、读取、退出等九大功能。为了可以永久性保存学生信息,该系统才用以文件存储数据的形式进行设计,系统功能尚算齐全。学生信息暂时设有姓名、学号、性别、年龄、数学、英语、计算机以及总分。

系统功能

该系统功能有:录入、显示、查找、修改、排序、删除、保存、读取、退出共9个主要功能(有些功能里还有次要功能)。下面将一一介绍这些功能:

1、录入功能

该功能是模拟对学生成绩的录入。

2、显示功能

将当前所有学生的成绩显示出来,方便预览。此外会统计当前信息库中的学生总人数。

3、查找功能

该功能是对某个学生进行查找,考虑到可能存在同名同姓的学生,故该功能可设两个辅助查找功能——即按姓名查找以及按学号查找。因为姓名可能不唯一,但是学号肯定是唯一的。学生成绩管理者还可通过该功能查找本校同名同姓的学生,并且统计同名同姓者人数。

4、修改功能

为了模拟老师可能因为失误以至于输入错误的学生信息,系统增设修改功能。主要目的是对信息有误的学生信息进行修改。该功能在修改时会把学生的信息都重新输入一遍,当然了,也可以修改指定的信息,但是为了简洁本系统中并不设此功能。

5、排序功能

为了便于查看每科或者总分的最高分以及成绩优异的那一批人,本系统设计了排序功能。排序时会用到冒泡排序算法,在对学生成绩进行排序算法设计的过程中,联想到老师既然想看最高分,也有可能想看最低分,所以此功能还会对学生成绩进行升序排序。

6、删除功能

此功能主要是删除某个学生的信息。例如如果学生毕业之后,那他的成绩信息就可以去除了,铁打的学校流水般的学生,说的好像就是这个道理吧。

7、保存功能

为了便于将学生信息进行永久性的保存,系统开设了保存信息的功能。在保存的时候还应该考虑信息追加和信息更新。

8、读取功能

意如其名,字面意思就是从文本文件中读取学生的信息。方便于老师可以在不同的时间段工作。

9、退出功能

即直接推出该系统。

系统结构图

算法概要设计

就放一张主函数的图的,因为图片有点多,比较占位置。。。

心得体会(瞎写的吧)

做了这个课程设计之后,我的收获还是蛮大的。先来说说自己的感受吧,我觉得做这个课程设计,非常有必要,也很有意义。从一开始的选题,到设计系统结构,再到制定所用到的功能,接着开始写代码,每完成一个功能就测试一下,这过程并不是很顺利。比如说对于指针那一块有点忘记了,然后又在图书馆里复习了指针和结构体以及结构体指针。然后老师要求用文本的形式进行存储数据,我又新学了FILE文件指针。

在一开始制作之前,在CSDN上参考了很多大神的课程设计,主要是看一下他们的思路,和他们都设计了哪些功能,CSDN真的是一个好东西,在那上面可以学到很多东西,也正因如此,我就在参考的过程中学会system语句。不得不说这个语句真的挺实用的,把它用到我的代码里去,可以使系统在运行之后更有序。

写这个系统前后用了6天的时间吧,初步完成后是557行代码,然后加上注释以及更新了一部分功能就变成了700多行代码,每天都在图书馆里,基本上每天完成1-2个功能。这其中也有很多苦。比如在bug出现的时候,有时会盯着自己写的代码看很久,绞尽脑汁去解决这个bug,甚至有些bug是我在去食堂的路上,突然就想到了解决的方法。说真的,一开始写代码的时候,我感觉完成这个课程设计有点困难,因为之前从来没有试过去做这样一个项目,但是在把最后一个bug解决好的那一刻,真的就是特别快乐,特别的激动,从0到1,这个过程虽然艰辛,但是特别过瘾。

其实做这个学生成绩管理系统,就相当于做了一个小软件吧,因为它同做软件的流程是一样的,先是需求分析,然后概要设计,详细设计,之后开始编程,编程完成后还要开始测试,还有之后的更新维护。所以我觉得做这样一个课程设计特别有意义。

在做这个管理系统的过程中,我也有意外的发现,如果说代码是习武之人常说的招式,那么支撑招式的内力就是理论和概念。之前我不怎么喜欢理论和概念的东西,因为比较枯燥,所以我更喜欢实际一点的东西,但是现在我觉得,一个卓越的软件工程师,其理论知识也会特别扎实。所以在接下来的学习里,我会好好的复习和学习理论知识,比如现在所学的OS和计算机组成原理。此外,每天的算法题也要坚持去做。

“哪怕只有痛苦作伴也要勇往直前…”一句歌词送给自己吧,去追求那充满鲜花的世界,励志成为一名卓越的软件工程师。

部分效果图演示

详细代码(干货来咯~我很菜,心灵脆弱,大佬们别喷)

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>// 定义学生信息结构体 typedef struct Students{char name[20]; //姓名 int number;//学号,学号定义为整型,8位数,例如:18241024 char sex[3]; //性别 int age; //年龄 int math; //数学成绩 int english; //英语成绩 int computer; //计算机成绩 int TatolScore; //总分 struct Students *next; //指向下一个节点}Students;Students *head=NULL; //把head作为全局变量 // 定义一个菜单 void Menu(){printf("*****************************************\n");printf("*\t欢迎使用学生成绩管理系统\t*\n");printf("*****************************************\n");printf("*\t系统功能如下所示\t\t*\n");printf("*****************************************\n");printf("*\t1、录入学生成绩\t\t\t*\n");printf("*\t2、显示学生成绩\t\t\t*\n");printf("*\t3、查找学生信息\t\t\t*\n");printf("*\t4、修改学生信息\t\t\t*\n");printf("*\t5、学生成绩排序\t\t\t*\n");printf("*\t6、删除学生信息\t\t\t*\n");printf("*\t7、保存学生信息\t\t\t*\n");printf("*\t8、读取学生信息\t\t\t*\n");printf("*\t9、退出管理系统\t\t\t*\n");printf("*****************************************\n");}//定义一个函数,在排序时用于交换数据,减少代码冗余 void Swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;}//定义一个函数,用于交换两节点之间的信息 void SwapStudent(Students *p){char TmpName[20],TmpSex[3];Swap(&p->math,&p->next->math);Swap(&p->age,&p->next->age);Swap(&p->english,&p->next->english);Swap(&p->computer,&p->next->computer);Swap(&p->TatolScore,&p->next->TatolScore);Swap(&p->number,&p->next->number);strcpy(TmpName,p->name);strcpy(p->name,p->next->name);strcpy(p->next->name,TmpName);strcpy(TmpSex,p->sex);strcpy(p->sex,p->next->sex);strcpy(p->next->sex,TmpSex);}//冒泡排序法对学生成绩进行排序//len表示当前链表节点个数,p为当前的链表,choose表示选择 void BubbleSort(int len,Students *p,int choose){int i,j;for(i=0;i<len-1;i++){p=head;for(j=0;j<len-i-1;j++){if(choose==1){//按计算机成绩降序排序 if(p->computer<p->next->computer)SwapStudent(p); //调用学生信息交换函数,交换两节点之间的信息 p=p->next;}else if(choose==2){//按数学成绩降序排序 if(p->math<p->next->math)SwapStudent(p);p=p->next;}else if(choose==3){//按英语成绩降序排序 if(p->english<p->next->english)SwapStudent(p);p=p->next;}else if(choose==4){//按总成绩降序排序 if(p->TatolScore<p->next->TatolScore)SwapStudent(p);p=p->next;}else if(choose==5){//按计算机成绩升序排序 if(p->computer>p->next->computer)SwapStudent(p);p=p->next;}else if(choose==6){//按数学成绩升序排序 if(p->math>p->next->math)SwapStudent(p);p=p->next;}else if(choose==7){//按英语成绩升序排序 if(p->english>p->next->english)SwapStudent(p);p=p->next;}else if(choose==8){//按总成绩升序排序 if(p->TatolScore>p->next->TatolScore)SwapStudent(p);p=p->next;}}}}//定义一个函数,被主查找函数进行调用//该函数以学生姓名查找学生信息,该查找不排除同名同姓的情况 void FindStuName(){char StuName[10];Students *p;p=head; //指向头节点 int flag=1; //flag用于标记 int people=0;if(head==NULL){//如果头节点为空,表示查找失败 printf("查找失败:目前尚无任何信息可查\n");system("pause"); //system函数,用于停顿 system("cls");//system函数,用于清屏 return; //结束该函数 }//如果头节点不为空 printf("请输入你所需要查找的姓名:");scanf("%s",StuName); printf("_____________________________________________________________________________________________________________\n");while(p!=NULL){if(strcmp(StuName,p->name)==0){printf("%d-----姓名:%s 学号:%d 性别:%s 年龄:%d 数学:%d 英语:%d 计算机:%d 总分:%d\n",people+1,p->name,p->number,p->sex,p->age,p->math,p->english,p->computer,p->TatolScore);flag=0;people++;}p=p->next;}//当flag置零时表示信息库中没有此人 if(flag){printf("查找失败:学生信息库中暂无此人\n");system("pause"); //任意键继续 system("cls");//清屏 return;//结束函数 }//查到信息后会显示出来 printf("查找完毕,共有%d条结果\n",people);system("pause");//任意键继续 system("cls");//清屏 }//定义一个函数,被主查找函数调用//该函数目的在于以学号的方式对学生进行查找,查找结果唯一,因为学号唯一 void FindStuNum(){Students *p;p=head;//如果头节点为空,则表示查找失败 if(head==NULL){printf("查找失败:目前尚无任何信息可查\n");system("pause");system("cls");return;}int StuNum;printf("请输入你所需要查找的学号:");scanf("%d",&StuNum);printf("_____________________________________________________________________________________________________________\n");while(p!=NULL&&p->number!=StuNum)p=p->next;//p为NULL时,表示并未查到该学号 if(p==NULL){printf("查找失败:学生信息库中并未查到该学号\n");system("pause");system("cls");return;}printf("姓名:%s 学号:%d 性别:%s 年龄:%d 数学:%d 英语:%d 计算机:%d 总分:%d\n",p->name,p->number,p->sex,p->age,p->math,p->english,p->computer,p->TatolScore);printf("查找完毕\n");system("pause");system("cls");}//该系统功能之一,录入功能 void InputStudent(){system("cls");//清屏 Students *NewStudent;//表示一个新同学的节点 Students *tail;//链表的尾节点 tail=head; NewStudent=(Students*)malloc(sizeof(Students));//为新同学节点分配 NewStudent->next=NULL;//下一个节点置NULL //查找尾节点 while(head!=NULL&&tail->next!=NULL)tail=tail->next;//如果头节点为空,则表示当前录入的是第一个同学 if(head==NULL)head=NewStudent;elsetail->next=NewStudent; //不为空则令尾节点指向该同学 //录入开始 printf("***开始录入信息,请确保信息正确***\n");printf("请输入姓名:");scanf("%s",NewStudent->name);printf("请输入学号:");scanf("%d",&NewStudent->number);printf("请输入性别:");scanf("%s",NewStudent->sex);printf("请输入年龄:");scanf("%d",&NewStudent->age);printf("请输入数学成绩:");scanf("%d",&NewStudent->math);printf("请输入英语成绩:");scanf("%d",&NewStudent->english);printf("请输入计算机成绩:");scanf("%d",&NewStudent->computer);NewStudent->TatolScore=NewStudent->math+NewStudent->english+NewStudent->computer;printf("你本次录入的同学是%s,总分为:%d\n",NewStudent->name,NewStudent->TatolScore);printf("录入完毕\n");system("pause");system("cls");}//该系统主要功能之一,浏览(显示)功能,将全部学生成绩打印出来 void PrintStuInfo(){system("cls");Students *StuInfo;int people=0;//people用于统计人数 StuInfo=head;//相当于头节点为空 if(StuInfo==NULL){printf("暂无学生信息,请输入后再试。\n");system("pause");system("cls");return;}//头节点不为空就打印信息 else{printf("*************************************************************************\n");printf("|姓名\t|学号\t\t|性别\t|年龄\t|数学\t|英语\t|计算机\t|总分\t|\n"); while(StuInfo){people++;printf("*************************************************************************\n");printf("|%s\t|%d\t|%s\t|%d\t|%d\t|%d\t|%d\t|%d\t|\n",StuInfo->name,StuInfo->number,StuInfo->sex,StuInfo->age,StuInfo->math,StuInfo->english,StuInfo->computer,StuInfo->TatolScore);StuInfo=StuInfo->next;}}printf("*************************************************************************\n");printf("以显示全部,合计%d人\n",people); //报告学生人数 system("pause");system("cls");}//该系统主要功能之一,用于查找学生信息 void FindStudent(){system("cls");//考虑到姓名可能不唯一但是学号一定唯一的情况,定义了两种查询方式//即按学号查询以及按姓名查询 printf("*****************************************\n");printf("*\t学生成绩查询\t\t\t*\n");printf("*****************************************\n");printf("*\t请选择您所需要的查找方式:\t*\n");printf("*\t1、按学号查找\t\t\t*\n");printf("*\t2、按姓名查找\t\t\t*\n");printf("*****************************************\n");int choose;printf("请选择:");scanf("%d",&choose);switch(choose){case 1:FindStuNum();//调用按学号查询函数 break;case 2:FindStuName();//调用按学生姓名查询函数 break;default://不小心按错,则退出该功能 printf("选择错误!因为不存在此项选择!\n");system("pause");system("cls");break; }}//该系统主要功能之一,用于修改学生信息,因为学号是唯一的,所以该函数以学号去查找学生信息 void ChangeStudent(){system("cls");Students *p;p=head;//头节点为空,表示学生信息库中没有任何信息 if(head==NULL){printf("修改失败:学生信息库中暂无任何信息!\n");system("pause");system("cls");return;}int StuNum;int choose1;//choose用于确保进行修改时没有输入错误的学号 printf("请输入你将修改的学生的学号:");scanf("%d",&StuNum);//查找学号 while(p!=NULL&&p->number!=StuNum)p=p->next;//如果没有找到 if(p==NULL)printf("修改失败:学生信息库中查找不到此学号!\n");//找到学号后,先显示学生信息 else{printf("\n*********系统为你查找到以下信息*********\n");printf("_____________________________________________________________________________________________________________\n");printf("姓名:%s 学号:%d 性别:%s 年龄:%d 数学:%d 英语:%d 计算机:%d 总分:%d\n",p->name,p->number,p->sex,p->age,p->math,p->english,p->computer,p->TatolScore);printf("_____________________________________________________________________________________________________________\n");//确保没有输入错误学号 printf("请再次确认你是否需要修改该学生信息(是选择1,否选择2)\n");printf("请选择:");scanf("%d",&choose1);switch(choose1){case 1:break;case 2:printf("修改失败:你否认了修改指令!\n");system("pause");system("cls");return; }//可以修改单个的信息,也可以修改全部信息,choose2为选择结果 system("cls");printf("*****************************************\n");printf("*\t请选择你需要修改的信息\t\t*\n");printf("*****************************************\n");printf("*\t1、学生姓名\t\t\t*\n");printf("*\t2、学生学号\t\t\t*\n");printf("*\t3、学生性别\t\t\t*\n");printf("*\t4、学生年龄\t\t\t*\n");printf("*\t5、数学成绩\t\t\t*\n");printf("*\t6、英语成绩\t\t\t*\n");printf("*\t7、计算机成绩\t\t\t*\n");printf("*\t8、全部信息\t\t\t*\n");printf("*****************************************\n");//定义新信息 int choose2;int NewNumber;int NewAge;int NewMath;int NewEnglish;int NewComputer;int NewTatolScore;char NewName[20];char NewSex[3];printf("请选择:");scanf("%d",&choose2);switch(choose2){case 1:printf("请输入姓名:");scanf("%s",NewName);strcpy(p->name,NewName);break;case 2:printf("请输入学号:");scanf("%d",&NewNumber);p->number=NewNumber;break;case 3:printf("请输入性别:");scanf("%s",NewSex);strcpy(p->sex,NewSex);break;case 4:printf("请输入年龄:");scanf("%d",&NewAge);p->age=NewAge;break;case 5:printf("请输入数学成绩:");scanf("%d",&NewMath);p->math=NewMath;break;case 6:printf("请输入英语成绩:");scanf("%d",&NewEnglish);p->english=NewEnglish;break;case 7:printf("请输入计算机成绩:");scanf("%d",&NewComputer);p->computer=NewComputer; break;case 8:printf("请输入姓名:");scanf("%s",p->name);printf("请输入学号:");scanf("%d",&p->number);printf("请输入性别:");scanf("%s",p->sex);printf("请输入年龄:");scanf("%d",&p->age);printf("请输入数学成绩:");scanf("%d",&p->math);printf("请输入英语成绩:");scanf("%d",&p->english);printf("请输入计算机成绩:");scanf("%d",&p->computer);break;}//如果修改了成绩,那么总成绩也肯定要变 p->TatolScore=p->math+p->english+p->computer;printf("修改数据成功!\n");}system("pause");system("cls");} // 函数主要功能之一,用于学生成绩的排序 void SortStudents(){system("cls");Students *p,*q;int len;//统计节点个数,即学生个数 int choose;//用于选择排序方式 len=0;q=head;//如果头节点为空 if(head==NULL){printf("排序失败:学生信息库中暂无任何信息!\n");system("pause");system("cls");return;}//统计节点 while(q!=NULL){q=q->next;len++;}printf("*****************************************\n");printf("*\t学生成绩排序\t\t\t*\n");printf("*****************************************\n");printf("*\t你有以下8种排序方式可选:\t*\n");printf("*\t1、按计算机成绩降序\t\t*\n");printf("*\t2、按数学成绩降序\t\t*\n");printf("*\t3、按英语成绩降序\t\t*\n");printf("*\t4、按总成绩降序\t\t\t*\n");printf("*\t5、按计算机成绩升序\t\t*\n");printf("*\t6、按数学成绩升序\t\t*\n");printf("*\t7、按英语成绩升序\t\t*\n");printf("*\t8、按总成绩升序\t\t\t*\n");printf("*****************************************\n");printf("请选择:");scanf("%d",&choose);//通过选择不同的方式进行排序,调用冒泡排序算法函数 switch(choose){case 1:BubbleSort(len,p,choose);break;case 2:BubbleSort(len,p,choose);break;case 3:BubbleSort(len,p,choose);break;case 4:BubbleSort(len,p,choose);break;case 5:BubbleSort(len,p,choose);break;case 6:BubbleSort(len,p,choose);break;case 7:BubbleSort(len,p,choose);break;case 8:BubbleSort(len,p,choose);break;default://防止输入错误选择 printf("选择错误!因为不存在此项选择!\n");system("pause");system("cls");break; }printf("排序成功!请在功能2中查看!\n"); //排序成功后可以通过显示函数查看排序结果 system("pause");system("cls");}//函数主要功能之一,用于删除某个学生的信息,此处也是以学号进行查找,因为姓名会有同名的情况 void DeleteStuInfo(){system("cls");Students *p,*BeforeNode;p=head;int StuNum;int choose;//如果头节点为空 if(head==NULL){printf("暂无学生信息,请输入后再试。\n");system("pause");system("cls");return;}printf("请输入你将删除的学生的学号:");scanf("%d",&StuNum);//查找学号 while(p!=NULL&&p->number!=StuNum){BeforeNode=p;p=p->next;}//查找失败,可能是输入学号错误或者信息库中没有该学号 if(p==NULL){printf("删除失败:学生信息库中并未查到该学号\n");system("pause");system("cls");return;}printf("你将删除的学生是:%s,学号为:%d\n",p->name,p->number);//显示将要删除的学生的学号和姓名 printf("你确认要删除该同学的信息吗?(是选择1,不是选择2)\n");//防止失误将学生信息删除的情况 printf("请选择:");scanf("%d",&choose);switch(choose){case 1:if(p==head)//如果删除的学生是在头节点 head=p->next;else//如果删除的学生是在尾节点或者是中间节点 BeforeNode->next=p->next;printf("删除成功!\n");break;case 2:printf("删除失败:你否认了删除指令!\n");break;}system("pause");system("cls");}//函数主要功能之一,用于保存学生信息,该保存功能有覆盖以及追加两个功能 void SaveStuInfo(){system("cls");FILE *fp;//文件指针 int choose;//choose用于选择 printf("*****************************************\n");printf("*\t学生信息保存\t\t\t*\n");printf("*****************************************\n");printf("*\t你可以选择以下两种保存方式\t*\n");printf("*\t1、追加学生信息\t\t\t*\n");//追加 printf("*\t2、更新学生信息\t\t\t*\n");//覆盖 printf("*****************************************\n");printf("请选择:");scanf("%d",&choose);//选择 switch(choose){case 1:fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","a");//其中\为转义字符,用fopen函数打开D盘中学生成绩管理系统中的StuInfo文件,a表示追加 break;case 2:fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","w");//用法同上,w表示删除之前的数据后再进行保存,即覆盖、更新 break;} if(fp==NULL){printf("打开文件失败!\n");system("pause");system("cls");return;}Students *p;p=head;//保存学生信息 while(p!=NULL){fprintf(fp,"\n%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d",p->number,p->name,p->sex,p->age,p->math,p->english,p->computer,p->TatolScore);p=p->next;}printf("保存信息成功!\n");fclose(fp);//用fclose函数关闭文件,一定要关闭 system("pause");system("cls");}//函数主要功能之一,用于读取学生信息库的信息//如果在读取学生信息之前录入了新同学信息,则一定要保存,读取之后头节点指向StuInfo文本里第一个同学 void ReadStuInfo(){system("cls");Students *p;FILE *fp;//文件指针 Students *tail;tail=head; head=NULL;//经测试,头节点要置空,若不置空,就会出现在运行程序时读取多次后,学生信息叠加的情况 fp=fopen("D:\\学生成绩管理系统\\StuInfo.txt","r");//以只读的形式打开学生信息库文本 if(fp==NULL){printf("打开文件失败!\n");system("pause");system("cls");return;}while(!feof(fp)){p=(Students *)malloc(sizeof(Students));//为当前节点分配 p->next=NULL;//下个节点置空 //寻找尾节点 while(head!=NULL&&tail->next!=NULL)tail=tail->next; //形成链表 if(head==NULL){head=p;tail=head;}elsetail->next=p;//读取信息 fscanf(fp,"%d%s%s%d%d%d%d%d",&p->number,p->name,p->sex,&p->age,&p->math,&p->english,&p->computer,&p->TatolScore);}p=NULL;//此时的p是尾节点的下一个节点,要置空 printf("读取信息成功!\n");fclose(fp); //关闭 system("pause");system("cls");}//该系统的主函数 int main(){int choise;while(1){Menu();//先调用菜单函数 printf("请选择:");scanf("%d",&choise);//九大功能 switch(choise){case 1:InputStudent();//录入功能 break;case 2:PrintStuInfo();//显示功能 break;case 3:FindStudent();//查找功能 break;case 4:ChangeStudent();//修改功能 break;case 5:SortStudents();//排序功能 break;case 6:DeleteStuInfo();//删除功能 break;case 7:SaveStuInfo();//保存功能 break;case 8:ReadStuInfo();//读取功能 break;case 9://退出程序 printf("你已退出学生成绩管理系统,欢迎下次使用!");return 0;break;default://防止输入错误 printf("选择错误!因为不存在此项选择!\n");system("pause");system("cls");break;}}return 0;}

干货干货~C语言版学生成绩管理系统【数据结构课程设计 百行代码实现功能强化版(内附源码)】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。