C语言学生管理系统.docx
《C语言学生管理系统.docx》由会员分享,可在线阅读,更多相关《C语言学生管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
C语言学生管理系统
#include
#include
#include
#include
typedefchariteamtype;
typedefstructStuIF
{
iteamtypeNAME[10],STNB[10];
floatCCN,CMH,CEG;
floatSUM,AVGE;
}PerStu;
typedefstructnode
{
structStuIFPerStu;
structnode*prior,*next;
}PerNode;
PerNode*H;
PerNode*InitNode()
{
PerNode*L;
L=(PerNode*)malloc(sizeof(PerNode));
if(L)
{L->prior=NULL;L->next=NULL;}
returnL;
}
voidDplyone(PerNode*Q1)
{
if(!
Q1)return;
else{
printf("%-12s",Q1->PerStu.NAME);
printf("%-12s",Q1->PerStu.STNB);
printf("%-12.1f",Q1->PerStu.CCN);
printf("%-12.1f",Q1->PerStu.CMH);
printf("%-12.1f",Q1->PerStu.CEG);
printf("%-12.1f",Q1->PerStu.SUM);
printf("%-12.1f",Q1->PerStu.AVGE);
printf("\n");
}
return;
}
PerNode*Srchone(PerNode*Q2)
{
charstnb[10];
PerNode*L;
L=Q2->next;
if(!
L)printf("\n系统中暂无任何信息,查找失败!
\n");
else{
printf("\n\n请输入要查找的学生学号:
");
scanf("%s",stnb);
while(L&&(strcmp(L->PerStu.STNB,stnb))!
=0)
{L=L->next;}
if(!
L)printf("\n系统中无此相关信息,查找失败!
\n");
}
returnL;
}
voidConSrchFroC(PerNode*Q3)
{
PerNode*L,*p=Q3->next;
floatf1,f2,f3;
intflag;
charm;
do{
do{
flag=1;
printf("\n\n请输入两个分数来指定条件查找分数段:
\n");
scanf("%f%f",&f1,&f2);
if(f1==f2){flag=0;printf("\n\n输入的分数无法确定查找分数段!
\n");}
elseif(f1>f2){f3=f1;f1=f2;f2=f3;}
}while(!
flag);
flag=0;
L=p;
while(L)
{
if((L->PerStu.CCN)>=f1&&(L->PerStu.CCN)<=f2)
{
flag++;
if(flag==1)
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(L);
}
L=L->next;
}
if(!
flag)printf("\n系统中无满足条件分数段的学生记录!
\n");
printf("\n是否在科一中继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidConSrchFroM(PerNode*Q4)
{
PerNode*L,*p=Q4->next;
floatf1,f2,f3;
intflag;
charm;
do{
do{
flag=1;
printf("\n\n请输入两个分数来指定条件查找分数段:
\n");
scanf("%f%f",&f1,&f2);
if(f1==f2){flag=0;printf("\n输入的分数无法确定查找分数段!
\n");}
elseif(f1>f2){f3=f1;f1=f2;f2=f3;}
}while(!
flag);
flag=0;
L=p;
while(L)
{
if((L->PerStu.CMH)>=f1&&(L->PerStu.CMH)<=f2)
{
flag++;
if(flag==1)
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(L);
}
L=L->next;
}
if(!
flag)printf("\n系统中无满足条件分数段的学生记录!
\n");
printf("\n是否在科二中继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidConSrchFroE(PerNode*Q5)
{
PerNode*L,*p=Q5->next;
floatf1,f2,f3;
intflag;
charm;
do{
do{
flag=1;
printf("\n\n请输入两个分数来指定条件查找分数段:
\n");
scanf("%f%f",&f1,&f2);
if(f1==f2){flag=0;printf("\n输入的分数无法确定查找分数段!
\n");}
elseif(f1>f2){f3=f1;f1=f2;f2=f3;}
}while(!
flag);
flag=0;
L=p;
while(L)
{
if((L->PerStu.CEG)>=f1&&(L->PerStu.CEG)<=f2)
{
flag++;
if(flag==1)
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(L);
}
L=L->next;
}
if(!
flag)printf("\n系统中无满足条件分数段的学生记录!
\n");
printf("\n是否在科三中继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidConSrchFroS(PerNode*Q6)
{
PerNode*L,*p=Q6->next;
floatf1,f2,f3;
intflag;
charm;
do{
do{
flag=1;
printf("\n\n请输入两个分数来指定条件查找分数段:
\n");
scanf("%f%f",&f1,&f2);
if(f1==f2){flag=0;printf("\n输入的分数无法确定查找分数段!
\n");}
elseif(f1>f2){f3=f1;f1=f2;f2=f3;}
}while(!
flag);
flag=0;
L=p;
while(L)
{
if((L->PerStu.SUM)>=f1&&(L->PerStu.SUM)<=f2)
{
flag++;
if(flag==1)
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(L);
}
L=L->next;
}
if(!
flag)printf("\n系统中无满足条件分数段的学生记录!
\n");
printf("\n是否在总分中继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidConSrchFroA(PerNode*Q7)
{
PerNode*L,*p=Q7->next;
floatf1,f2,f3;
intflag;
charm;
do{
do{
flag=1;
printf("\n\n请输入两个分数来指定条件查找分数段:
\n");
scanf("%f%f",&f1,&f2);
if(f1==f2){flag=0;printf("\n输入的分数无法确定查找分数段!
\n");}
elseif(f1>f2){f3=f1;f1=f2;f2=f3;}
}while(!
flag);
flag=0;
L=p;
while(L)
{
if((L->PerStu.AVGE)>=f1&&(L->PerStu.AVGE)<=f2)
{
flag++;
if(flag==1)
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(L);
}
L=L->next;
}
if(!
flag)printf("\n系统中无满足条件分数段的学生记录!
\n");
printf("\n是否在平均分中继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidFpwrite(FILE*Q8,PerNode*Q9)
{
if(!
Q8)printf("\n文件打开失败,存盘失败!
");
elseif(!
Q9)printf("\n存盘信息有误,存盘失败!
");
else
fprintf(Q8,"%s%s%-5.1f%-5.1f%-5.1f%-6.1f%-5.1f",Q9->PerStu.NAME,Q9->PerStu.STNB,Q9->PerStu.CCN,Q9->PerStu.CMH,Q9->PerStu.CEG,Q9->PerStu.SUM,Q9->PerStu.AVGE);
return;
}
voidEnter(PerNode*L1)
{
charm;
PerNode*P,*L=L1;
do{
P=(PerNode*)malloc(sizeof(PerNode));
if(!
P){printf("内存空间不足,创建失败!
");break;}
else
{
P->prior=L;
P->next=L->next;
if(L->next)L->next->prior=P;
L->next=P;
printf("\n学生姓名:
");
scanf("%s",P->PerStu.NAME);
printf("\n\n学生学号:
");
scanf("%s",P->PerStu.STNB);
printf("\n\n学生第一科成绩:
");
scanf("%f",&(P->PerStu.CCN));
printf("\n\n学生第二科成绩:
");
scanf("%f",&(P->PerStu.CMH));
printf("\n\n学生第三科成绩:
");
scanf("%f",&(P->PerStu.CEG));
P->PerStu.SUM=P->PerStu.CCN+P->PerStu.CMH+P->PerStu.CEG;
P->PerStu.AVGE=P->PerStu.SUM/3.0;
}
printf("\n\n此条信息以创建完毕,是否继续创建,");
printf("\n输入Y继续,N退出创建信息:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
printf("\n");
}while((m=='Y')||(m=='y'));
return;
}
PerNode*Load(PerNode*L2)
{
ints;
FILE*fp;
PerNode*P,*q,*L;
if((fp=fopen("学生成绩管理系统.txt","r+"))==NULL)
printf("\n文件打开失败!
");
else{
{
L=L2->next;
while(L){q=L->next;free(L);L=q;}
L2->next=NULL;
}
fscanf(fp,"%d",&s);
while(s--)
{
P=(PerNode*)malloc(sizeof(PerNode));
P->prior=L2;
P->next=L2->next;
if(L2->next)L2->next->prior=P;
L2->next=P;
fscanf(fp,"%s%s%f%f%f%f%f",P->PerStu.NAME,P->PerStu.STNB,&(P->PerStu.CCN),&(P->PerStu.CMH),&(P->PerStu.CEG),&(P->PerStu.SUM),&(P->PerStu.AVGE));//完成读取
}
fclose(fp);
printf("\n数据载入成功!
\n");
}
returnL2;
}
voidSearch(PerNode*L3)
{
charm;
PerNode*P;
do{
P=Srchone(L3);
if(P)
{
printf("\n查找成功,是否显示此条信息,Y显示,N退出显示:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
if((m=='Y')||(m=='y'))
{
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
Dplyone(P);
}
}
printf("\n是否继续查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidConditionSrch(PerNode*L4)
{
charm;
if(L4->next==NULL)printf("\n系统中暂无任何信息,条件查找失败!
\n");
else
do{
printf("\n\n条件查找指定分数段的学生信息,输入括号内数字确定科目\n");
printf("科一
(1),科二
(2),科三(3),总分(4),平均分(5):
\n");
do{m=getche();
}while(m!
='1'&&m!
='2'&&m!
='3'&&m!
='4'&&m!
='5');
switch(m)
{
case'1':
ConSrchFroC(L4);break;
case'2':
ConSrchFroM(L4);break;
case'3':
ConSrchFroE(L4);break;
case'4':
ConSrchFroS(L4);break;
case'5':
ConSrchFroA(L4);break;
}
printf("\n\n是否继续条件查找,输入Y继续,N退出查找:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidCount(PerNode*L5)
{
intn=0;
floats=0;
PerNode*L=L5->next;
while(L)
{
n++;
s=s+L->PerStu.SUM;
L=L->next;
}
if(n==0)printf("\n系统中暂无学生信息!
\n");
else
printf("\n学生总人数为%d,班级总分的平均分为%5.2f\n",n,s/n);
}
voidDelete(PerNode*L6)
{
charm;
PerNode*P,*q;
do{
if(L6->next==NULL){printf("\n系统中暂无任何信息,删除失败!
\n");break;}
else
{
P=Srchone(L6);
if(!
P);
else
{
printf("\n是否确定删除,输入Y确定,N取消删除:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
if((m=='Y')||(m=='y'))
{
q=P->prior;
q->next=P->next;
if(P->next)P->next->prior=q;
free(P);
printf("\n删除成功!
\n");
}
else;
}
}
printf("\n是否继续删除,输入Y继续,N退出删除:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
}while((m=='Y')||(m=='y'));
return;
}
voidPutOrder(PerNode*L7)
{
PerNode*K,*M,*P=L7->next;
PerNode*T1,*T2,*T3;
intflag,fg;
if(P&&(P->next))
while(P->next)
{
K=P->next;
while(K->next){K=K->next;}
flag=1;
M=K;
while(M!
=P)
{
fg=1;
T2=M->prior;
T1=T2->prior;
T3=M->next;
if((atoi(T2->PerStu.STNB))>(atoi(M->PerStu.STNB)))
{
T1->next=M;
M->prior=T1;
M->next=T2;
T2->prior=M;
T2->next=T3;
if(T3)T3->prior=T2;
flag=0;
fg=0;
}
if(fg)M=M->prior;
if((P==T2)&&(!
fg))P=M;
}
if(flag)break;
P=P->next;
}
return;
}
voidDisplay(PerNode*L8)
{
PerNode*L;
L=L8->next;
if(!
L)printf("\n系统中暂无任何信息!
");
else{
PutOrder(L8);
L=L8->next;
printf("\n学生成绩系统中信息如下:
\n");
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
while(L)
{
Dplyone(L);
L=L->next;
}
}
return;
}
voidConditionDiy(PerNode*L9)
{
charm;
PerNode*L=L9->next;
if(!
L)printf("\n系统中暂无任何信息!
");
else
{
printf("\n是否按学号升序显示,输入Y显示,N降序显示:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
printf("\n");
if(m=='Y'||m=='y')
Display(L9);
else
{
printf("\n学生成绩系统中信息如下:
\n");
printf("\n\n姓名学号科一分数科二分数科三分数总分平均分\n");
while(L->next){L=L->next;}
do
{
Dplyone(L);
L=L->prior;
}while(L->prior);
}
}
}
voidSave(PerNode*L10)
{
ints=0;
charm;
PerNode*L=L10->next;
FILE*txl;
printf("\n是否确定存盘,输入Y确定,N退出存盘:
\n");
do{m=getche();
}while(m!
='Y'&&m!
='N'&&m!
='y'&&m!
='n');
if((m=='Y')||(m=='y'))
{
while(L)
{L=L->next;s++;}
if(s)
{
if((txl=fopen("学生成绩管理系统.txt","w+"))==NULL)
{printf("\n文件打开失败!
");return;}
fprintf(txl,"%d",s);
L=L10->next;
while(L)
{Fpwrite(txl,L);L=L->next;}
printf("\n存盘成功!
\n");
fclose(txl);
}
elseprintf("\n存盘失败!
\n");
}
elsereturn;
return;
}
voidMenu(PerNode*H)
{
charm;
do{
system("cls");
printf("\n");
printf("|-----------------------|\n");
printf("|菜单|\n");
printf("|-----------------------|\n");
printf("|1--载入学生信息|\n");
printf("|2--创建学生信息|\n");
printf("|3--查找学生信息|\n");
printf("|4--条件查找学生信息|\n");
pr