课程设计报告.docx
- 文档编号:28471227
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:41
- 大小:640.18KB
课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(41页珍藏版)》请在冰豆网上搜索。
课程设计报告
学生成绩管理系统
课程设计报告
编写人:
王顺
同组成员:
卫韩龙(课程设计负责人)
吴晓兰王顺
钱连兵王剑
安子奎
完成日期:
2010年6月25日
辅导教师:
余海芸
批阅日期:
分数:
一、功能描述
此成绩管理系统主要利用结构体实现,由如下三个功能模块实现
1、输入模块。
主要完成学生记录的存入工作。
2、数据记录处理模块。
包含多个子块,主要完成求平均值,排序,删除,查询,修改,保存等功能。
3、输出模块。
主要完成记录的输出工作。
二、总体设计
1、功能模块设计
(1)主函数执行流程:
主函数的控制参数为K,当K不为零时,反复执行每次均可选择想要的项目进行操作,当K为零时主函数终止。
(2)输入记录模块:
数据的输入可以通过键盘输入,若原程序存在已保存的记录,可以直接进行读入操作即读取历史纪录,通过readfile函数实现。
(3)数据记录处理模块:
包含多个子模块,主要完成求平均值,排序,删除,查询,修改,保存等功能。
依次通过average,ave,paixu,del,seek,xiugai,save函数实现。
(4)输出记录模块:
输出所有记录功能函数为output函数,其他含有输出功能的函数都有相嵌套的输出语句。
三、数据结构设计
1、学生成绩信息结构体
structrecord
{charcode[LEN+1];/*学号*/
charname[LEN+1];/*姓名*/
intmark[M];/*课程成绩*/
doubleaverage;/*平均成绩*/
doubleave[M];}/*每门课的平均成绩*/
stu[N],t,u;/*结构体变量*/
四、函数功能描述
1、Voidreadfile()
函数原型:
voidreadfile()/*建立信息*/
{char*p="student.dat";/*将文件的首地址赋给指针变量P*/
char*q="ave.dat";
FILE*fp;FILE*fq;
inti=0;intk=0;
if((fp=fopen("student.dat","r")/*将文件指针FP指向该文件中保存的文件名*/)==NULL)/*检查文件打开的正确性*/
{printf("openfileerroranykeytoexit",p);}
while(fscanf(fp,"%s%s%d%d%d%d%d%lf",stu[order[i]].code,stu[order[i]].name,&stu[order[i]].mark[0],&stu[order[i]].mark[1],&stu[order[i]].mark[2],&stu[order[i]].mark[3],&stu[order[i]].mark[4],&stu[order[i]].average)==8)/*浏览文件*/
{i++;
order[i]=i;}
fclose(fp);
if((fq=fopen("ave.dat","r"))==NULL)
{printf("openfileerroranykeytoexit",q);}
while(fscanf(fq,"%lf",&u.ave[k])==1)
{k++;}
fclose(fq);
n=i;
printf("录入完毕\n");
}
参数含义:
.函数无形参;p,q分别为student.dat,ave.dat两个文件的首地址所赋给的指针变量;i,k是for循环控制变量而且k不会影响到主函数的正常运行;n代表记录的个数或学生的个数。
2、voidseek()
函数原型:
voidseek()
{inti,j,item,flag;/*flag旗帜item项目*/
doubleavr;
charsl[LEN+1];/*以姓名和学号最长长度加1为准*/
printf("----------------\n");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
printf("3.按成绩查询\n");
printf("4.退出本菜单\n");
printf("----------------\n");
while
(1)
{printf("请选择子菜单编号:
");
scanf("%d",&item);
flag=0;
switch(item)
{
case1:
printf("请输入要查询的学生学号:
\n");
scanf("%s",sl);
for(i=0;i if(strcmp(stu[order[i]].code,sl)==0) {flag=1; printf("该学生学号,姓名和%d门课成绩及平均成绩为: \n",M); printf("%s%s",stu[order[i]].code,stu[order[i]].name); for(j=0;j printf("%-4d",stu[order[i]].mark[j]); printf("%.2lf",stu[order[i]].average); printf("\n"); } if(flag==0) printf("该学号不存在! \n");break; case2: printf("请输入要查询的学生的姓名: \n"); scanf("%s",sl); for(i=0;i if(strcmp(stu[order[i]].name,sl)==0) {flag=1; printf("该学生学号,姓名和%d门课成绩及平均成绩为: \n",M); printf("%s%s",stu[order[i]].code,stu[order[i]].name); for(j=0;j printf("%-4d",stu[order[i]].mark[j]); printf("%.2lf",stu[order[i]].average); printf("\n"); } if(flag==0) printf("该姓名不存在! \n");break; case3: printf("请输入要查询的学生平均成绩: \n"); scanf("%lf",&avr); for(i=0;i if(stu[order[i]].average==avr) {flag=1; printf("该学生学号,姓名和%d门课程成绩及平均成绩为: \n",M); printf("%s%s",stu[order[i]].code,stu[order[i]].name); for(j=0;j printf("%-4d",stu[order[i]].mark[j]); printf("%.2lf",stu[order[i]].average); printf("\n"); } if(flag==0) printf("该平均成绩的学生不存在! \n");break; case4: return; default: printf("请在1-4之间选择\n"); } } } 参数含义: .函数无形参;item是switch函数的控制变量;flag作为if语句的判断条件,若flag为零说明无此项记录;i,j分别代表人数和科目两项for循环的参数;code,name,mark,average均为结构体的一个域;sl,姓名和学号的字符型数组。 3、voidinsert() 函数原型: voidinsert() {inti=n,j,flag; printf("请输入待增加的学生数: \n"); scanf("%d",&m); do {flag=1; while(flag) {flag=0; printf("请输入第%d个学生的学号: \n",i+1); scanf("%s",stu[i].code); for(j=0;j if(strcmp(stu[i].code,stu[j].code)==0) {printf("已有该学号,请检查后重新输入\n"); flag=1; break;/*如有重复立即退出该层循环,提高判断速度*/ } } printf("请输入第%d个学生的姓名: \n",i+1); scanf("%s",stu[i].name); printf("请输入%d门课程的成绩: \n",M); printf("course1数学course2语文course3英语course4理综course5体育\n"); for(j=0;j {printf("course%d: ",j+1); scanf("%d",&stu[i].mark[j]); if(stu[i].mark[j]<0||stu[i].mark[j]>100) {printf("请重新输入正确成绩"); j=j-1;} } if(flag==0) {order[i]=i; i++; } } while(i n+=m; printf("录入完毕\n\n"); } 参数含义: .函数无形参;M是总的科目数;n是原有的记录条数;m是新增的记录条数;flag循环控制参数;i也表示原有的记录条数与n不同的是i一直在变。 4、voiddel() 函数原型: voiddel() {inti,j,flag=0; charsl[LEN+1]; printf("请输入要删除的学生学号: \n"); scanf("%s",sl); for(i=0;i if(strcmp(stu[order[i]].code,sl)==0) {flag=1; for(j=i;j stu[order[j]]=stu[order[j+1]]; } if(flag==0) printf("该学号不存在\n"); if(flag==1) {n--; printf("删除成功,显示结果请选菜单7\n"); } } 参数含义: .函数无形参;sl存储学号的字符型数组;flag是if函数的判断参数;n是原有的记录数;i是循环控制参数;j循环控制,本层循环把要删除的记录之后的记录依次前移一位; 5、voidsave() 函数原型: voidsave() {inti,j,flag=0;intk; FILE*fp;FILE*fq; fp=fopen("student.dat","w"); for(i=0;i {fprintf(fp,"%-17s%-17s",stu[order[i]].code,stu[order[i]].name); for(j=0;j fprintf(fp,"%-4d",stu[order[i]].mark[j]); fprintf(fp,"%.2lf",stu[order[i]].average); fprintf(fp,"\n"); } fclose(fp); fq=fopen("ave.dat","w"); for(k=0;k {fprintf(fq,"%lf",u.ave[k]); fprintf(fq,"\n");} fclose(fq); printf("保存成功! ! "); } 参数含义: .函数无形参;i,j分别负责学生和科目的循环;*p,*q分别是指向student.dat和ave.dat首地址的指针;M总科目数;k各科平均成绩存储系统之循环控制参数。 6、voidaverage() 函数原型: voidaverage() {inti,j; {for(i=0;i {stu[order[i]].average=0;}} for(i=0;i {{for(j=0;j stu[order[i]].average+=(stu[order[i]].mark[j]/float(M));} printf("%f",stu[order[i]].average);}} 参数含义: .函数无形参;i,j分别为学生和科目的循环控制参数;M是总科目数。 7、voidoutput() 函数原型: voidoutput() {inti,j; printf("\n学号姓名%d门课成绩平均成绩\n",M); for(i=0;i {{printf("%-18s%-17s",stu[order[i]].code,stu[order[i]].name);} for(j=0;j {printf("%-5d",stu[order[i]].mark[j]);} printf("%17.1f",stu[order[i]].average); printf("\n");} printf("各科平均成绩\n"); printf(""); for(i=0;i printf("%-.1f",u.ave[i]);} 参数含义: .函数无形参;i是学生以及各科平均成绩循环中的参数;j是科目循环中的参数;M是总的科目数。 8、voidpaixu() {inti,j; for(j=0;j {for(i=0;i if(stu[order[i]].average {t=stu[order[i+1]];stu[order[i+1]]=stu[order[i]];stu[order[i]]=t;}} }参数含义: .函数无形参;j,i学生的外,里循环控参;n记录总数;t起到中转站作用的结构体变量。 9、voidave() 函数原型: voidave() {inti,j; printf("各科的平均成绩依次为: \n"); for(j=0;j {{u.ave[j]=0; for(i=0;i u.ave[j]+=float(stu[order[i]].mark[j]/float(n));} printf("%f",u.ave[j]);}} 参数含义: .函数无形参;j,i分别负责科目循环以及学生循环;M科目总数;n记录总数。 10、voidshuoming() 函数原型: voidshuoming() {printf("操作说明: 本程序包括成绩管理系统的所有基本功能,\n"); printf("首次使用该系统请先增加记录然后保存,以后进入请\n"); printf("先录入然后再行其他操作,操作完成后勿忘保存\n");} 参数含义: .函数无形参;无参数 11、voidxiugai() 函数原型: voidxiugai() {charsl[LEN+1];inti,j;intflag; printf("请输入要修改的学生学号: \n"); scanf("%s",sl); for(i=0;i {if(strcmp(stu[order[i]].code,sl)==0) {printf("该学生原有的学号,姓名和%d门课成绩及平均成绩为: \n",M); printf("%s%s",stu[order[i]].code,stu[order[i]].name); for(j=0;j printf("%-4d",stu[order[i]].mark[j]); printf("%.2lf",stu[order[i]].average); printf("\n"); printf("请输入要修改第几门成绩: "); scanf("%d",&flag);printf("输入新成绩: "); scanf("%d",&stu[order[i]].mark[flag-1]); i=i-1;break; } } if(i==n) printf("该学号不存在! \n");} 参数含义: .函数无形参;sl存储学号的字符型数组;n记录总数;flag要修改的第几门科目;i循环控制,判断条件;j循环控制。 12、菜单函数 voidmenu()/*界面*/ {intnum; printf("\n\n简易学生信息管理系统\n\n"); printf("********系统功能菜单**********\n"); printf("--------------------\n"); printf("1.读入学生信息\n"); printf("2.查询学生信息\n"); printf("3.增加学生信息\n"); printf("4.按学号删除信息\n"); printf("5.保存当前学生信息(修改要保存到文件,退出前要执行本项)\n"); printf("6.显示当前各同学平均成绩\n"); printf("7.显示所有记录\n"); printf("8.按各人平均降序排序\n"); printf("9.各科平均成绩显示\n"); printf("10.操作说明\n"); printf("11.修改成绩\n"); printf("12.退出系统\n"); printf("-----------\n"); printf("请选择菜单编号: "); scanf("%d",&num); switch(num) {case1: readfile();break;/*在主函数中调用子函数时,子函数不要带上类型,这和声明子函数不同*/ case2: seek();break; case3: insert();break; case4: del();break; case5: save();break; case6: average();break; case7: output();break; case8: paixu();break; case9: ave();break; case10: shuoming();break; case11: xiugai();break; case12: k=0;break; default: printf("请在1-12之间选择\n"); } } 参数含义: .函数无形参;num控制主函数中switch选择。 13、主函数 intmain() {while(k) menu(); return0;} 参数含义: k控制循环。 五、程序实现 (1)源代码分析 程序预处理: 包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。 #include #include #defineBUFLEN80/*缓冲区最大字符数,文件读存要经过缓冲区*/ #defineLEN20/*姓名及学号最大字符数实际可更改,宏定义即所谓预处理命令*/ #defineN200/*最大学生数实际请自作更改*/ #defineM5/*课程数实际可更改*/ structrecord {charcode[LEN+1];/*学号*/ charname[LEN+1];/*姓名*/ intmark[M];/*课程成绩*/ doubleaverage;/*平均成绩*/ doubleave[M];}/*各科平均成绩*/ stu[N],t,u;/*结构体变量*/ intk=1,n,m;/变量及初始化/ intorder[N];/*最多200条记录,宏定义中可更改*/ voidreadfile();/*函数声明,不管用与不用,函数声明写在头文件下是个良好习惯,以免调用函数时出错,本组声明均为全局函数,鉴于本程序也可在main内声明;另外只要把调用函数写在被调用函数后面就可以省去函数声明,对本程序来说就是把main函数体扔到最后*/ voidseek(); voidinsert(); voiddel(); voidsave(); voidoutput(); voidaverage(); voidpaixu(); voidshuoming(); voidmenu(); voidave(); voidxiugai(); (2)主函数main() intmain() {while(k)/*通过K控制循环子语句仅menu();一句*/ menu();/*循环调用*/ return0;}/*表示正常退出,此main函数没声明没返回值,因此如果开头是voidmain那么return0;可以直接删掉*/ 运行机制: 只要K不等于零,就会一直执行下去,直到K=0,退出while循环,正常退出。 (3)主菜单界面 voidmenu()/*界面*/ {intnum;/*switch选择的控制参数*/ printf("\n\n简易学生信息管理系统\n\n"); printf("********系统功能菜单**********\n"); printf("--------------------\n"); printf("1.读入学生信息\n"); printf("2.查询学生信息\n"); printf("3.增加学生信息\n"); printf("4.按学号删除信息\n"); printf("5.保存当前学生信息(修改要保存到文件,退出前要执行本项)\n"); printf("6.显示当前各同学平均成绩\n"); printf("7.显示所有记录\n"); printf("8.按各人平均降序排序\n"); printf("9.各科平均成绩显示\n"); printf("10.操作说明\n"); printf("11.修改成绩\n"); printf("12.退出系统\n"); printf("-----------\n"); printf("请选择菜单编号: ");/*原样输出*/ scanf("%d",&num);/*键盘输入参数*/ switch(n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告