求以下C语言编程:一个简单的学生成绩管理系统。每个学生的信息包括学号、姓名、数学成绩和英语成绩。

已经转让了,功能大致相当。

# include & ltstdio.h & gt

# include & ltstdlib.h & gt/*其他注释*/

# include & ltstring.h & gt/*字符串函数*/

# include & lttime.h & gt

#定义LEN sizeof(学生)

Typedef struct stu /*定义用于缓存数据的结构数组*/

{

字符编号[6];

字符名称[5];

int score[3];

int sum

浮动平均值;

int顺序;

struct stu * next

}学生;

/*初始化函数*/

学生*Init()

{

返回NULL/*返回空指针*/

}

/*菜单选择功能*/

int Menu_Select()

{

int n;

struct tm * pt/*定义时间结构*/

time _ t t

t =时间(空);

pt=localtime。t);/*读取系统日期并将其放入结构*/

printf(" \ n按任意键进入主菜单...\ n ");/*按任意键进入主菜单*/

//getch();/*从键盘读取字符,但不要在屏幕上显示*/

系统(“暂停”);

系统(“cls”);/*清空屏幕*/

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf(" \ t \ tWelcome to \ n ");

printf(" \ n \ t \ t \ t使用学生管理系统1.0 \ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *菜单* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

Printf("\t\t\t1。输入学生记录\ n ");/*输入学生记录*/

Printf("\t\t\t2。显示打印记录\ n ");/*显示*/

Printf("\t\t\t3。在姓名上查找搜索记录\ n ");/*查找*/

Printf("\t\t\t4。删除一条记录\ n ");/*删除*/

Printf("\t\t\t5。排序以创建新文件\ n ");/*排序*/

Printf("\t\t\t6。将插入记录插入列表\ n ");/*插入*/

Printf("\t\t\t7。保存文件\ n ");/*保存*/

Printf("\t\t\t8。读取加载文件\ n ");/*阅读*/

Printf("\t\t\t9。Quit Quit \ n ");/*退出*/

printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf(" \ t \ t \ t \ t当前系统日期:%d-%d-%d\n ",pt-& gt;tm_year+1900,pt-& gt;tm_mon+1,pt-& gt;TM _ mday);/*显示当前系统日期*/

{

printf(" \ n \ t \ t \ t输入您的选择(1 ~ 9):");

fflush(stdin);

scanf("%d ",& ampn);

} while(n & lt;1 | | n >;9);/*如果所选项目不在1~9之间,请再次输入*/

返回(n);/*返回选中的项,主函数根据数字调用相应的函数*/

}

/*输入函数*/

学生*创建()

