最新c语言-学生成绩管理系统.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datec语言-学生成绩管理系统课程设计C语言课程设计报告书 课程名称:学生信息管理系统一、设计目的:(1)本学期我们学习了C语言,由于初接触,学习有一定困难;于是学校给我们提供一次巩固提高的机会-课程设计。该可程设计要求学生既动手又动脑,自学,查资料,独立实践。将本学期课本上的理论知识和实际有机的结合起来,锻炼学生实际分析问题和解决问题的能力,提高学生适应实际、实践编程的能力,使对C语言系统编程有一个大致的了解。(2)C语言的实践。掌握C语言函数的定义方法,函数的声明及函数的调用过程。掌握结构体类型变量的定义和使用,综合应用C语言的知识,实现一个完整的系统,提高编程能力,体会软件程序的开发过程。二、总体设计(1)程序设计组成框图学生成绩管理系统1.按班级输出学生成绩单2.按姓名查询3.增加学生4.删除学生5.按班级修改学生成绩6.按班学期改学生成绩7.保存所有学生信息8.显示不及格学生成绩9.按平均成绩排序并输出成绩10.退出(2)模块功能说明1 输出功能:完成全部学生记录的显示。2 查询功能:输入姓名可以查询学生的详细信息。3 增加功能:增加新学生的信息。 4 删除功能:删除学生信息。5 修改功能:修改学生的错误信息。6保存功能:保存已输入信息。7读取功能:读取已输入信息。8显示功能:按要求显示学生记录。9 排序功能:按要求完成对学生信息的排序。 10 退出系统。(3)程序流程图开始输入指令(110)学生成绩单按姓名查询增加学生删除学生按班级修改按学期修改保存信息不及格成绩平均分排序退出123456789100结束(4)主要函数之间相互调用如下:主函数main ()的调用switch(choice)case 1:OutputInformation();break; case 2:DesplayInfoBystudentName();break;case 3:p=MallocNode();GetInformation(p); InsertOneNode(p); break;case 4:DeleteNodeBystudentNumber();break;case 5:ChangeMarkByName();break;case 6:ChangeMarkByNumber();break;case 7:SaveLinkToFile();break;case 8:DesplayMarkSegment();break;case 9:CompositorByTotalMark();break;case 10:SaveLinkToFile(); (5)各函数功能详见源程序清单(6)在设计过程中的感受:首先经过一周的编程实习,并在后一段的报告总结,我对C语言这门科有新的认识,本人实在是获益不浅!要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验。其次, 通过此次编程我也发现了自己在学习中的错误和不足,复习了以前学过的知识。同时也学到了一些没学过的知识,让我从中收益非浅,也为期末考试准备了一下!更重要的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法!第三, 因为初次接触等原因此次设计遇到了许多问题,我深刻体会到老师发挥的重要作用,C语言程序对我们来说比较难,在匆忙的学习中更是难上加难,似乎觉得自己仅是个匆匆过客,但在老师的帮助下我学会了如何调试,如何查找系统没有提示的错误,最后终于排除万难把程序搞定,体会到原来编程也挺有意思的快感.我想没有老师的帮助我很难在短期内把程序设计做的这样好,在此特地感谢老师的帮助。三、源程序清单#include<stdio.h>#include<conio.h>#include<malloc.h>#include<string.h>typedef struct STUDENTchar studentNumber10;/*学生学号*/char studentName20;/*学生姓名*/char className20;/*班级名称*/char yearName20;/*学期名称*/float mark1;/*第1门成绩*/float mark2;/*第2门成绩*/float mark3;/*第3门成绩*/struct STUDENT *next;STUDENT;STUDENT *headLink;/*链表表头指针*/*以下是函数声明*/void ReadInfoFormFile(void);void DesplayMenu(void);void CreateHeadLink(void);STUDENT *MallocNode(void);void GetInformation(STUDENT *t);void OutputInformation(void);void DesplayInfoBystudentName(void);void DesplayOneNode(STUDENT *t);void InsertOneNode(STUDENT *t);void DeleteNodeBystudentNumber(void);void ChangeMarkByName(void);void ChangeMarkByNumber(void);void SaveLinkToFile(void);void DesplayMarkSegment(void);void CompositorByTotalMark(void);int choose;/*用于接受用户的选择*/*主函数*/void main()CreateHeadLink();ReadInfoFormFile();DesplayMenu();/*函数功能:从文件中读学生信息到链表中*/void ReadInfoFormFile(void)FILE *fp;STUDENT *p;fp=fopen("student.txt","r");if(!fp)printf("文件不存在n");return;p=MallocNode();while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3)>0)InsertOneNode(p);p=MallocNode();fclose(fp);/*函数功能:显示菜单,根据用户的输入完成相应的功能*/void DesplayMenu(void)STUDENT *p;printf("-请选择相应功能-nn");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 退出 |nn");scanf("%d",&choose);/*取得用户的选择*/switch(choose)case 1:OutputInformation();/*显示所有学生的信息*/break;case 2:DesplayInfoBystudentName();break;case 3:p=MallocNode();/*先申请一个新结点*/GetInformation(p);/*要求用户输入信息到新结点中*/InsertOneNode(p);/*将新结点加到链表中*/break;case 4:DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/break;case 5:ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/break;case 6:ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/break;case 7:SaveLinkToFile();/*保存数据*/break;case 8:DesplayMarkSegment();/*显示不及格的学生成绩*/break;case 9:CompositorByTotalMark();/*按平均成绩排序*/break;case 10:SaveLinkToFile();/*保存数据后再退出*/free(headLink);exit(1);break;default:break;DesplayMenu();/*递归调用*/*函数功能:建立链表表头*/void CreateHeadLink(void)STUDENT *p;p=(STUDENT*)malloc(sizeof(STUDENT);headLink=p;p->next=NULL;/*函数功能:申请一个新结点,并将其初始化*/STUDENT *MallocNode(void)STUDENT *p;int i;p=(STUDENT*)malloc(sizeof(STUDENT);if(p=NULL)return NULL;for(i=0;i<10;i+)p->studentNumberi='0'for(i=0;i<20;i+)p->studentNamei='0'for(i=0;i<20;i+)p->classNamei='0'p->mark1=0.0;p->mark2=0.0;p->mark3=0.0;p->next=NULL;return p;/*函数功能:取得用户输入的学生信息*/void GetInformation(STUDENT *t)printf("请输入学生学号:n");scanf("%s",t->studentNumber);printf("请输入学生姓名:n");scanf("%s",t->studentName);printf("请输入该生所在班级:n");scanf("%s",t->className);printf("请输入第1门成绩:n");scanf("%f",&(t->mark1);printf("请输入第2门成绩:n");scanf("%f",&(t->mark2);printf("请输入第3门成绩:n");scanf("%f",&(t->mark3);/*函数功能:在链表的结尾处增加一个结点*/void InsertOneNode(STUDENT *t)STUDENT *p;p=headLink;while(p->next)p=p->next;p->next=t;/*函数功能:根据用户输入的学生姓名显示该学生的信息*/void DesplayInfoBystudentName(void)STUDENT *p;char studentName20;char flag=0;p=headLink->next;printf("请输入学生姓名:n");scanf("%s",studentName);while(p)if(strcmp(p->studentName,studentName)=0)printf("学号t姓名t班级t成绩1t成绩1t成绩3t总成绩t平均成绩nn");DesplayOneNode(p);flag=1;break;p=p->next;if(!flag)printf("对不起,不存在姓名为 %s 的学生n",studentName);/*函数功能:输出一个结点的信息*/void DesplayOneNode(STUDENT *t)printf("%st",t->studentNumber);printf("%st",t->studentName);printf("%st",t->className);printf("%.2ft",t->mark1);printf("%.2ft",t->mark2);printf("%.2ft",t->mark3);printf("%.2ft",t->mark1+t->mark2+t->mark3);printf("%.2ftn",(t->mark1+t->mark2+t->mark3)/3);/*函数功能:根据用户输入的学号删除该学生*/void DeleteNodeBystudentNumber(void)char studentNumber10;STUDENT *p,*q;char flag=0;printf("请输入要删除的学生学号:");scanf("%s",studentNumber);p=headLink;q=headLink->next;while(q) if(strcmp(q->studentNumber,studentNumber)=0) p->next=q->next; free(q); flag=1; break; p=p->next; q=q->next; if(!flag)printf("不存在该学号的学生n");return;printf("成功删除n");/*函数功能:显示所有学生的信息*/void OutputInformation(void)STUDENT *p;p=headLink->next;if(p=NULL)printf("现在没有学生信息,请先输入学生信息nn");return;printf("学号t姓名t班级t成绩1t成绩1t成绩3t总成绩t平均成绩nn");while(p)DesplayOneNode(p);p=p->next;/*函数功能:根据输入的班级修改成绩*/void ChangeMarkByName(void)STUDENT *p;int a;char studentName20;char flag=0;float mark1,mark2,mark3;p=headLink->next;printf("请输入学生班级:n");scanf("%d",&a);printf("请输入学生姓名:n");scanf("%s",studentName);while(p)if(strcmp(p->studentName,studentName)=0)printf("请输入新的第1门成绩:n");scanf("%f",&mark1);printf("请输入新的第2门成绩:n");scanf("%f",&mark2);printf("请输入新的第3门成绩:n");scanf("%f",&mark3);p->mark1=mark1;p->mark2=mark2;p->mark3=mark3;flag=1;printf("修改成功n");break;p=p->next;if(!flag)printf("对不起,不存在班级为 %s 的学生n",studentName);/*函数功能:根据输入的学期修改成绩*/void ChangeMarkByNumber(void)STUDENT *p;int b;char studentNumber20;char flag=0;float mark1,mark2,mark3;p=headLink->next;printf("请输入学生所在学期:n");scanf("%d",&b);printf("请输入学生学号:n");scanf("%s",studentNumber);while(p)if(strcmp(p->studentNumber,studentNumber)=0)printf("请输入新的第1门成绩:n");scanf("%f",&mark1);printf("请输入新的第2门成绩:n");scanf("%f",&mark2);printf("请输入新的第3门成绩:n");scanf("%f",&mark3);p->mark1=mark1;p->mark2=mark2;p->mark3=mark3;flag=1;printf("修改成功n");break;p=p->next;if(!flag)printf("对不起,不存在学期为 %s 的学生n",studentNumber);/*函数功能:保存链表数据到文件中*/void SaveLinkToFile(void)STUDENT *p;FILE *fp;p=headLink->next;if(p=NULL)printf("现在没有学生信息,请先输入学生信息nn");return;fp=fopen("student.txt","w+");if(!fp)printf("文件不存在n");return;while(p)fprintf(fp,"%s %s %s %f %f %fn",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);p=p->next;fclose(fp);/*函数功能:不及格学生成绩*/void DesplayMarkSegment(void)STUDENT *p;int count=0;p=headLink->next;printf("60分以下(不及格)的学生成绩如下:n");printf("学号t姓名t班级t成绩1t成绩1t成绩3t总成绩t平均成绩nn");while(p)if(6>(int)(p->mark1/10)|(6>(int)(p->mark2/10)|(6>(int)(p->mark3/10)/*只要有一科不及格就认为该生不及格*/count+;DesplayOneNode(p);p=p->next;printf("不及格的学生一共有%d人n",count);/*函数功能:按平均成绩排序*/void CompositorByTotalMark(void)STUDENT exchange,*r,*p,*q;r=headLink->next;if(r=NULL)printf("现在还没学生信息,请先输入学生信息n");return;while(r)/*两层while循环实现排序*/p=r;q=r->next;while(q)if(q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3)strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/strcpy(exchange.studentName,q->studentName);strcpy(exchange.className,q->className);exchange.mark1=q->mark1;exchange.mark2=q->mark2;exchange.mark3=q->mark3;strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/strcpy(q->studentName,p->studentName);strcpy(q->className,p->className);q->mark1=p->mark1;q->mark2=p->mark3;q->mark3=p->mark3;strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/strcpy(p->studentName,exchange.studentName);strcpy(p->className,exchange.className);p->mark1=exchange.mark1;p->mark2=exchange.mark2;p->mark3=exchange.mark3;q=q->next;r=r->next;OutputInformation();-