




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学生成绩管理系统PAGEPAGE3**大学物联网工程学院课程设计报告课程名称:计算机综合实践设计题目:学生成绩管理系统班级:自动化1001班姓名:学号:指导教师:评分:2011年11月15日目录一、设计目的和任务 3二、总体设计 3三、详细设计 5四、调试与测试 5五、源程序清单和执行结果 6六、体会与心得 17七、参考文献 17设计目的和任务设计目的:(1)基本掌握面向过程程序设计的基本思路和方法;(2)达到熟练掌握C语言的基本知识和技能;(3)能够利用所学的基本知识和技能,解决简单的程序设计问题。程序功能:(1)计算各个学生的总分及平均分,并按平均分排出名次。(2)统计全班学生平均分成绩,输出60分以下、60~79、80~89、90分以上各分数人数。(3)能按学号、姓名查询学生成绩,并能输出学生的成绩单。(4)输出不及格科目及学生名单。(5)在屏幕打印优等生名单(学号,三门课程成绩,平均成绩,名次),优等生必须满足下列条件:1.平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或者平均分大于85分且至少两门课程成绩为95分以上;2.名次在前三名;3.每门功课及格以上。二、总体设计(1)程序设计组成框图:组成组成框图初始化结构体数组建立文本文件求总分和平均分按平均分排名统计各个分数段人数查找学生信息查找不及格科目及学生查找优等生退出系统(2)程序设计流程图:开始开始初始化学生信息初始化学生信息求总分和平均分并排名求总分和平均分并排名选择功能选择功能5432154321输出优等生信息输出不及格科目及学生信息输出统计信息输出查找到的学生信息输出排名输出优等生信息输出不及格科目及学生信息输出统计信息输出查找到的学生信息输出排名后的学生信息写入文件写入文件结束结束详细设计1)初始化结构体数组:初始化学生的学号、姓名,数学、英语、计算机三科的成绩,暂定学生的排名、总分、平均分为0。2)建立文本文件:可用函数voidwenjian1()和voidwenjian2()来实现,将系统查询的结果全部写入文本文件中。3)求总分和平均分:可用函数voidmodify(structStudentstu[N])来实现,将计算的结果赋给结构体数组中的学生的总分和平均分。4)按平均分排名:先调用函数voidmodify(structStudentstu[N]),再用函数voidrank(structStudentstu[N])来实现,将计算的结果赋给结构体数组中的学生的排名。调用函数voidprint(structStudentstu[N])按表格形式输出学生所有信息,调用函数voidwenjian1()将其写入文本文件。5)统计各个分数段的人数:在第(4)步基础上用函数voidgrade(structStudentstu[N])来实现,将统计的结果输出并调用函数voidwenjian2()写入文本文件中。6)查找学生的信息:在第(4)步基础上用函数voidsearch(structStudentstu[N])来实现,用switch语句读入用户的选择,若读入1,则按学号查找;若读入2,则按姓名查找。调用函数voidwenjian2()将查找结果写入文本文件。7)查找不及格科目及学生:在第(4)步基础上用函数voidinsert(structStudentstu[N])来实现,依次输出数学、英语、计算机不及格的学生姓名和该科不及格成绩并调用函数voidwenjian2()写入文本文件中。8)查找优等生:在第(4)步基础上用函数voidexcellent(structStudentstu[N])来实现,找出同时满足优等生三个条件的学生即为优等生,输出他们的所有信息并调用函数voidwenjian2()写入文本文件。9)系统的欢迎界面:可用函数voidsystem(structStudentstu[N])来实现。10)菜单选择:可用函数voidmenu(structStudentstu[N])来实现,一共有5个功能,用switch语句读入用户的选择。调试与测试文件模块问题:这个系统总共有5个功能,也就是有5个结果,可是运行完了之后发现后一次的结果会覆盖前一次的结果,打开文本文件查看的时候发现里面的内容混乱。解决办法:设置两个子函数,一个是读入第一个结果的子函数voidwenjian1(),文件类型设置为“wb”型,另一个是读入后四个结果的子函数voidwenjian2(),文件类型设置为“ab+”型,实现为刚刚建立的文本文件续写的功能。这样在下面的程序中只需要调用自己需要的子函数就可以将结果正确无误的保存到文本文件中。排名模块问题:可用voidrank(structStudentstu[N])来实现。可是在设计“若平均分相同则并列名次”这个算法的时候遇到了困难,试验了好几次都不成功。解决办法:1、最开始只是简单的以为用选择法对结构体里每名学生的平均分stu[i].aver从大到小排好序,然后再从一到十的赋给排名stu[i].rank就行,后来发现这解决不了名次并列的问题。于是想到了用for循环将结构体里学生的成绩stu[i].aver与已排好名的数组average[m]从大到小一个一个比较,若遇到几个学生的分数与average[k]相同,则给stu[i].rank赋相同的值。2、可是再次调试的时候问题又来了,因为当初排名的时候数组里average[m]也有相同的值,结果导致给stu[i].rank赋值出现了重复,后一次的排名会覆盖上一次的排名。于是,我又想了一个办法,那就是在用选择法对average[m]进行排名的时候,若遇到几个值相同的元素,则只保留一个元素,这样在给stu[i].rank赋值的时候就不会出现重复了。于是这个问题顺利解决。源程序清单和执行结果(1)源程序清单如下:/*******************头文件*******************/#include<stdio.h>#include<string.h>/*******************宏定义********************/#defineN10/****************全局指针变量*******************/FILE*fp;/***************定义结构体数组****************/structStudent{ intranking; intnum; charname[20]; floatscore[3]; floataver; floattotal;};/**************初始化结构体数组****************/structStudentstu[N]={{0,1001,"YangShengqian",{99,80,85},0,0},{0,1002,"XiangJing",{80,90,78},0,0},{0,1003,"WangMinghui",{60,70,59},0,0},{0,1004,"DongQiang",{91,90,90},0,0},{0,1005,"ZhengKai",{85,76,90},0,0},{0,1006,"HeYunling",{90,91,90},0,0},{0,1007,"WangYao",{69,47,67},0,0},{0,1008,"GouHuan",{45,76,56},0,0},{0,1009,"MaYuling",{89,78,67},0,0},{0,1010,"RanDongdu",{100,100,98},0,0}};/*************子函数功能:建立文本文件*********/voidwenjian1(){ if((fp=fopen("xscjglxt.txt","wb"))==NULL)/*****用“wb”建立一个二进制文件******/ { printf("cannotopenfile\n"); return; }}/*************子函数功能:续写文本文件**********/voidwenjian2(){ if((fp=fopen("xscjglxt.txt","ab+"))==NULL)/*****用“ab+”为刚刚建立的文件实现续写*******/ { printf("cannotopenfile\n"); return; }}/************子函数功能:求总分和平均分**********/voidmodify(structStudentstu[N]){ inti; for(i=0;i<N;i++) { stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];/*******求总分********/ stu[i].aver=stu[i].total/3.0;/******求平均分*******/ }}/************子函数功能:根据平均分排名***********/voidrank(structStudentstu[N]){ inti,j,k,m,n; floataverage[N],t; modify(stu);/******调用子函数modify()******/ for(i=0;i<N;i++) average[i]=stu[i].aver; for(i=0;i<N-1;i++)/*****用选择法对平均分排名*****/ { k=i; for(j=i+1;j<N;j++) { if(average[j]==average[k]) average[k]=0; if(average[j]>average[k]) k=j; } t=average[k]; average[k]=average[i]; average[i]=t; } for(m=0,n=1;m<N;m++,n++)/*****把排好的名次赋给结构体里的元素*****/ for(i=0;i<N;i++) if(stu[i].aver==average[m]) stu[i].ranking=n;}/*********子函数功能:统计各个分数段人数*************/voidgrade(structStudentstu[N]){ intA,B,C,D,E,i; wenjian2();/*****打开文件*****/ A=B=C=D=E=0; for(i=0;i<N;i++) { if(stu[i].aver<60)/*****平均分低于60的人数******/ E++; if(stu[i].aver>=60&&stu[i].aver<=69)/***平均分在60——69之间的人数***/ D++; if(stu[i].aver>=70&&stu[i].aver<=79)/***平均分在70——79之间的人数***/ C++; if(stu[i].aver>=80&&stu[i].aver<=89)/***平均分在80——89之间的人数***/ B++; if(stu[i].aver>=90)/****平均分大于89的人数***/ A++; } printf(">90\t80-89\t70-79\t60-69\t<60\n");/****输出各分数段人数****/ fprintf(fp,"\r\n>90\t80-89\t70-79\t60-69\t<60\r\n");/***在文件中输出各分数段人数***/ printf("%d\t%d\t%d\t%d\t%d\n",E,D,C,B,A); fprintf(fp,"%d\t%d\t%d\t%d\t%d\r\n",E,D,C,B,A); fclose(fp);/*********关闭文件*********/ }/*******子函数功能:用姓名或者学号查找学生信息*********/voidsearch(structStudentstu[N]){ intnum1,i,n; charname1[20]; wenjian2();/******************打开文件*********************/ /********说明若是按学号查找,则输入1;若是按姓名查找,则输入2***********/ printf("ifyouwanttosearchbynumber,pleaseinput1.\nifyouwanttosearchbyname,pleaseinput2.\n\n"); printf("pleaseinputyourchoice:");/*****提示用户输入自己的选择***/ scanf("%d",&n);/***********读入用户的选择*************/ printf("\n"); switch(n) { /********************用学号查找**********************/ case1:printf("pleaseinputthenumber:"); scanf("%d",&num1); printf("\n"); for(i=0;i<N;i++)/*******一个一个比较学号是否相符******/ { if(stu[i].num==num1) { printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } } if(num1<1001||num1>1010)/********************如果用户输入不正确则提示出错********************/ printf("ERROR!\n"); break; /*******************用姓名查找********************/ case2:printf("pleaseinputthename:"); gets(name1); gets(name1); printf("\n"); for(i=0;i<N;i++)/********一个一个比较名字是否相符********/ { if(strcmp(stu[i].name,name1)==0) { printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);}if(strcmp(stu[i].name,name1)==0)break; } if(i==N&&strcmp(stu[i].name,name1)!=0)/*********如果用户输入不正确则提示出错********/ printf("ERROR!"); break; default:printf("ERROR!\n");/****如果用户输入选择键错误则提示出错***/ } fclose(fp);/*****************关闭文件*******************/ }/*****子函数功能:输出不及格科目和学生及其不及格分数*****/voidinsert(structStudentstu[N]){ inti,j=0; wenjian2();/*******************打开文件***********************/ printf("Math:"); fprintf(fp,"\r\nMath:");/******查找数学不及格的学生********/ for(i=0;i<N;i++) if(stu[i].score[0]<60) { printf("\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]); fprintf(fp,"\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]); } printf("\nEnglish:");/******查找英语不及格的学生*******/ fprintf(fp,"\r\nEnglish:"); for(i=0;i<N;i++) if(stu[i].score[1]<60) { printf("\t%s\t%5.2f\t",stu[i].name,stu[i].score[1]); fprintf(fp,"\t%s\t%5.2f\r",stu[i].name,stu[i].score[1]); } printf("\nComputer:");/*****查找计算机不及格的学生******/ fprintf(fp,"\r\nComputer:"); for(i=0;i<N;i++) if(stu[i].score[2]<60) { printf("\t%s\t%5.2f\n\t",stu[i].name,stu[i].score[2]); fprintf(fp,"\t%s\t%5.2f\t",stu[i].name,stu[i].score[2]); } printf("\n"); fclose(fp);/**************关闭文件***************/}/************************输出优等生的信息**************************/voidexcellent(structStudentstu[N]){ inti,j,k,t,m,a,b,c; j=k=t=m=a=b=c=0; wenjian2();/*****************打开文件********************/ modify(stu); rank(stu); printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); for(i=0;i<N;i++) { if(stu[i].aver>90) j=1; if(stu[i].aver>85&&(stu[i].score[0]==100||stu[i].score[1]==100||stu[i].score[2]==100)) k=1; if((stu[i].score[0]>95&&stu[i].score[1]>95)||(stu[i].score[0]>95&&stu[i].score[2]>95)||(stu[i].score[1]>95&&stu[i].score[2]>95)) t=1; if(stu[i].aver>85&&t) m=1; if(j||k||m)/****优等生平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或平均分大于85分且至少两门课程成绩为95分以上****/ a=1; if(stu[i].ranking<=3) b=1; if(stu[i].score[0]>60&&stu[i].score[1]>60&&stu[i].score[2]>60) c=1; if(a&&b&&c)/****************必须同时满足三个条件*****************/ { printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } j=k=t=m=a=b=c=0;}fclose(fp);/*******************关闭文件*********************/} /******子函数功能:按表格形式输出学生信息*******/voidprint(structStudentstu[N]){ inti; wenjian1();/**********************打开文件**********************/ printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n");/**************按表格形式输出学生信息************/ fprintf(fp,"Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n");/**************把学生信息写入文件***************/ for(i=0;i<N;i++) { printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } fclose(fp);/*******************关闭文件*******************/}/******子函数功能:系统的欢迎界面********/ voidsystem(structStudentstu[N]){ printf("\t\t\t\t学生成绩管理系统\t\t\t\n\n"); printf("\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t1.计算全班学生总分及平均分,并排出名次。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t2.统计全班成绩并按平均分输出各分数段人数。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t3.按学号或者姓名查找学生,并输出该生成绩单。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t4.查找不及格科目及学生名单并输出。\t\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t5.查找优等生并输出他们的成绩单。\t\t\t\4\4\4\4\4\4\4\4\n\n"); printf("\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");}/**************子函数功能:实现菜单选择*********/voidmenu(structStudentstu[N]){ intn,i; for(i=0;i<5;i++) { printf("\n"); printf("pleasechosethefunctionnumber:");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《跨境电商》课件-3.其他平台注册
- 《Linux操作系统》课件-10.Linux进程管理
- 高质量三农田水利设施建设指南
- 农民创业创新培训作业指导书
- 沉淀池施工安全措施
- 蛋糕店项目可行性研究报告
- 机场工程车辆租赁合同范本
- 二零二五年度北京市网吧装修工程网络设备采购合同
- 加油站安全管理预案
- 可行性研究报告资料收集清单
- 统计法律知识培训课件
- 2025年合伙协议模板
- 2025年南京铁道职业技术学院单招职业适应性测试题库及答案一套
- 对外汉语综合课教案集成
- 北京市朝阳区2024-2025学年高一上学期期末质量检测数学试题【含答案解析】
- 《慢性阻塞性肺病的》课件
- 互联网金融 个人网络消费信贷 贷后催收风控指引
- 欧姆定律-中考复习课件
- 中学语文课程标准研究最新试题及答
- 如何激发学生学习物理的兴趣PPT课件
- CRH2 第5章 转向架
评论
0/150
提交评论