C学生成绩的管理系统小学期课程设计报告.pdf

上传人:l*** 文档编号:71671946 上传时间:2023-02-04 格式:PDF 页数:22 大小:757.72KB
返回 下载 相关 举报
C学生成绩的管理系统小学期课程设计报告.pdf_第1页
第1页 / 共22页
C学生成绩的管理系统小学期课程设计报告.pdf_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《C学生成绩的管理系统小学期课程设计报告.pdf》由会员分享,可在线阅读,更多相关《C学生成绩的管理系统小学期课程设计报告.pdf(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-:学生成绩管理程序:学生成绩管理程序该程序是一个简单的学生成绩管理程序.它可以录入多个同学的根本情况:*、数学,英语,C 语言分数,同时还可以输出学生的平均,分总分,并且能够将所有学生的根本情况和各课的成绩作适当修改和删除以及统计与排名,同时能够将每个学生的成绩输出.一:数据构造设计及用法说明在整个程序中采用了多种数据构造,包括有根本类型中的:1:整型 int、char、long。2:浮点型:double、float。3:导出类型:指针、数组、构造struct,链表。程序中的几个主要的构造:void main()int mm;for(;1;)printf(请输入密码n);scanf(%d,&

2、mm);if(mm=123)break;elseprintf(密码错误;请重输入密码n);Link l;/*定义链表*/FILE*fp;/*文件指针*/int select;/*保存选择结果变量*/char ch;/*保存(y,Y,n,N)*/int count=0;/*保存文件中的记录条数或结点个数*/Node*p,*r;/*定义记录指针变量*/l=(Node*)malloc(sizeof(Node);if(!l)printf(n 内存分配失败);/*如没有申请到,打印提示信息*/return;/*返回主界面*/l-ne*t=NULL;r=l;fp=fopen(C:student,ab+);

3、/*以追加方式翻开一个二进制文件,可读可写,假设.z.-此文件不存在,会创立此文件*/if(fp=NULL)printf(n=无法翻开文件!n);e*it(0);while(!feof(fp)p=(Node*)malloc(sizeof(Node);if(!p)printf(memory malloc failure!n);/*没有申请成功*/e*it(0);/*退出*/if(fread(p,sizeof(Node),1,fp)=1)/*一次从文件中读取一条学生成绩记录*/p-ne*t=NULL;r-ne*t=p;r=p;/*r 指针向后移一个位置*/count+;fclose(fp);/*关

4、闭文件*/printf(n=翻开文件成功,共记录的数目:%d.n,count);menu();while(1)system(cls);menu();p=r;printf(n请输入您的选择(09):);/*显示提示信息*/scanf(%d,&select);if(select=0)if(saveflag=1)/*假设对链表的数据有修改且未进展存盘操作,则此标志为 1*/getchar();printf(n=是否保存修改记录文件(y/n):);.z.-scanf(%c,&ch);if(ch=y|ch=Y)Save(l);printf(=谢谢使用!);getchar();break;switch(s

5、elect)case 1:Add(l);break;/*增加学生记录*/case 2:Del(l);break;/*删除学生记录*/case 3:Qur(l);break;/*查询学生记录*/case 4:Modify(l);break;/*修改学生记录*/case 5:Insert(l);break;/*插入学生记录*/case 6:Tongji(l);break;/*统计学生记录*/case 7:Sort(l);break;/*排序学生记录*/case 8:Save(l);break;/*保存学生记录*/case 9:system(cls);Disp(l);printf(按任何键返回);c

6、har a;scanf(%d,&a);break;/*显示学生记录*/default:Wrong();getchar();break;/*按键有误,必须为数值 0-9*/程序中建立了多个函数分别来完成每个所要求的功能:读文件和写文件函数,建链表函数,插入、修改和删除函数,排序、统计和输出函数.程序利用各个函数来完成前面要求所需要的功能。二:程序调用图:主函数 main密码验证1.输 入2删成绩除 成3查询成绩绩函数功能4修 改成绩8 保存成绩5插 入成绩.z.-6 统计7成 绩成绩排序9 显示成绩0 退出系统三:功能菜单#*菜单*;*1 输入成绩*2 删除成绩*3 查询成绩*4 修改成绩*5

7、插入成绩*6 统计成绩*7 成绩排序*8 保存成绩*9 显示成绩*0 退出系统#*四实验结果;见程序运行五:体会:做完这个 c 语言程序设计的作业,我学会了很多新知识,对c 语言有了更进一步的了解.开场时,我想用构造数组来做这个程序,但后来我发现用做它,修改数据和读取数据都显得很方便.于是,相比拟之下,我便选择了链表.编程时会遇到一些困难,最令人头疼的莫过于程序运行时出错了.有时 哪怕是一些很小的错误经常能导致难以预料到的后果,因此,编程时我尽量做到一丝不苟,不敢有丝毫疏忽.通过这次c语言编程的练习,我的编程水平有了进一步的提高,同时也使我对编程有了一个更清醒的了解和认识.六,程序。/密码 1

8、23#include stdio.h/*标准输入输出函数库*/#include stdlib.h/*标准函数库*/#include string.h/*字符串函数库*/#include conio.h/*屏幕操作函数库*/#defineHEADER1-学 生成 绩-n#define HEADER2|*|C 语言|数学|英语|总分|平均分|名次|n#define HEADER3|-|-|-|-|-|-|-|-|#define FORMAT|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|n#defineDATA.z.-p-data.num,p-data.name,p-d

9、ata.egrade,p-data.mgrade,p-data.cgrade,p-data.total,p-data.ave,p-data.mingci#define END-nint saveflag=0;/*是否需要存盘的标志变量*/*定义与学生有关的数据构造*/typedef struct student/*标记为 student*/char num10;/*/char name15;/*/int cgrade;/*C 语言成绩*/int mgrade;/*数学成绩*/int egrade;/*英语成绩*/int total;/*总分*/float ave;/*平均分*/int ming

10、ci;/*名次*/;/*定义每条记录或结点的数据构造,标记为:node*/typedef struct nodestruct student data;/*数据域*/struct node*ne*t;/*指针域*/Node,*Link;/*Node 为 node 类型的构造变量,*Link 为 node 类型的指针变量*/void menu()/*主菜单*/system(cls);/*调用 DOS 命令,清屏.与 clrscr()功能一样*/cprintf(学生成绩管理系统 n);cprintf(#*菜单*#n);cprintf(*1 输 入 成 绩*2 删 除 成 绩*n);cprintf(

11、*3 查 询 成 绩*4 修 改 成 绩*n);cprintf(*5 插 入 成 绩*6 统 计 成 绩*n);cprintf(*7 成 绩 排 序*8 保 存 成 绩*n);cprintf(*9 显 示 成 绩*0 退 出 系 统*n);.z.-cprintf(#*#n);/*cprintf()送格式化输出至文本窗口屏幕中*/void printheader()/*格式化输出表头*/printf(HEADER1);printf(HEADER2);printf(HEADER3);void printdata(Node*pp)/*格式化输出表中数据*/Node*p;p=pp;printf(FOR

12、MAT,DATA);void Wrong()/*输出按键错误信息*/printf(nnnnn*输入有错!按任意键继续!*n);getchar();void Nofind()/*输出未查找此学生的信息*/printf(n=没有找到这名学生!n);void Disp(Link l)/*显示单链表 l 中存储的学生记录,内容为 student 构造中定义的内容*/Node*p;p=l-ne*t;/*l 存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p)/*p=NULL,NUll 在 stdlib 中定义为 0*/printf(n=没有学生记录!n

13、);getchar();return;printf(nn);.z.-printheader();/*输出表格头部*/while(p)/*逐条输出链表中存储的学生信息*/printdata(p);p=p-ne*t;/*移动直下一个结点*/printf(HEADER3);getchar();/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容;nameornum保存按什么查找;在单链表 l 中查找;*/Node*Locate(Link l,char findmess,char nameornum)Node*r;if(strcmp(nameornu

14、m,num)=0)/*按*查询*/r=l-ne*t;while(r)if(strcmp(r-data.num,findmess)=0)/*假设找到 findmess 值的*/return r;r=r-ne*t;else if(strcmp(nameornum,name)=0)/*按*查询*/r=l-ne*t;while(r)if(strcmp(r-data.name,findmess)=0)/*假设找到 findmess 值的学生*/return r;r=r-ne*t;.z.-return 0;/*假设未找到,返回一个空指针*/*输入字符串,并进展长度验证(长度lens)printf(n 超过

15、所需长度!n);/*进展长度校验,超过 lens 值重新输入*/while(strlen(n)lens);strcpy(t,n);/*将输入的字符串拷贝到字符串 t 中*/*输入分数,0分数100|t100|tne*t;system(cls);Disp(l);/*先打印出已有的学生信息*/while(r-ne*t!=NULL)r=r-ne*t;/*将指针移至于链表最末尾,准备添加记录*/while(1)/*一次可输入多条记录,直至输入*为 0 的记录结点添加操作*/.z.-while(1)/*输入*,保证该*没有被使用,假设输入*为 0,则退出添加记录操作*/stringinput(num,1

16、0,输入按0返回菜单:);/*格式化输入*并检验*/flag=0;if(strcmp(num,0)=0)/*输入为 0,则退出添加操作,返回主界面*/return;s=l-ne*t;while(s)/*查询该*是否已经存在,假设存在则要求重新输入一个未被占用的*/if(strcmp(s-data.num,num)=0)flag=1;break;s=s-ne*t;if(flag=1)/*提示用户是否重新输入*/getchar();printf(=人数%s 是不存在的,再试一次?y/n:,num);scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn;els

17、ebreak;p=(Node*)malloc(sizeof(Node);/*申请内存空间*/if(!p)printf(n 内存分配失败);/*如没有申请到,打印提示信息*/return;/*返回主界面*/strcpy(p-data.num,num);/*将字符串 num 拷贝到 p-data.num 中*/.z.-stringinput(p-data.name,15,Name:);p-data.cgrade=numberinput(C 语言0-100:);/*输入并检验分数,分数必须在 0100之间*/p-data.mgrade=numberinput(数学 Score0-100:);/*输入

18、并检验分数,分数必须在 0100 之间*/p-data.egrade=numberinput(英语 Score0-100:);/*输入并检验分数,分数必须在 0100 之间*/p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade;/*计算总分*/p-data.ave=(float)(p-data.total/3);/*计算平均分*/p-data.mingci=0;p-ne*t=NULL;/*说明这是链表的尾部结点*/r-ne*t=p;/*将新建的结点参加链表尾部中*/r=p;saveflag=1;return;void Qur(Link

19、l)/*按*或*,查询学生记录*/int select;/*1:按*查,2:按*查,其他:返回主界面菜单*/char searchinput20;/*保存用户输入的查询内容*/Node*p;if(!l-ne*t)/*假设链表为空*/system(cls);printf(n=没有学生记录!n);getchar();return;system(cls);printf(n=1 按*搜寻=2 按名称搜索n);printf(please choice1,2:);scanf(%d,&select);if(select=1)/*按*查询*/stringinput(searchinput,10,输入现有的学生

20、*:);p=Locate(l,searchinput,num);/*在 l 中查找*为 searchinput 值的节点,并返回节点的.z.-指针*/if(p)/*假设 p!=NULL*/printheader();printdata(p);printf(END);printf(按任意键返回);getchar();elseNofind();getchar();else if(select=2)/*按*查询*/stringinput(searchinput,15,输入现有的学生*:);p=Locate(l,searchinput,name);if(p)printheader();printdat

21、a(p);printf(END);printf(按任意键返回);getchar();elseNofind();getchar();elseWrong();getchar();/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/void Del(Link l)int sel;.z.-Node*p,*r;char findmess20;if(!l-ne*t)system(cls);printf(n=没有该学生的记录n);getchar();return;system(cls);Disp(l);printf(n=1 按*删除=2 按*删除n);printf(请选择1,2:);scanf(

22、%d,&sel);if(sel=1)stringinput(findmess,10,输入现有的学生*:);p=Locate(l,findmess,num);if(p)/*p!=NULL*/r=l;while(r-ne*t!=p)r=r-ne*t;r-ne*t=p-ne*t;/*将 p 所指节点从链表中去除*/free(p);/*释放内存空间*/printf(n=删除成功!n);getchar();saveflag=1;elseNofind();getchar();else if(sel=2)/*先按*查询到该记录所在的节点*/stringinput(findmess,15,输入现有的学生*:)

23、;p=Locate(l,findmess,name);if(p).z.-r=l;while(r-ne*t!=p)r=r-ne*t;r-ne*t=p-ne*t;free(p);printf(n=删除成功!n);getchar();saveflag=1;elseNofind();getchar();elseWrong();getchar();/*修改学生记录。先按输入的*查询到该记录,然后提示用户修改*之外的值,*不能修改*/void Modify(Link l)Node*p;char findmess20;if(!l-ne*t)system(cls);printf(n=没有该学生记录!n);ge

24、tchar();return;system(cls);printf(修改学生记录);Disp(l);stringinput(findmess,10,input the e*isting student number:);/*输入并检验该*/p=Locate(l,findmess,num);/*查询到该节点*/if(p)/*假设 p!=NULL,说明已经找到该节点*/.z.-printf(Number:%s,n,p-data.num);printf(Name:%s,p-data.name);stringinput(p-data.name,15,输入新*:);printf(C 语言分数:%d,p-

25、data.cgrade);p-data.cgrade=numberinput(C 语言分数0-100:);printf(数学分数:%d,p-data.mgrade);p-data.mgrade=numberinput(数学分数0-100:);printf(英语分数:%d,p-data.egrade);p-data.egrade=numberinput(英语分数0-100:);p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade;p-data.ave=(float)(p-data.total/3);p-data.mingci=0;print

26、f(n=修改成功!n);Disp(l);saveflag=1;elseNofind();getchar();/*插入记录:按*查询到要插入的节点的位置,然后在该*之后插入一个新节点。*/void Insert(Link l)Link p,v,newinfo;/*p 指向插入位置,newinfo 指新插入记录*/char ch,num10,s10;/*s保存插入点位置之前的*,num保存输入的新记录的*/int flag=0;v=l-ne*t;system(cls);Disp(l);while(1)stringinput(s,10,请输入要输入插入的位置:);flag=0;v=l-ne*t;wh

27、ile(v)/*查询该*是否存在,flag=1 表示该*存在*/if(strcmp(v-data.num,s)=0)flag=1;break;v=v-ne*t;.z.-if(flag=1)break;/*假设*存在,则进展插入之前的新记录的输入操作*/else getchar();printf(n=*%s 是不存在的,再试一次吗?(y/n):,s);scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn;/*以下新记录的输入操作与 Add()一样*/stringinput(num,10,输入新*:);v=l-ne*t;while(v)if(strcmp(v

28、-data.num,num)=0)printf(=对不起,新的*%s 已存在!n,num);printheader();printdata(v);printf(n);getchar();return;v=v-ne*t;newinfo=(Node*)malloc(sizeof(Node);if(!newinfo)printf(n allocate memory failure);/*如没有申请到,打印提示信息*/return;/*返回主界面*/strcpy(newinfo-data.num,num);stringinput(newinfo-data.name,15,Name:);.z.-newi

29、nfo-data.cgrade=numberinput(C 语言分数0-100:);newinfo-data.mgrade=numberinput(数学分数0-100:);newinfo-data.egrade=numberinput(英语分数0-100:);newinfo-data.total=newinfo-data.egrade+newinfo-data.cgrade+newinfo-data.mgrade;newinfo-data.ave=(float)(newinfo-data.total/3);newinfo-data.mingci=0;newinfo-ne*t=NULL;save

30、flag=1;/*在 main()有对该全局变量的判断,假设为 1,则进展存盘操作*/*将指针赋值给 p,因为 l 中的头节点的下一个节点才实际保存着学生的记录*/p=l-ne*t;while(1)if(strcmp(p-data.num,s)=0)/*在链表中插入一个节点*/newinfo-ne*t=p-ne*t;p-ne*t=newinfo;break;p=p-ne*t;Disp(l);printf(nn);getchar();/*统计该班的总分第一名和单科第一,和各科不及格人数*/void Tongji(Link l)Node*pm,*pe,*pc,*pt;/*用于指向分数最高的节点*/

31、Node*r=l-ne*t;int countc=0,countm=0,counte=0;/*保存三门成绩中不及格的人数*/if(!r)system(cls);printf(n=没有学生记录!n);getchar();return;system(cls);.z.-Disp(l);pm=pe=pc=pt=r;while(r)if(r-data.cgradedata.mgradedata.egradedata.cgrade=pc-data.cgrade)pc=r;if(r-data.mgrade=pm-data.mgrade)pm=r;if(r-data.egrade=pe-data.egrade

32、)pe=r;if(r-data.total=pt-data.total)pt=r;r=r-ne*t;printf(n-统计学生记录-n);printf(C 语言60:%d 人n,countc);printf(数学60:%d 人n,countm);printf(英语data.name,pt-data.total);printf(英语最高分:%s totoal score:%dn,pe-data.name,pe-data.egrade);printf(数学最高分:%s totoal score:%dn,pm-data.name,pm-data.mgrade);printf(C 语言最高分:%s t

33、otoal score:%dn,pc-data.name,pc-data.cgrade);printf(nnpress any key to return);getchar();/*利用插入排序法实现单链表的按总分字段的降序排序,从高到低*/void Sort(Link l)Link ll;Node*p,*rr,*s;int i=0;if(l-ne*t=NULL)system(cls);printf(n=没有学生记录!n);getchar();return;.z.-ll=(Node*)malloc(sizeof(Node);/*用于创立新的节点*/if(!ll)printf(n 内存分配失败)

34、;/*如没有申请到,打印提示信息*/return;/*返回主界面*/ll-ne*t=NULL;system(cls);Disp(l);/*显示排序前的所有学生记录*/p=l-ne*t;while(p)/*p!=NULL*/s=(Node*)malloc(sizeof(Node);/*新建节点用于保存从原链表中取出的节点信息*/if(!s)/*s=NULL*/printf(n 内存分配失败);/*如没有申请到,打印提示信息*/return;/*返回主界面*/s-data=p-data;/*填数据域*/s-ne*t=NULL;/*指针域为空*/rr=ll;/*rr 链表于存储插入单个节点后保持排序

35、的链表,ll 是这个链表的头指针,每次从头开场查找插入位置*/while(rr-ne*t!=NULL&rr-ne*t-data.total=p-data.total)rr=rr-ne*t;/*指针移至总分比 p 所指的节点的总分小的节点位置*/if(rr-ne*t=NULL)/*假设新链表 ll 中的所有节点的总分值都比 p-data.total 大时,就将 p 所指节点参加链表尾部*/rr-ne*t=s;else/*否则将该节点插入至第一个总分字段比它小的节点的前面*/s-ne*t=rr-ne*t;rr-ne*t=s;p=p-ne*t;/*原链表中的指针下移一个节点*/l-ne*t=ll-n

36、e*t;/*ll 中存储是的已排序的链表的头指针*/p=l-ne*t;/*已排好序的头指针赋给 p,准备填写名次*/.z.-while(p!=NULL)/*当 p 不为空时,进展以下操作*/i+;/*结点序号*/p-data.mingci=i;/*将名次赋值*/p=p-ne*t;/*指针后移*/Disp(l);saveflag=1;printf(n=排序完成!n);/*数据存盘,假设用户没有专门进展此操作且对数据有修改,在退出系统时,会提示用户存盘*/void Save(Link l)FILE*fp;Node*p;int count=0;fp=fopen(c:student,wb);/*以只写

37、方式翻开二进制文件*/if(fp=NULL)/*翻开文件失败*/printf(n=翻开文件错误!n);getchar();return;p=l-ne*t;while(p)if(fwrite(p,sizeof(Node),1,fp)=1)/*每次写一条记录或一个节点信息至文件*/p=p-ne*t;count+;elsebreak;.z.-if(count0)getchar();printf(nnnnn=保存文件的完整,总储存的记录数:%dn,count);getchar();saveflag=0;elsesystem(cls);printf(目前的是空的,没有学生记录保存!n);getchar(

38、);fclose(fp);/*关闭此文件*/void main()int mm;for(;1;)printf(请输入密码n);scanf(%d,&mm);if(mm=123)break;elseprintf(密码错误;请重输入密码n);Link l;/*定义链表*/FILE*fp;/*文件指针*/int select;/*保存选择结果变量*/char ch;/*保存(y,Y,n,N)*/int count=0;/*保存文件中的记录条数或结点个数*/Node*p,*r;/*定义记录指针变量*/l=(Node*)malloc(sizeof(Node);if(!l)printf(n 内存分配失败);

39、/*如没有申请到,打印提示信息*/return;/*返回主界面*/l-ne*t=NULL;.z.-r=l;fp=fopen(C:student,ab+);/*以追加方式翻开一个二进制文件,可读可写,假设此文件不存在,会创立此文件*/if(fp=NULL)printf(n=无法翻开文件!n);e*it(0);while(!feof(fp)p=(Node*)malloc(sizeof(Node);if(!p)printf(memory malloc failure!n);/*没有申请成功*/e*it(0);/*退出*/if(fread(p,sizeof(Node),1,fp)=1)/*一次从文件中

40、读取一条学生成绩记录*/p-ne*t=NULL;r-ne*t=p;r=p;/*r 指针向后移一个位置*/count+;fclose(fp);/*关闭文件*/printf(n=翻开文件成功,共记录的数目:%d.n,count);menu();while(1)system(cls);menu();p=r;printf(n请输入您的选择(09):);/*显示提示信息*/scanf(%d,&select);if(select=0)if(saveflag=1)/*假设对链表的数据有修改且未进展存盘操作,则此标志为 1*/.z.-getchar();printf(n=是否保存修改记录文件(y/n):);s

41、canf(%c,&ch);if(ch=y|ch=Y)Save(l);printf(=谢谢使用!);getchar();break;switch(select)case 1:Add(l);break;/*增加学生记录*/case 2:Del(l);break;/*删除学生记录*/case 3:Qur(l);break;/*查询学生记录*/case 4:Modify(l);break;/*修改学生记录*/case 5:Insert(l);break;/*插入学生记录*/case 6:Tongji(l);break;/*统计学生记录*/case 7:Sort(l);break;/*排序学生记录*/case 8:Save(l);break;/*保存学生记录*/case 9:system(cls);Disp(l);printf(按任何键返回);char a;scanf(%d,&a);break;/*显示学生记录*/default:Wrong();getchar();break;/*按键有误,必须为数值 0-9*/.z.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com