版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 综合程序 课程设计说明书课程设计名称: 综合程序课程设计 课程设计题目: 学生成绩管理系统 学 院 名 称: 电子信息工程学院 专业: 电子信息科学与技术 班级: 120431 学号: 12043110 姓名: 王树宇 评分: 教师: 陶秋香 20 15 年 04月 10 日 综合程序 课程设计任务书20 14 20 15学年 第 2 学期 第 1 周 2周 题目学生成绩管理系统内容及要求用C编写一系统,实现学生信息管理,软件的入口界面应包括如下几个方面:(一)功能要求:(1)信息维护:要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生
2、信息、修改学生信息(2)信息查询:要求:查询时可实现按姓名查询、按学号查询(3)成绩统计:要求:A输入任意的一个课程名(如数学)和一个分数段(如60-70),统计出在此分数段的学生情况。(4)排序:能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分)进度安排2015.3.2-2015.3.7:布置课题,查阅资料,方案分析2015.3.8-2015.3.10:程序设计及相应的调试2015.3.11-2015.4.15:完成设计报告学生姓名:王树宇指导时间 2015年3月1日-2015年3月15日指导地点: 综合楼中
3、506任务下达2015年3月1 日任务完成2015 年 3 月15 日考核方式1.评阅 2.答辩 3.实际操作 4.其它指导教师陶秋香系(部)主任王忠华内容摘要 本次课程设计的课题是学生成绩管理系统,本文介绍课程设计课题的选题意义,说明了本系统提供的主要功能,对设计思路、功能模块、流程图、功能模块、中心算法进行了详细的说明,并画出流程框图。本文提供了完整的源程序代码,并展示了系统使用和运行效果。最后给出了在高级语言程序设计过程中的总结,其中包含本程序独特设计,作者的设计收获、设计中遇到的困难和问题,以及自己对设计题目及功能的改进意见,查阅的参考文献等方面的内容。
4、0; 索引关键字 关键词:源程序代码,学生成绩管理,流程框图 目 录第一章 课程设计的目的4第二章 设计内容与要求5第三章 主要技术指标及特点6 3.1 登录界面显示7 3.2 登记学生资料8 3.3 保存学生资料9 3.4 删除学生资料10 3.5 修改学生资料11 3.6 查询学生资料12 3.7 统计学生资料13 3.8 对学生资料进行排序14 3.9 程序主要代码. .15第四章 设计小结.44第五章 附录.45 参考文献.454 设计小结31第一章 课程设计的目的1加深对C语言程序设计课程知识的理解,掌握C语言应用程序的开发方法和步骤;2进一步掌握和利用C语言进行程设计的能
5、力;3进一步理解和运用结构化程序设计的思想和方法;4初步掌握开发一个小型实用系统的基本方法;5学会调试一个较长程序的基本方法;6学会利用流程图或N-S图表示算法;7掌握书写程设计开发文档的能力(书写课程设计报告)。 第二章 设计内容与要求设计内容:成绩管理系统现有学生成绩信息,内容如下:姓名 学号 语文 数学 英语 张明明 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 67 38 47设计要求: (1) 信息维护:要求学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生
6、信息、修改学生信息(2) 信息查询:要求查询时可实现按姓名查询、按学号查询(3) 成绩统计:要求输入任意的一个课程名(如数学)和一个分数段(如60-70),统计出在此分数段的学生情况。(4) 排序:能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分)(5) 至少采用文本菜单界面(如果能采用图形菜单界面更好)(6) 学生可自动增加新功能模块(视情况可另外加分) 第三章 主要技术指标及特点学生成绩管理系统输入学生信息更新学生信息查询学生成绩统计学生成绩从键盘输入从文件中获取修改学生成绩删除学生成绩排序学生成绩按照学号
7、查找按照姓名查找按照课程名及分数段进行统计按照学号删除按照姓名删除按课程得分降序排列图3.1:实验流程图3.1 登录界面显示图3.2:登陆页面 此登录界面是预先设定好作为菜单来显示的,在主函数中以menu()来实现的,在函数中,是通过switchcase来实现选择功能的,用户可以通过需要进行选择,方便了用户的使用,非常人性化。3.2 登记学生资料图3.3:登记页面当系统中没有保存学生信息时,就会提示没有学生记录!也就是说不能从文件中导出,这时就需要用户进行学生资料的导入,当输入的学号已经存在时,系统会提示用户重新输入一个未被占用的学号信息,否则就重新分配内存空间。3.3保存学生资料 图3.4:
8、保存页面 该操作是将用户输入的学生信息进行保存,用文件的方法进行调试,当用户输入对象的个数超过0时,显示保存成功,否则提示,系统连接为空。3.4 删除学生资料图3.5:删除页面图3.6:按姓名删除页面 这里又是通过switchcase函数的调用,让用户进行选择,共有两种方法:1.按照学号 2.按照姓名,操作完成后,系统会自动提示,该学生已经成功删除,当再次显示的时候,函数中的链表就不再指向该学号,从而起到删除的作用。删除完成后,再次保存一下学生资料,不然系统仍然默认为原始人数。3.5修改学生资料图3.7:修改页面 选择到达修改界面:此时将呈现出现有的学生资料,按照要求将新的信息输入其中,再保存
9、资料,如果输入的学号系统中未显示,那么系统则提示没有资料可以修改。 3.6 查询学生资料图3.8:查询页面 按照选择,则会呈现出用户需要查找的所有信息,每次呈现出来的时候都要用之前定义的printheader()函数,这个很好地将数据按照格式化的形式显现出来。此为按照学号查找的例子,按照姓名查找是同样道理。3.7统计学生资料图3.9:统计页面 统计学生资料主要还是用的switchcase函数,通过选择,用printheader(),printdata(r),printf(END)等函数用表格的形式将符合条件的学生信息全部显示出来,不过唯一不足的就是所有的学生信息没有能够连贯起来,每个学生信息前
10、面都有表头,没处理好。3.8对学生资料进行排序3.10排序页面 该图显示的是按照语文成绩排序完的结果,用链表将数据进行一个接一个的比较,按照降序将学生信息排列下来,最后提示排序已经完成,并将所有结果按照用户要求显示出来。3.9程序主要代码 #include "stdio.h" /*标准输入输出函数库*/#include "stdlib.h" /*标准函数库*/#include "string.h" /*字符串函数库*/#include "conio.h" /*屏幕操作函数库*/#define HEADER1 &qu
11、ot; -学生成绩- n"#define HEADER2 " | 学号 | 姓名 |语文|数学|英语| 总分 | 均分 | n"#define HEADER3 " |-|-|-|-|-|-|-|"#define FORMAT " | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |n"#define DATA p->data.num,p->,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data
12、.total,p->data.ave#define END " - n"int shoudsave=0; /* */struct studentchar num10;/* 学号 */char name20;char sex4;int cgrade;int mgrade;int egrade;int total;float ave;char neartime10;/* 最近更新时间 */;typedef struct nodestruct student data;struct node *next;Node,*Link;void menu()system("
13、cls"); /*调用DOS命令,清屏.与clrscr()功能相同*/cprintf("n");cprintf(" 学生成绩管理系统 nn");cprintf(" *菜单*n");cprintf(" * 1 登记学生资料 2 删除学生资料 *n");cprintf(" * 3 查询学生资料 4 修改学生资料 *n");printf(" * 5 插入学生资料 6 统计学生资料 *n");cprintf(" * 7 排序学生资料 8 保存学生资料 *n&quo
14、t;);cprintf(" * 9 呈现学生资料 0 退出系统 *n");cprintf(" *n");/*cprintf()送格式化输出至文本窗口屏幕中*/void printheader() /*格式化输出表头*/printf(HEADER1);printf(HEADER2);printf(HEADER3);void printdata(Node *pp) /*格式化输出表中数据*/Node* p;p=pp;printf(FORMAT,DATA);void Wrong()printf("n=>提示:输入错误!n");void
15、 Nofind()printf("n=>提示:没有找到该学生!n");void Disp(Link l) /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/Node *p;p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p) /*p=NULL,NUll在stdlib中定义为0*/printf("n=>没有学生记录!n");getchar();return;printf("nn");printheader(); /*
16、输出表格头部*/while(p) /*逐条输出链表中存储的学生信息*/printdata(p);p=p->next; /*移动直下一个结点*/printf(HEADER3);getchar();/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容; nameornum保存按什么查找; 在单链表l中查找;*/Node* Locate(Link l,char findmess,char nameornum) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */Node *r;if(strcmp(nameornum,"num
17、")=0) /* 按学号查询 */r=l->next;while(r!=NULL)if(strcmp(r->data.num,findmess)=0)return r;r=r->next;else if(strcmp(nameornum,"name")=0) /* 按姓名查询 */r=l->next;while(r!=NULL)if(strcmp(r->,findmess)=0)return r;r=r->next;return 0;/*增加学生记录*/void Add(Link l)Node *p,*r,*s
18、; /*实现添加操作的临时的结构体指针变量*/char ch,flag=0,num10;r=l;s=l->next;system("cls");Disp(l); /*先打印出已有的学生信息*/while(r->next!=NULL)r=r->next; /*将指针移至于链表最末尾,准备添加记录*/while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/printf("请你输入学号(以'0'返回上一级菜单:)"
19、;);scanf("%s",num);flag=0;if(strcmp(num,"0")=0) /*输入为0,则退出添加操作,返回主界面*/ return;s=l->next; while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/ if(strcmp(s->data.num,num)=0) flag=1; break; s=s->next; if(flag=1) /*提示用户是否重新输入*/ getchar(); printf("=>学号 %s 不存在,重新输入吗?(y/n):&quo
20、t;,num); scanf("%c",&ch); if(ch='y'|ch='Y') continue; else return; else break;p=(Node *)malloc(sizeof(Node); /*申请内存空间*/if(!p) printf("n 分配内存失败 "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/ strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/printf("请你输入姓名
21、:");scanf("%s",p->);getchar();printf("请你输入语文成绩:");scanf("%d",&p->data.cgrade);getchar();printf("请你输入数学成绩:");scanf("%d",&p->data.mgrade);getchar();printf("请你输入英语成绩:");scanf("%d",&p->data.egrade
22、);p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;p->data.ave=p->data.total / 3;getchar();/* 信息输入已经完成 */p->next=NULL;r->next=p;r=p;shoudsave=1;void Qur(Link l) /*按学号或姓名,查询学生记录*/int sel; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/char findmess20; /*保存用户输入的查询内容*/Node *p;if(!l->
23、;next)/*若链表为空*/system("cls");printf("n=>提示:没有资料可以查询!n");return;system("cls");printf("n=>1按学号查找n=>2按姓名查找n");printf(" 请选择1,2:");scanf("%d",&sel);if(sel=1)/* 学号 */printf("请你输入要查找的学号:");scanf("%s",findmess);p=Lo
24、cate(l,findmess,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/if(p)/*若p!=NULL*/ printheader(); printdata(p); printf(END); printf("请按任意键返回"); getchar();elseNofind();getchar();else if(sel=2) /* 姓名 */printf("请你输入要查找的姓名:");scanf("%s",findmess);p=Locate(l,findmess,&qu
25、ot;name");if(p) printheader(); printdata(p); printf(END); printf("请按任意键返回"); getchar();else Nofind(); getchar();elseWrong();/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/void Del(Link l) /* 删除 */int sel;Node *p,*r;char findmess20;if(!l->next)printf("n=>提示:没有资料可以删除!n");getchar();retu
26、rn;printf("n=>1按学号删除n=>2按姓名删除n");scanf("%d",&sel);if(sel=1)printf("请你输入要删除的学号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("n=>提示:该学生已经成功删除!n"
27、);getchar();shoudsave=1;elseNofind();else if(sel=2)printf("请你输入要删除的姓名:");scanf("%s",findmess);p=Locate(l,findmess,"name");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("n=>提示:该学生已经成功删除!n");getchar();shoudsave=1;elseNofind();
28、getchar();elseWrong();getchar();/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/void Modify(Link l)Node *p;char findmess20;if(!l->next) system("cls");printf("n=>提示:没有资料可以修改!n");getchar();return;system("cls");printf("修改学生资料");Disp(l);printf("请你输入要修改的学生
29、学号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p)printf("请你输入新学号(原来是%s):",p->data.num);scanf("%s",p->data.num);printf("请你输入新姓名(原来是%s):",p->);scanf("%s",p->);getchar();printf("请你输入新的语文成绩(原来是%
30、d分):",p->data.cgrade);scanf("%d",&p->data.cgrade);getchar();printf("请你输入新的数学成绩(原来是%d分):",p->data.mgrade);scanf("%d",&p->data.mgrade);getchar();printf("请你输入新的英语成绩(原来是%d分):",p->data.egrade);scanf("%d",&p->data.egrade)
31、;p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;p->data.ave=p->data.total/3;printf("n=>提示:资料修改成功!n");shoudsave=1;getchar();elseNofind();getchar();/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/void Insert(Link l) Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/ char c
32、h,num10,s10; /*s保存插入点位置之前的学号,num保存输入的新记录的学号*/ int flag=0; v=l->next; system("cls"); Disp(l); while(1) printf("请输入需要插入的新学号:n"); scanf("%s",num); flag=0;v=l->next; while(v) /*查询该学号是否存在,flag=1表示该学号存在*/ if(strcmp(v->data.num,s)=0) flag=1;break; v=v->next; if(fla
33、g=1) break; /*若学号存在,则进行插入之前的新记录的输入操作*/ else getchar(); printf("n=>学号 %s 不存在,重新试吗?(y/n):",s); scanf("%c",&ch); if(ch='y'|ch='Y') continue; else return; /*以下新记录的输入操作与Add()相同*/printf("请输入需要输入的新学生学号:n");scanf("%s",num);v=l->next;while(v)
34、if(strcmp(v->data.num,num)=0) printf("=>对不起,新学号:'%s' 已经存在 !n",num); printheader(); printdata(v); printf("n"); getchar(); return; v=v->next;newinfo=(Node *)malloc(sizeof(Node);if(!newinfo) printf("n 分配资源失败 "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/ strcpy(
35、newinfo->data.num,num);printf("请输入学生的姓名:n");scanf("%s",newinfo->);printf("请输入学生的语文成绩0-100:n");scanf("%s",newinfo->data.cgrade);printf("请输入学生的数学成绩0-100:n");scanf("%s",newinfo->data.mgrade);printf("请输入学生的英语成绩0-100:n&
36、quot;);scanf("%s",newinfo->data.egrade);newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;newinfo->data.ave=(float)(newinfo->data.total/3);newinfo->next=NULL;shoudsave=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着
37、学生的记录*/p=l->next;while(1) if(strcmp(p->data.num,s)=0) /*在链表中插入一个节点*/ newinfo->next=p->next; p->next=newinfo; break; p=p->next; Disp(l); printf("nn"); getchar();void Tongji(Link l)Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */Node *r=l->next;int num1=0,num2=0,num3=0,num4=0
38、,num5=0;int select;if(!r)printf("n=>提示:没有资料可以统计!n");return ;system("cls");pm=pe=pc=pt=pa=r;printf("请选择所需统计科目:1.语文 2.数学 3.英语n");scanf("%d",&select);switch(select)case 1:printf("请选择需要统计的分数段:1.0-60 2.60-70 3.70-80 4.80-90 5.90-100n"); scanf("
39、;%d",&select); switch(select) case 1: while(r!=NULL) if(r->data.cgrade<60) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 2: while(r!=NULL) if(r->data.cgrade>=60&&r->data.cgrade<70) num1+; printhead
40、er(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 3: while(r!=NULL) if(r->data.cgrade>=70&&r->data.cgrade<80) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 4: while
41、(r!=NULL) if(r->data.cgrade>=80&&r->data.cgrade<90) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 5: while(r!=NULL) if(r->data.cgrade>=90&&r->data.cgrade<100) num1+; printheader(); printdata(r
42、); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; break;case 2:printf("请选择需要统计的分数段:1.0-60 2.60-70 3.70-80 4.80-90 5.90-100n"); scanf("%d",&select); switch(select) case 1: while(r!=NULL) if(r->data.mgrade<60) num1+; printheader(); printdata(r);
43、printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 2: while(r!=NULL) if(r->data.mgrade>=60&&r->data.mgrade<70) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 3: while(r!=NULL) if(r->d
44、ata.mgrade>=70&&r->data.mgrade<80) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 4: while(r!=NULL) if(r->data.mgrade>=80&&r->data.mgrade<90) num1+; printheader(); printdata(r); printf(END); r=r-&
45、gt;next; printf("在此分数段的共有%d人n",num1); break; case 5: while(r!=NULL) if(r->data.mgrade>=90&&r->data.mgrade<100) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; break;case 3:printf("请选择需要统计的分数段:1.0-60 2.60-
46、70 3.70-80 4.80-90 5.90-100n"); scanf("%d",&select); switch(select) case 1: while(r!=NULL) if(r->data.egrade<60) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 2: while(r!=NULL) if(r->data.egrade>=60&&r->data.egrade<70) num1+; printheader(); printdata(r); printf(END); r=r->next; printf("在此分数段的共有%d人n",num1); break; case 3: while(r!=NULL) if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版企业市场调研委托合同管理规范3篇
- 2025年外研版三年级起点九年级历史上册月考试卷含答案
- 2025年钢构厂房钢结构工程风险评估与管理合同范本
- 2025年度高新技术企业研发中心个人工劳务分包合同2篇
- 二零二五年度油烟机安装与能耗优化改造合同3篇
- 2025年统编版八年级历史下册阶段测试试卷含答案
- 二零二五年度车辆手续抵押贷款合同变更通知4篇
- 2025年浙教新版九年级历史下册月考试卷
- 2025山林地承包合同范文
- 2025技术开发版合同书
- 2019版新人教版高中英语必修+选择性必修共7册词汇表汇总(带音标)
- 新译林版高中英语必修二全册短语汇总
- 基于自适应神经网络模糊推理系统的游客规模预测研究
- 河道保洁服务投标方案(完整技术标)
- 品管圈(QCC)案例-缩短接台手术送手术时间
- 精神科病程记录
- 阅读理解特训卷-英语四年级上册译林版三起含答案
- 清华大学考博英语历年真题详解
- 人教版三年级上册口算题(全册完整20份 )
- 屋面及防水工程施工(第二版)PPT完整全套教学课件
- 2023年高一物理期末考试卷(人教版)
评论
0/150
提交评论