c语言成绩统计系统.docx

上传人:b****7 文档编号:15491535 上传时间:2023-07-05 格式:DOCX 页数:26 大小:57.56KB
下载 相关 举报
c语言成绩统计系统.docx_第1页
第1页 / 共26页
c语言成绩统计系统.docx_第2页
第2页 / 共26页
c语言成绩统计系统.docx_第3页
第3页 / 共26页
c语言成绩统计系统.docx_第4页
第4页 / 共26页
c语言成绩统计系统.docx_第5页
第5页 / 共26页
c语言成绩统计系统.docx_第6页
第6页 / 共26页
c语言成绩统计系统.docx_第7页
第7页 / 共26页
c语言成绩统计系统.docx_第8页
第8页 / 共26页
c语言成绩统计系统.docx_第9页
第9页 / 共26页
c语言成绩统计系统.docx_第10页
第10页 / 共26页
c语言成绩统计系统.docx_第11页
第11页 / 共26页
c语言成绩统计系统.docx_第12页
第12页 / 共26页
c语言成绩统计系统.docx_第13页
第13页 / 共26页
c语言成绩统计系统.docx_第14页
第14页 / 共26页
c语言成绩统计系统.docx_第15页
第15页 / 共26页
c语言成绩统计系统.docx_第16页
第16页 / 共26页
c语言成绩统计系统.docx_第17页
第17页 / 共26页
c语言成绩统计系统.docx_第18页
第18页 / 共26页
c语言成绩统计系统.docx_第19页
第19页 / 共26页
c语言成绩统计系统.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

c语言成绩统计系统.docx

《c语言成绩统计系统.docx》由会员分享,可在线阅读,更多相关《c语言成绩统计系统.docx(26页珍藏版)》请在冰点文库上搜索。

c语言成绩统计系统.docx

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.ajd

break;

p=p->next;

}

if(n==0)

{

printf("没有符合条件的学生可以显示!

\n");

return;

}

printstart();

printc();

for(i=1;i<=n;i++)

{

printe(r);

r=r->next;

}

printstart();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2