c语言成绩统计系统.docx
《c语言成绩统计系统.docx》由会员分享,可在线阅读,更多相关《c语言成绩统计系统.docx(26页珍藏版)》请在冰点文库上搜索。
c语言成绩统计系统
C语言成绩统计系统
#include
#include
#include
intshoudsave=0;/*为后面判断是否改动资料做铺垫*/
structstudent
{
charnum[11];/*学号*/
charname[20];
intcgrade;
intmgrade;
integrade;
inttotle;
intave;
floatajd;//平均绩点
};
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
voidmenu()
{
printf("********************************************************************************");
printf("\t1输入学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5显示学生资料\t\t\t\t\t6统计学生成绩\n");
printf("\t7排序学生成绩\t\t\t\t\t8保存学生资料\n");
printf("\t9获取帮助信息\t\t\t\t\t0退出系统\n");
printf("********************************************************************************\n");
}
voidprintstart()
{
printf("--------------------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()
{
printf("\n=====>提示:
没有找到该学生!
\n");
}
voidprintc()/*本函数用于输出中文标题*/
{
printf("学号\t姓名英语成绩数学成绩C语言成绩总分平均分平均绩点\n");
}
voidprinte(Node*p)/*本函数用于输出中文标题下的具体内容*/
{
printf("%-12s%s\t%d\t%d\t%d\t%d\t%d\t%2.1f\n",p->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave,p->data.ajd);
}
Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位连表中符合要求的接点,并返回该指针*/
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
floatjd(Node*p)
{
intb[3],i;
floatsum=0.0,a;
b[0]=p->data.cgrade;b[1]=p->data.mgrade;b[2]=p->data.egrade;
for(i=0;i<=2;i++)
{
if(b[i]>=90)a=5.0;
elseif(b[i]>=85)a=4.5;
elseif(b[i]>=80)a=4.0;
elseif(b[i]>=75)a=3.5;
elseif(b[i]>=70)a=3.0;
elseif(b[i]>=65)a=2.5;
elseif(b[i]>=60)a=2.0;
elsea=0.0;
sum+=a;
}
returnsum/3;
}
voidAdd(Linkl)/*增加学生*/
{
Node*p,*r,*s;
charnum[11];
r=l;
s=l->next;
while(r->next!
=NULL)
r=r->next;
while
(1)
{
k0:
printf("请你输入学号(以'0'返回上一级菜单)");
scanf("%s",num);
getchar();
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:
学号为'%s'的学生已经存在,若要修改请你选择'4'修改!
\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node*)malloc(sizeof(Node));
strcpy(p->data.num,num);
k1:
printf("请你输入姓名(以'101'返回主菜单,'102'返回上一级菜单):
");
scanf("%s",p->data.name);
getchar();//程序暂停等待输入
if(strcmp(p->data.name,"101")==0)
{
free(p);
return;
}
elseif(strcmp(p->data.name,"102")==0)
gotok0;
k2:
printf("请你输入c语言成绩(以'101'返回主菜单,'102'返回上一级菜单):
");
scanf("%d",&p->data.cgrade);
getchar();
if(p->data.cgrade==101)
{
free(p);//释放内存
return;
}
elseif(p->data.cgrade==102)//此处内存不能释放
gotok1;//虽然102被输入c语言成绩,但会再次输入将其覆盖
k3:
printf("请你输入数学成绩(以'101'返回主菜单,'102'返回上一级菜单):
");
scanf("%d",&p->data.mgrade);
getchar();
if(p->data.mgrade==101)
{
free(p);
return;
}
elseif(p->data.mgrade==102)
gotok2;
K4:
printf("请你输入英语成绩(以'101'返回主菜单,'102'返回上一级菜单):
");
scanf("%d",&p->data.egrade);
getchar();
if(p->data.egrade==101)
{
free(p);
return;
}
elseif(p->data.egrade==102)
gotok3;
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;p->data.ajd=jd(p);/*信息输入已经完成*/
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;//为后面改动数据判断做铺垫
}
}
voidQur(Linkl)/*查询学生*/
{
intsel;
charfindmess[20];
Node*p;
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以查询!
\n");
return;
}
a0:
printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/*学号*/
{
printf("请你输入要查找的学号(以'0'返回主菜单,'1'返回上一级菜单):
");
scanf("%s",findmess);
if(strcmp(findmess,"1")==0)
gotoa0;
elseif(strcmp(findmess,"0")==0)
return;
else
{
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
}
elseif(sel==2)/*姓名*/
{
printf("请你输入要查找的姓名(以'0'返回主菜单,'1'返回上一级菜单):
");
scanf("%s",findmess);
if(strcmp(findmess,"0")==0)
return;
elseif(strcmp(findmess,"1")==0)
gotoa0;
else
{
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
}
else
Wrong();
}
voidDel(Linkl)/*删除*/
{
voidSave(Linkl);
intsel;
Node*p,*r,*d=NULL,*j=NULL;
charfindmess[20],ch;
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以删除!
\n");
return;
}
k:
printf("\n=====>1按学号删除\n=====>2按姓名删除\n=====>3全部删除\n=====>0返回上一级菜单\n");
scanf("%d",&sel);
if(sel==0)
return;
if(sel==3)
{
k1:
printf("========》确认全部删除(y/n)?
\n");
getchar();
scanf("%c",&ch);
if(ch=='y')
{
d=l->next;
while(d)
{j=d;
d=d->next;
free(j);
}
l->next=NULL;
printf("数据已清空!
");
Save(l);
return;
}
elseif(ch=='n')
{
gotok;
}
else
{
printf("输入错误!
");
gotok1;
}
}
if(sel==1)
{
printf("请你输入要删除的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(!
p)
{
do
{
printf("您输入的学号不存在,请重新输入");//当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台
scanf("%s",findmess);
p=Locate(l,findmess,"num");
}while(p==NULL);
}
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:
该学生已经成功删除!
\n");
Save(l);//======
shoudsave=1;
}
}
elseif(sel==2)
{
printf("请你输入要删除的姓名:
");//待改动、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(!
p)
{
do{printf("请重新输入");//当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台
scanf("%s",findmess);
p=Locate(l,findmess,"name");
}while(p==NULL);
}
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:
该学生已经成功删除!
\n");
Save(l);
shoudsave=1;
}
}
else
Wrong();
}
voidModify(Linkl)//修改学生资料
{
Node*p;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以修改!
\n");
return;
}
c0:
printf("请你输入要修改的学生学号(以'0'返回主菜单):
");
scanf("%s",findmess);
if(strcmp(findmess,"0")==0)
return;
p=Locate(l,findmess,"num");
if(p)
{
c1:
printf("请你输入新的c语言成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
if(p->data.cgrade==101)
return;
elseif(p->data.cgrade==102)
gotoc0;
c2:
printf("请你输入新的英语成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):
",p->data.egrade);
scanf("%d",&p->data.egrade);
if(p->data.egrade==101)
return;
elseif(p->data.egrade==102)
gotoc1;
printf("请你输入新的高数成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
if(p->data.mgrade==101)
return;
elseif(p->data.mgrade==102)
gotoc2;
p->data.totle=p->data.cgrade+p->data.egrade+p->data.mgrade;
p->data.ave=p->data.totle/3.0;
printf("\n=====>提示:
资料修改成功!
\n");
shoudsave=1;
}
else
Nofind();
}
voidDisp(Linkl)//显示学生资料
{
intcount=0;
Node*p;
p=l->next;
if(!
p)
{
printf("\n=====>提示:
没有资料可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
Node*select_order(Node*head,inta)//排序学生资料
{
Node*first;/*排列后有序链的表头指针*/
Node*tail;/*排列后有序链的表尾指针*/
Node*p_min;/*保留键值更小的节点的前驱节点的指针*/
Node*min;/*存储最小节点*/
Node*p;/*当前比较的节点*/
floatbj;
first=NULL;//带存入有序数据的链表
while(head!
=NULL)/*在原链表中找键值最小的节点。
*/
{
/*注意:
这里for语句就是体现选择排序思想的地方*/
for(p=head,min=head;p->next!
=NULL;p=p->next)/*循环遍历链表中的节点,找出此时最小的节点。
*/
{
if(a==1)bj=strcmp(p->next->data.num,min->data.num);
if(a==2)bj=min->data.ajd-p->next->data.ajd;
if(bj<0.0)/*找到一个比当前min小的节点。
*/
{
p_min=p;/*保存找到节点的前驱节点:
显然p->next的前驱节点是p。
*/
min=p->next;/*保存键值更小的节点。
*/
}
}
/*上面for语句结束后,就要做两件事;一是把它放入新的有序链表中;二是根据相应的条件判断,安排它离开原来输入的链表*/
/*第一件事*/
if(first==NULL)/*如果有序链表目前还是一个空链表*/
{
first=min;/*第一次找到键值最小的节点。
*/
tail=min;/*注意:
尾指针让它指向最后的一个节点。
*/
}
else/*有序链表中已经有节点*/
{
tail->next=min;/*把刚找到的最小节点放到最后,即让尾指针的next指向它。
*/
tail=min;/*尾指针也要指向它。
*/
}
/*第二件事*/
if(min==head)/*如果找到的最小节点就是第一个节点*/
{
head=head->next;/*显然让head指向原head->next,即第二个节点,就OK*/
}
else/*如果不是第一个节点*/
{
p_min->next=min->next;/*前次最小节点的next指向当前min的next,这样就让min离开了原链表。
*/
}
}
if(first!
=NULL)/*循环结束得到有序链表first*/
{
tail->next=NULL;/*单向链表的最后一个节点的next应该指向NULL*/
}
head=first;
returnhead;
}
voidSave(Linkl)//保存学生资料
{
FILE*fp;
Node*p;
intflag=1,count=0;//记录写入数据个数
fp=fopen("c:
\\student","wb");
if(fp==NULL)
{
printf("\n=====>提示:
重新打开文件时发生错误!
\n");
exit
(1);//异常退出
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n=====>提示:
文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
LinkOrder(Linkl)
{
Node*a;
inti;
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以排序!
\n");
return;
}
printf("\n----->1按学号排序\n----->2按平均绩点排序\n");
scanf("%d",&i);
a=l->next=select_order(l->next,i);
printstart();
if(l)
printc();
while(a->next!
=NULL)
{
printe(a);
a=a->next;
}
while(a->next!
=NULL)a=a->next;
printe(a);
printstart();
returnl->next;
}
voidsx(Linkl)
{
}
voidChoose(Linkl)
{
inta=2,n=0,i;
floatt;
Linkp,r;
r=p=l->next=select_order(l->next,a);
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以排序!
\n");
return;
}
printf("=====>提示:
请输入你的筛选标准(绩点):
");
scanf("%f",&t);
while(p)
{
if(p->data.ajd>=t)
n+=1;
if(p->data.ajdbreak;
p=p->next;
}
if(n==0)
{
printf("没有符合条件的学生可以显示!
\n");
return;
}
printstart();
printc();
for(i=1;i<=n;i++)
{
printe(r);
r=r->next;
}
printstart();
}