{

int i,s;

学生*head=NULL,* p;/*定义函数。这个函数返回一个指向链表头的指针*/

系统(“cls”);

for(;;)

{

p =(STUDENT *)malloc(LEN);/*创建新模块*/

如果(!P) /*如果指针p为空*/

{

printf(" \ n输出内存溢出。内存不足。);/*输出内存溢出*/

返回(头);/*返回头指针,下同*/

}

Printf("输入编号(0:列表结尾):");

scanf("%s ",p-& gt;num);

如果(p->;num[0]= = ' 0 ')break;/*如果学号的第一个字符为0,则输入结束*/

Printf("输入姓名:");

scanf("%s ",p-& gt;姓名);

Printf("请输入3个等级请输入%d个分数\n ",3);/*提示开始输入分数*/

s = 0;/*计算每个学生的总分,初始值为0*/

for(I = 0;我& lt3;I++) /*3门课程循环3次*/

{

{

Printf("分数%d:",I+1);

scanf("%d ",& ampp->;score[I]);

如果(p->;score[I]& lt;0 | | p->;score[I]& gt;100) /*确保分数在0到100之间*/

Printf("数据错误,请重新输入数据错误,请重新输入。\ n ");

} while(p-& gt;score[I]& lt;0 | | p->;score[I]& gt;100);

s = s+p-& gt;得分[I];/*累加所有科目的分数*/

}

p->;sum = s;/*保存总分*/

p->;平均值=(float)s/3;/*通过强制类型转换将S转换为float类型,然后得到平均值*/

p->;顺序= 0;/*排序前该值为0 */

p->;下一个=头;/*将首节点作为新输入节点的后继节点*/

head = p;/*新的输入节点是新的头节点*/

}

返回(头);

}

/*显示所有记录的功能*/

作废打印(学生*头像)

{

int I = 0;/*统计记录的数量*/

学生* p;/*移动指针*/

系统(“cls”);

p =头部;/*初始值是头指针*/

printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *学生* * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("-\ n ");

printf(" | Rec | Num | Name | sc 1 | Sc2 | Sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

而(p!=空)

{

i++;

printf(" | % 3d | % 4s | %-4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

我,p-& gt;num,p->姓名,p-& gt;得分[0],p-& gt;分数[1],p-& gt;分数[2],p-& gt;sum,p->平均值,p-& gt;订单);

p = p-& gt;接下来;

}

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

}

/*查找记录功能*/

无效搜索(学生*负责人)

{

学生* p;/*移动指针*/

char s[5];/*用于存储名称的字符数组*/

系统(“cls”);

Printf("请输入要查找的名称。请输入搜索名称。\ n ");

scanf("%s ",s);

p =头部;/*将头指针赋给p*/

while(strcmp(p-& gt;姓名和地址。& ampp!= NULL) /*当记录的名称不是您要查找的名称,或者指针不为空时*/

p = p-& gt;接下来;/*将指针移动到下一个节点*/

如果(p!=NULL) /*如果指针不为空*/

{

printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *);

printf("-\ n ");

printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

p->;num,p->姓名,p-& gt;得分[0],p-& gt;分数[1],p-& gt;分数[2],p-& gt;sum,p->平均值,p-& gt;订单);

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

}

其他

printf(" \ n没有学生列表中没有第% s个学生。\ n”,s);/*显示没有学生*/

}

/*删除记录功能*/

学生*删除(学生*头)

{

//int n;

学生*p1,* p2/*p1是指向要删除的节点的指针,p2是其前任指针*/

char c,s[6];/*s[6]用于存储学号,C用于输入字母*/

系统(“cls”);

Printf("请输入学号请输入删除的编号:");

scanf("%s ",s);

p 1 = p2 =头;/*将初始值头指针分配给p1和p2 */

while(strcmp(p 1->;数字,s)和amp& ampp1!= NULL) /*当记录的学号不是你要找的,或者指针不为空*/

{

p2 = p 1;/*将p1的指针值赋给p2,作为p1的前任指针*/

p 1 = p 1->;接下来;/*将p1指针指向下一条记录*/

}

if(strcmp(p 1->;Num,s)==0) /*找到的学生编号*/

{

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *找到了* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("-\ n ");

printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

p 1->;num,p 1->;名称,p 1->;分数[0],p 1-& gt;分数[1],p 1->;score[2],p 1-& gt;sum,p1->平均值,p 1->;订单);

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf(" \ n是否要删除,输入y删除,输入n退出\ n确定要删除学生y/n?");/*提示是否删除,输入y删除,输入n退出*/

for(;;)

{

scanf("%c ",& ampc);

if(c = = ' N ' | | c = = ' N ')break;/*如果不删除,就会跳出这个循环*/

if(c=='y'||c=='Y ')

{

If(p 1 = = head)/* If p 1 = = head,被删除的节点是第一个节点*/

head = p 1->;接下来;/*给head第二个节点地址*/

其他

p2->;next = p 1->;接下来;/*否则,将下一个节点地址分配给前一个节点地址*/

//n = n-1;

printf(" \ n学生ID(编号):%s个学生被删除(学生已被删除。)\n”,s);

Printf("别忘了保存。别忘了保存。\ n ");打破;/*删除然后跳出循环*/

}

}

}

其他

printf(" \ n表单上没有这样的学生\ n列表上没有编号为% s的学生。\ n”,s);/*找不到节点*/

返回(头);

}

/*排序功能*/

学生*排序(学生*头)

{

int I = 0;/*保存排名*/

学生*p1,*p2,*t,* temp/*定义临时指针*/

temp = head-& gt;接下来;/*将原表头指针指向的下一个节点作为头指针*/

head->;next = NULL/*第一个节点是新表的头节点*/

while(temp!=NULL) /*当原始表不为空时排序*/

{

t =温度;/*取原表的头节点*/

temp = temp-& gt;接下来;/*原始头节点的指针向后移动*/

p 1 =头;/*设置移动指针p1,从头指针开始*/

p2 =头部;/*设置移动指针p2为p1的前身,初始值为头指针*/

while(t->;平均& ltp 1->;平均& amp& ampp1!=NULL) /*比较平均分数*/

{

p2 = p 1;/*当排序点值较小时,新的表格指针将向后移动*/

p 1 = p 1->;接下来;

}

If(p1==p2) /*p1==p2,表示要排序的点的值大,应该排在第一*/

{

t->;next = p 1;/*要排序的点的后继者是p*/

head = t;/*新的头节点是要排序的点*/

}

Else /*要排序的点要插在中间的p2和p1之间,如果P为空,就是尾部*/

{

t->;next = p 1;/*t后面是p1*/

p2->;next = t;/*p2后面跟着t*/

}

}

p 1 =头;/*排序后的头指针赋给p1,准备填排名*/

而(p1!=NULL) /*当p1不为空时,执行以下操作*/

{

i++;/*节点序列号*/

p 1->;order = I;/*将节点序列号分配给等级*/

p 1 = p 1->;接下来;/*指针向后移动*/

}

Printf("排序成功。\ n ");/*排序成功*/

返回(头);

}

/*插入记录功能*/

学生*插入(学生*头,学生*新)

{

学生*p0,*p1,* p2

//int n;

int sum1,I;

p 1 =头;/*使p1指向第一个节点*/

p0 =新;/*p0指向要插入的节点*/

请输入一个新记录。\ n ");/*提示输入记录信息*/

Printf("输入数字:");

scanf("%s ",新-& gt;num);

Printf("输入姓名:");

scanf("%s ",新-& gt;姓名);

printf("请输入%d分。\n ",3);

sum 1 = 0;/*保存新记录的总分,初始值为0*/

for(I = 0;我& lt3;i++)

{

{

Printf("分数%d:",I+1);

scanf("%d ",& amp新建-& gt;score[I]);

if(新建-& gt;score[I]& gt;100 | |新->;score[I]& lt;0)

Printf("数据错误,请重新输入。\ n ");

}while(新-& gt;score[I]& gt;100 | |新->;score[I]& lt;0);

sum 1 = sum 1+New-& gt;得分[I];/*累加所有科目的分数*/

}

新建-& gt;sum = sum 1;/*将总分存储在新记录中*/

新建-& gt;平均值=(float)sum 1/3;

新建-& gt;顺序= 0;

If(head==NULL) /*原链表为空表*/

{

head = p0

P0->;next = NULL

}/*将p0指向的节点作为头节点*/

其他

{

而((P0-& gt;平均& ltp 1->;平均)& amp& amp(p 1->;下一个!=NULL))

{

p2 = p 1;/*使p2指向p1刚刚指向的节点*/

p 1 = p 1->;接下来;/*p1向后移动一个节点*/

}

如果(P0-& gt;平均值& gt= p 1->;平均)

{

if(head = = p 1)head = P0;/*在原始第一个节点之前插入*/

否则p2-& gt;next = p0/*在p2指向的节点后插入*/

P0->;next = p 1;

}

其他

{

p 1->;next = p0

P0->;next = NULL

}/*在最后一个节点后插入*/

}

//n = n+1;/*节点数加上1*/

head=Sort(头);/*调用排序函数对学生的成绩重新排序*/

printf(" \ n学生% s已被更新。\ n ",新建->名称);

Printf("不要忘记保存不要忘记保存新文件。\ n ");

返回(头);

}

/*将数据保存到文件功能*/

作废保存(学生*人头)

{

FILE * fp/*定义指向文件的指针*/

学生* p;/*定义移动指针*/

char outfile[10];

Printf("输出文件,例如:c: \ \ score输入输出文件名,例如c:\ \ score \ n ");

scanf("%s ",outfile);

If ((FP = fopen (outfile," w))= = null)/*打开一个二进制文件进行输出,该文件是只写的*/

{

Printf("打不开文件打不开文件\ n ");

返回;/*如果打不开,返回菜单*/

}

Printf("\n保存文件...\ n ");

p =头部;/*将指针从头指针移开*/

而(p!=NULL) /*如果p不为空*/

{

fwrite(p,LEN,1,FP);/*写记录*/

p = p-& gt;接下来;/*指针向后移动*/

}

fclose(FP);/*关闭文件*/

Printf("保存成功...文件保存成功!\ n ");

}

/*从文件函数中读取数据*/

学生*负荷()

{

学生*p1,*p2,* head = NULL/*定义记录指针变量*/

FILE * fp/*定义指向文件的指针*/

char infile[10];

Printf ("pour files如:c: \ \ score输入infile name,例如c:\ \ score \ n ");

scanf("%s ",infile);

If ((FP = fopen (infile," r))= = null)/*以只读模式打开一个二进制文件*/

{

Printf("无法打开文件。\ n ");

返回(头);

}

printf(" \ n查找文件...正在加载文件!\ n ");

p1=(学生*)malloc(LEN);/*创建新模块*/

如果(!p1)

{

Printf("内存溢出!内存不足!\ n ");

返回(头);

}

head = p 1;/*作为头指针应用于空格*/

而(!Feof(fp)) /*循环读取数据,直到文件结束*/

{

if(fread(p1,LEN,1,fp)!= 1)break;/*如果数据未被读取,跳出循环*/

p 1->;next =(STUDENT *)malloc(LEN);/*为下一个节点腾出空间*/

如果(!p 1->;下一个)

{

printf("内存不足!\ n ");

返回(头);

}

p2 = p 1;/*使p2指向p1刚刚指向的节点*/

p 1 = p 1->;接下来;/*指针向后移动,数据链接被重新读入当前页脚*/

}

p2->;next = NULL/*最后一个节点的后继指针为空*/

fclose(FP);

printf(" \ n您成功地从文件中读取了数据!\ n您已成功从文件中读取数据!\ n ");

返回(头);

}

/*主功能界面*/

int main()

{

学生*头,新;

head = Init();//链表初始化,使head的值为空。

for(;;)//无限次循环

{

开关(Menu_Select())

{

case 1:head = Create();打破;

案例二:打印(头);打破;

案例三:搜索(头);打破;

情况4:head=Delete(头);打破;

案例五:head=Sort(头);打破;

案例6:head = Insert(head & amp;新);打破;//& amp;New代表寄信人地址。

案例7:救(头);打破;

情况8:head = Load();打破;

案例9:出口(0);//如果菜单返回值为9,程序结束。

}

}

返回0;

}