求以下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;
}