C语言学生成绩管理.doc
攀枝花学院学生课程设计(论文)题 目: 学生成绩管理 学生姓名: 王世奎 学 号: 200810804029 所在院(系): 计算机学院 专 业: 软件工程 班 级: 指 导 教 师: 张 会 职称: 讲师 2009年12月30日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书题目学生成绩管理1、课程设计的目的利用单链表实现学生成绩管理,了解数据库的管理的基本功能,使学生掌握C语言中的结构体、指针、函数(系统函数,自定义函数)、文件操作等知识,是一个C语言的综合应用。应注意指针变量做为函数参数,函数返回值为指向结构体的指针及单链表结构的应用等知识。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)一、用C中的单链表存储结构完成对学生成绩的动态管理,其基本内容和要求包括:(1) 菜单设计(2) 输入成绩(3) 查询(4) 修改成绩(5) 删除成绩(6) 成绩排序(7) 将成绩保存在文件中二、撰写课程设计报告或课程设计总结课程设计报告要求:总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。3、主要参考文献4、课程设计工作进度计划课程设计时间为两周,分四个阶段完成:1. 分析设计阶段。引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。这一阶段前第1天完成。2. 编码调试阶段:根据设计分析方案编写C语言代码,然后调试该代码,实现课题要求的功能。这一阶段在第2-3天完成。3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。这一阶段在第4-5天完成。4. 考核阶段。这一阶段在第5天完成。指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日注:任务书由指导教师填写。课程设计(论文)指导教师成绩评定表题目名称电话簿管理评分项目分值得分评价内涵工作表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03课题工作量7按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07计算及计算机应用能力5具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)10具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度5符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新10对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日目录摘 要11引言11.1问题的提出11.2学生成绩管理12系统分析12.1功能需求22.2总体要求22.3所建的函数模块23 程序设计33.1程序功能构架33.2主要函数33.3程序分析43.3.1结构体和全局变量定义43.3.2成绩录入功能模块43.3.3成绩查询功能模块73.3.4修改指定成绩模块123.3.5 成绩删除模块163.3.6成绩排序模块193.3.7求平均值模块223.3.8打印成绩模块233.3.9主函数244 程序运行264.1 录入成绩274.2 成绩查询304.3 修改成绩324.4 删除成绩344.5 成绩排序354.6算平均成绩364.7打印成绩375心得体会37参考文献38摘 要本次课程设计的题目是“学生成绩管理”,该管理系统的目的是能够实现基本的学生成绩管理功能(录入新成绩,按姓名和学号查询成绩,删除指定学号的成绩,成绩排序,求平均成绩等)。本系统设置了桌面菜单进行各种操作,并有详细的操作提示语。整个程序设计模块化,并严格依据以设计的模块和主控框架设计功能模块函数。关键字:C程序 学生成绩管理 函数1引言1.1问题的提出学校每次考完试后,老师都会对班的的成绩进行排序,计算每个学生的总成绩和各科的总成绩,如果用笔来计算相当麻烦,因此有必要设计一个学生成绩管理系统来对学生成绩进行管理,使老师在计算成绩变得轻松。本次设计的成绩管理系统只是实现了一些简单常用的功能,创建成绩录入,查询,修改,排序,求平均成绩等功能。1.2学生成绩管理方便老师考试过会处理成绩软件程序。通过使用学生成绩管理软件,老师们可以轻松的求平均成绩,对学生排名次,查询学生的各科成绩。该学生成绩管理系统由程序模块组成,通过主函数调用各个功能模块来实现对学生成绩的管理功能。2系统分析本次设计的学生成绩管理系统的设计思想首先需要实现对学生成绩的管理功能,可以对成绩进行有效的处理,如添加、修改、删除、查找等功能。适当的设置界面,加入详细的提示语,供老师使用。为了容易让人理解,分为不同的函数实现不同的功能。最后,再在主函数中调用建立的各种的函数模块。用C语言编写相应的程序、运行、调试,直到正确的实现相关的功能。2.1功能需求本次通过学生成绩管理系统,主要实现以下功能:(1) 录入新的学生成绩信息。(2) 增加记录的修改功能,允许修改学生的各科成绩。(3) 设计一函数将指定学号的成绩从成绩表中删除(4) 设计一函数实现显示全部学生的各科成绩。(5) 设计一函数实现查询,查询分为按姓名查询和按学号查询。(6) 可以做到很容易的返回和退出。2.2总体要求用C实现一个学生成绩管理小程序。具有加入、删除、显示和查询学生成绩的功能。为了让人能清楚明白的使用,设计桌面菜单和附加详细的操作提示语。2.3所建的函数模块 (1)录入新成绩; (2)查询学生成绩; (3)修改学生成绩; (4)删除学生成绩; (5)显示所有记录; (6)排名次; (7)求平均成绩3 程序设计3.1程序功能构架学生成绩管理系统打印成绩平均成绩成绩排序删除成绩修改成绩成绩查询录入成绩退出系统修改语文成绩修改数学成绩按学号查询按姓名查询修改英语成绩修改物理成绩修改化学成绩修改生物成绩3.2主要函数主函数 void main()成绩录入函数 input()成绩查询函数 search()成绩删除函数 del()成绩排序函数 paixu()求平均成绩函数 pingjun()打印成绩函数 print() 读入成绩表函数 read() 判断成绩表是否为空函数 decide()3.3程序分析#include <stdio.h> /*标准输入输出函数定义*/#include <stdlib.h> /*动态存储分配函数定义*/#include <malloc.h> /*动态存储分配函数定义*/#include <string.h> /*字符和字符串函数定义*/3.3.1结构体和全局变量定义typedef struct STint x;char nummber20;char name20;float yuwen,math,yingyu,wuli,huaxu,shengwu,total;struct ST *next;st;分析:定义了ST结构体,包含字符串数组name、nummber,浮点型变量yuwen,math,yingyu,wuli,huaxu,shengwu,total和一个指向结构体变量的指针变量next。3.3.2成绩录入功能模块分析:此函数的功能是录入学生成绩信息,录入时按提示输入学生的学号,姓名和各科成绩,完成后提示保存还是继续录入,若选择保存,则在屏幕在显示输入的记录,并提示是否写入成绩表中。代码如下:void input() /*成绩录入函数*/int n=1,k,x;char ch;st *p,*l,*s;float yuwen,math,yingyu,wuli,huaxu,shengwu;char nummber20,name20;FILE *fp,*fp1;if(fp=fopen("a.txt","a+")=NULL)printf("打开a.txt文件出错!");if(fp1=fopen("xuhao.txt","r")=NULL)printf("打开xuhao.txt文件出错!");fscanf(fp1,"%d",&x);fclose(fp1);l=(st *)malloc(sizeof(st);s=l;while(n) /*录入学生学号,姓名,各科成绩,存到链表l中*/printf("请输入学号:");scanf("%s",nummber);printf("请输入姓名:");scanf("%s",name);printf("请输入语文成绩:");scanf("%f",&yuwen);printf("请输入数学成绩:");scanf("%f",&math);printf("请输入英语成绩:");scanf("%f",&yingyu);printf("请输入物理成绩:");scanf("%f",&wuli);printf("请输入化学成绩:");scanf("%f",&huaxu);printf("请输入生物成绩:");scanf("%f",&shengwu);p=(st *)malloc(sizeof(st);strcpy(p->nummber,nummber);strcpy(p->name,name);p->yuwen=yuwen;p->math=math;p->yingyu=yingyu;p->wuli=wuli;p->huaxu=huaxu;p->shengwu=shengwu;p->total=p->huaxu+p->math+p->shengwu+p->wuli+p->yingyu+p->yuwen; /*计算总成绩*/p->x=+x;s->next=p;s=p;p->next=NULL;printf("任意键继续,0保存:");scanf("%c",&ch);scanf("%c",&ch);if(ch='0') n=0;if(fp1=fopen("xuhao.txt","w+")=NULL)printf("打开xuhao.txt文件出错!");fprintf(fp1,"%d",x); /*将序号写入序号表中*/fclose(fp1);printf("录入信息如下:n");printf(" 学号 姓名 语文 数学 英语 物理 化学 生物 总成绩n");printf("*nn");p=l->next;while(p!=NULL) /*打印出输入信息,确认保存*/ printf("%s %-8s%-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2fn",p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;printf("确认录入请按1,取消请按0:");scanf("%d",&k);if(k=1)p=l->next;while(p!=NULL) /*写入成绩表*/fprintf(fp,"%d %s %s %.2f %.2f %.2f %.2f %.2f %.2f %.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;fclose(fp);printf("录入成功!n");printf("任意键返回n");getchar();getchar(); /*函数到此结束*/3.3.3成绩查询功能模块 分析:此模块的功能是执行学生成绩查询操作。包含search()、serachname()、aerachnummber()函数。3.3.3.1 查询方式菜单 分析:此函数的功能是让用户选择查询成绩的方式,search()函数调用decide()函数判断成绩表是否为空,不为空则进入查询菜单,提示用户选择查询方式,为空则给出提示并返回到主函数。代码如下:void search() /*查询函数*/int n=1,k,i=1;st *l;i=decide();if(i)l=read();while(n) /*查询菜单*/printf("-查询方式-nn");printf(" 1 姓名 n");printf(" 2 学号 n");printf(" 3 返回 n");printf("-n");printf("请选择:");scanf("%d",&k);switch(k)case 1:serachname(l);break;case 2:serachnummber(l);break;case 3:n=0;break;default :printf("输入错误,请重新输入:n");else /*成绩表为空,返回*/printf("学生成绩数据库为空,请录入!n");printf("任意健返回");getchar(); /*函数到此结束*/3.3.3.2 按姓名查询分析:此函数的功能是按姓名查询成绩。函数serachname()调read()函数,read()将学生成绩保存在链表l中,并将l指针返回给serachname(),遍历链表,查找与输入姓名匹配的结,查找成功则打印出相关信息,不成功则提示用户无此学生的记录。代码如下:void serachname(st *l) /*按姓名查询函数*/char ch;char name20;st *p;int n=1,k=0;while(n)printf("请输入姓名:");scanf("%s",name);printf("正在查询,请稍等nn");printf("名次 学号 姓名 语文 数学 英语 物理 化学 生物 总成绩n");printf("*nn");p=l->next;while(p!=NULL) /*若查询成功,打印出学生信息*/if(strcmp(p->name,name)=0)k+;printf("%-4d %s %-8s%-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;if(k>0)printf("*n");printf("查询完成!共找到%d条记录。",k);elseprintf("n查询完成!无相关记录。n");printf("1继续,0返回:");scanf("%c",&ch);scanf("%c",&ch);if(ch!='1') n=0;/*函数到此结束*/3.3.3.3 按学号查询分析:此函数的功能是按学号查询成绩。函数serachnummber()调read()函数将学生成绩保存在链表l中,并将l指针返回给serachnummber(),遍历链表,查找与输入姓名匹配的结,查找成功则打印出相关信息,不成功则提示用户无此学生的记录。代码如下:void serachnummber(st *l) /*按学号查询函数*/char ch;char nummber20;st *p;int n=1,k=0;while(n)printf("请输入学号:");scanf("%s",nummber);printf("正在查询,请稍等nn");printf("名次 学号 姓名 语文 数学 英语 物理 化学 生物 总成绩n");printf("*nn");p=l->next;while(p!=NULL) /*若查询成功,打印出学生信息*/if(strcmp(p->nummber,nummber)=0)k+;printf("%-4d %s %-8s%-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;if(k>0)printf("*n");printf("n查询完成!共找到%d条记录。",k);elseprintf("n查询完成!无相关记录。n");printf("1继续,0返回:");scanf("%c",&ch);scanf("%c",&ch);if(ch!='1') n=0;/*函数到此结束*/3.3.4修改指定成绩模块 分析:此模块的功能是修改指定学生的成绩包含change()、changes()、write()函数。3.3.4.1成绩修改菜单 分析:此函数的功能是让用户选择要修改的课程,change()函数调用read()函数,read()将成绩表保存在链表l 中,并将指针l返回给change(),提示用户输入要修改的学号,遍历链表查找匹配的结点,查找成功则进入成绩修改函数changes(),失败则提示无此学生的记录。代码如下:void change() /*成绩修改不函数*/char nummber13;int n=1,k,m=0,i;st *l,*p,*s;k=decide();if(k)printf("请输入学号:");scanf("%s",nummber);l=read();p=l->next;while(p!=NULL)if(strcmp(p->nummber,nummber)=0)printf("学生成绩如下:n");printf("名次 学号 姓名 语文 数学 英语 物理 化学 生物 总成绩n");printf("*nn");printf("%-4d %s %-8s%-5.2f %-5.2f %-5.2f %-5.2f %-5.2f%-5.2f %-5.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);m=1;s=p;p=p->next;if(m)while(n) /*成绩修改主菜单*/printf("-学生成绩管理系统-nn");printf(" 1 修改语文成绩 n");printf(" 2 修改数学成绩 n");printf(" 3 修改英语成绩 n");printf(" 4 修改物理成绩 n");printf(" 5 修改化学成绩 n");printf(" 6 修改生物成绩 n");printf(" 7 返回主菜单 n");printf("-n");printf("输入1-7修改对应成绩:");scanf("%d",&i);switch(i)case 1:changes(s,1);break;case 2:changes(s,2);break;case 3:changes(s,3);break;case 4:changes(s,4);break;case 5:changes(s,5);break;case 6:changes(s,6);break;case 7:n=0;break;default :printf("输入错误!n");break;elseprintf("没有该学生的信息!n");printf("任意健返回");getchar();else /*成绩表为空,返回*/printf("学生成绩数据库为空,请录入!n");printf("任意健返回");getchar(); /*函数到此结束*/3.3.4.2成绩修改分析:此函数的功能是修改指定科目成绩。函数首先判断要修改的什么科目的成绩,然后调用write()修改相应科目成绩。代码如下:void changes(st *s,int i) /*成绩修改函数*/float soure;char num13;strcpy(num,s->nummber);printf("请输入新的成绩:");scanf("%f",&soure);switch(i) /*判断修改的课程*/case 1:write(num,soure,1);break;case 2:write(num,soure,2);break;case 3:write(num,soure,3);break;case 4:write(num,soure,4);break;case 5:write(num,soure,5);break;case 6:write(num,soure,6);break;void write(char num13,float soure,int i) /*修改成绩并写入成绩表中*/FILE *fp;st *p,*l;l=read();if(fp=fopen("a.txt","w+")=NULL)printf("打开文件失败!n");p=l->next;while(p!=NULL)if(strcmp(p->nummber,num)=0)switch(i) /*修改相应课程的成绩*/case 1:p->yuwen=soure;break;case 2:p->math=soure;break;case 3:p->yingyu=soure;break;case 4:p->wuli=soure;break;case 5:p->huaxu=soure;break;case 6:p->shengwu=soure;break;p=p->next;p=l->next; /*修改成功后写入成绩表*/while(p!=NULL)p->total=p->yuwen+p->math+p->yingyu+p->wuli+p->huaxu+p->shengwu;fprintf(fp,"%d %s %s %.2f %.2f %.2f %.2f %.2f %.2f %.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;fclose(fp);printf("%s成绩修改完成,任意健返回");getchar();getchar();/*到此结束*/3.3.5 成绩删除模块分析:此模块的功能是删除指定学号的成绩,并从成绩表中除名。函数del()调用read()函数,read()将学生成绩表保存在链表l中,并将指针l返回给del(),del()遍历链表,查找匹配的学号,查找成功则删除,并保存新成绩表到当前目录下。查找失败则提示用户无此学生的记录。代码如下:void del() /*成绩删除函数*/int n=1,x,k=1,m=0,i=1;FILE *fp1,*fp2,*fp3;char ch;char nummber20;st *l,*s,*p;i=decide();if(i)l=read();while(n)printf("请输入要删除成绩的学生的学号:");scanf("%s",nummber); /*从键盘接收学生的学号*/p=l;printf("要删除的信息如下:nn");printf("名次 学号 姓名 语文 数学 英语 物理 化学 生物 总成绩n");printf("*nn");while(p!=NULL)if(strcmp(p->nummber,nummber)=0) /*若查找成功,打印出学生信息*/printf("-4d %s %-8s%-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2f %-5.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);m+;s=p; /*s指向要删除的结点*/p=p->next;if(m>0) /*查找成功,执行删除操作*/printf("1删除,0取消:"); /*确认执行删除操作*/scanf("%c",&ch);scanf("%c",&ch);if(ch='1')if(fp1=fopen("a.txt","w+")=NULL)printf("打开a.txt文件出错!n");p=l;while(p!=NULL) /*删除结点*/if(p->next=s)p->next=s->next;p=p->next;p=l->next;while(p!=NULL) /*写入成绩表*/p->x=k;k+;fprintf(fp1,"%d %s %-8s %.2f %.2f %.2f %.2f %.2f %.2f %.2fn",p->x,p->nummber,p->name,p->yuwen,p->math,p->yingyu,p->wuli,p->huaxu,p->shengwu,p->total);p=p->next;fclose(fp1);if(fp2=fopen("xuhao.txt","r")=NULL)printf("打开xuhao.txt文件出错!n");fscanf(fp2,"%d",&x);x-; /*序号自减1*/fclose(fp2);if(x<0) x=0;if(fp3=fopen("xuhao.txt","w+")=NULL)printf("打开xuhao.txt文件出错!n");fprintf(fp3,"%d",x); /*将新序号自xuhao.txt中*/fclose(fp3);printf("删除成功!任意键继续,0返回:");scanf("%c",&ch);scanf("%c",&ch);if(ch='0') n=0;else /*查找失败*/printf("无此学生的信息.n");else /*成绩表为空,返回*/printf("学生成绩数据库为空,请录入!n");printf("任意健返回");getchar(); /*函数到此结束*/3.3.6成绩排序模块分析:此模块的功能是将学生的总成绩按由高到低排序,函数paixu()调用read()函数,read()将成绩表保存在链表l中,并将指针l反回给paixu(),paixu()函数遍历链表l,每次遍历找出链表中总分最高的结,并将此结点的信息保存在链表l1中后在l中删除此结点,循环此过程直到链表l为空,保存链表l1到当前目录,此时成绩表中即是按总成绩由高到底排列。代码如下:void paixu() /*成绩排序函数*/