C语言成绩信息管理系统课程设计--成绩信息管理系统.doc_第1页
C语言成绩信息管理系统课程设计--成绩信息管理系统.doc_第2页
C语言成绩信息管理系统课程设计--成绩信息管理系统.doc_第3页
C语言成绩信息管理系统课程设计--成绩信息管理系统.doc_第4页
C语言成绩信息管理系统课程设计--成绩信息管理系统.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计课程设计报告专 业: 电子信息工程 班 级: 电信1001 姓 名: 指导教师: 卢嫣 丁雄 2011年12月28日 目 录1课程设计目的2 2课程设计题目描述和要求2 3.课程设计报告内容 3 3.1 所涉及知识点 3 3.2课程设计的思路以及流程图 3 3.3个人负责程序说明 43.4课程设计中遇到的问题以及解决方法 11 4.个人设计总结11 5.参考书目11 6.附录源程序代码11 C语言程序设计课程设计任务书1、课程设计目的(1)、熟练掌握C语言课程中所学的理论知识;(2)、通过综合C语言的基本知识来解决实际问题;(3)、加强分析和解决问题的能力。2、课程设计题目描述和要求(1)课程设计题目:成绩信息管理系统。(2)课程设计要求:a,设计包含N个学生的数据信息的学生成绩管理系统,包括以下信息: 学号、 姓名(拼音)、三门课程成绩(高数、英语、计算机) b,系统功能包括: 1、学生信息的录入(增加数据)。用数组数据类型赋初值的方法或从键盘输入的方法把学生的数据送到各个数组中(注意要是合法数据),然后把它们输出显示。2、学生信息的删除(删除数据)。任意输入一位学生的学号,将它所有的信息从数组中删除。3、学生信息的浏览(查找数据)。任意输入一位学生的学号,打印出他的所有数据。要求能多次查找。4、学生信息的修改(修改数据)。任意输入一位学生的学号,打印出所有相关信息后,可对某一项信息进行修改并保存。5、学生信息的计算并排序。计算每个学生三门课程的总分(sum,整型)及平均分(aver,单精度,输出一位小数),将包括所有数据的数组元素按总分从大到小的顺序排序打印出来。6、程序编译成员及模块分配主函数的设计-信息录入模块的设计-删除模块的设计-修改模块的设计-浏览模块的设计-计算与排序模块的设计-3、课程设计报告内容3.1. 所涉及知识点:指针的定义与引用;函数的定义与调用;局部变量和全局变量大的定义; for循环语句的使用;if语句的使用;break语句的使用;格式输入与输出;比较法排序;函数的定义;数组作为函数参数。32课程设计的思路以及流程图一:课程设计思路主程序为main(),子程序有个分别为Add(l),Qur(l), Modify(l), Insert(l), Tongji(l), Sort(l), Save(l)。分别可以实现录入学生信息,删除学生信息,浏览学生信息,修改学生信息,对信息学生排序,以及对学生信息保存。二、课程设计思路及结构图 根据题目的要求,需要一个主程序main()和若干子程序,其如结构图下:主程序初始输入显示排序查找插入删除保存退出1、初始化函数 STUDENT *init()这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!2、菜单选择函数 int menu_select();这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!3、输入记录函数 STUDENT *create()这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head。算法:先声明一个首节点head,并将head-next设为NULL。每输入一个数据就声明一个新节点p,把p-next设为NULL,并且链接到之前列表的尾端。N-S流程图如下:4、显示记录函数 void print(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。N-S流程图如下:5、查找记录函数 void search(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p-name,s) & p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。N-S流程图如下:源程序如下:/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容; nameornum保存按什么查找; 在单链表l中查找;*/Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,num)=0) /*按学号查询*/r=l-next;while(r) if(strcmp(r-data.num,findmess)=0) /*若找到findmess值的学号*/ return r; r=r-next;else if(strcmp(nameornum,name)=0) /*按姓名查询*/r=l-next;while(r) if(strcmp(,findmess)=0) /*若找到findmess值的学生姓名*/ return r; r=r-next;return 0; /*若未找到,返回一个空指针*/*输入字符串,并进行长度验证(长度lens)printf(n 超出要求范围! n); /*进行长度校验,超过lens值重新输入*/ while(strlen(n)lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/*输入分数,0分数100 | t100 | taverageaverage,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点。重复以上的步骤,直到p0-average=p1-average为止。这时将p0指向的结点插到p1所指结点之前。但是如果p1所指的已是表尾结点,则p1就不应后移了。如果p0-average比所有结点的average都小,则应将p0所指的结点插到链表末尾。如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2-,使p2-next指向待插入的结点,然后将p1的值赋给p0-next,使得p0-next指向p1指向的变量。如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0-next。如果要插到表尾之后,应将p0赋给p1-next,NULL赋给p0-next。最后再调用排序的函数,将学生成绩重新排序.N-S流程图如下:9、保存数据到文件函数 void save(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。N-S流程图如下:10、从文件读数据函数 STUDENT *load()这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。N-S流程图如下:3.3 个人负责程序说明学生信息的浏览(查找数据)。任意输入一位学生的学号,打印出他的所有数据。要求能多次查找。3.4课程设计中遇到的问题以及解决方法(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!加入初始化函数后,这种现象也随之消失。(2)刚开始时,先把成绩按平均分排序,再插入一个学生的成绩,执行显示功能,虽然插入的学生的成绩能正常插入,但该学生的名次为0。后来,在插入成绩之后,调用排序函数,把所有成绩重新排序一次。(3)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,当学号为0的时候则停止输入。(4)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。(5)在没有输入任何信息的情况下,去执行排序功能,最后显示有一个记录,学号、姓名为空白,成绩都为0,名次为1。(7)在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。4、个人设计总结C语言课程设计,感觉自己收获了不少,通过这个课程设计提高了对编程语言的兴趣,同时加深了对C语言的理解!1. 本来按老师建议的是用结构体数组,但是由于没有学习结构体数组,而自己自学起来我们个人感觉指针更简单一些,所以采用了指针的方法。2. 链表本来上课是没有学的,但这个课程设计里面主要都是用链表,因为要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本和参考课外书,使C语言的知识强化了不少。3. 在做课程设计的过程中,发现了平时很多没有注意到的问题,例如:返回值函数和不返回值函数两者在主函数中的调用是不同的等等。这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。5、参考书目1 Schildt H著,戴健鹏译,C语言大全(第二版),电子工业出版社,京,1994年2 谭浩强,c程序设计教程,清华大学出版社,北京,2005年3 谭浩强,c程序设计题解与上机指导,清华大学出版社,北京,2006年6、附录源程序代码#include stdio.h /*标准输入输出函数库*/#include stdlib.h /*标准函数库*/#include string.h /*字符串函数库*/#include conio.h /*屏幕操作函数库*/#define HEADER1 -学生成绩表- n#define HEADER2 | 学号 | 姓名 |计算机|数学|英语 | 总分 | 平均分 |名次 | n#define HEADER3 |-|-|-|-|-|-|-|-| #define FORMAT | %-10s |%-14s|%4d| %4d| %4d| %4d | %.2f |%4d |n#define DATA p-data.num,,p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.total,p-data.ave,p-data.mingci#define END - nint saveflag=0; /*是否需要存盘的标志变量*/*定义与学生有关的数据结构*/typedef struct student /*标记为student*/char num10; /*学号*/char name15; /*姓名*/int cgrade; /*计算机成绩*/int mgrade; /*数学成绩*/int egrade; /*英语成绩*/int total; /*总分*/float ave; /*平均分*/int mingci; /*名次*/;/*定义每条记录或结点的数据结构,标记为:node*/typedef struct nodestruct student data; /*数据域*/struct node *next; /*指针域*/Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/void menu() /*主菜单*/system(cls); /*调用DOS命令,清屏.与clrscr()功能相同*/cprintf( 学生成绩管理系统 n);cprintf( *菜单*n);cprintf( * 1 输入记录 * 2 删除记录 *n);cprintf( * 3 查询记录 * 4 修改记录 *n);cprintf( * 5 添加记录 * 6 统计打印记录 *n);cprintf( * 7 排序打印记录 * 8 保存记录 *n);cprintf( * 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(nnnnn*错误:输入有误! 按任意键继续*n);getchar();void 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(); /*输出表格头部*/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)=0) /*按学号查询*/r=l-next;while(r) if(strcmp(r-data.num,findmess)=0) /*若找到findmess值的学号*/ return r; r=r-next;else if(strcmp(nameornum,name)=0) /*按姓名查询*/r=l-next;while(r) if(strcmp(,findmess)=0) /*若找到findmess值的学生姓名*/ return r; r=r-next;return 0; /*若未找到,返回一个空指针*/*输入字符串,并进行长度验证(长度lens)printf(n 超出要求范围! n); /*进行长度校验,超过lens值重新输入*/ while(strlen(n)lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/*输入分数,0分数100 | t100 | tnext;system(cls);Disp(l); /*先打印出已有的学生信息*/while(r-next!=NULL)r=r-next; /*将指针移至于链表最末尾,准备添加记录*/while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/stringinput(num,10,输入学号(按0返回菜单):); /*格式化输入学号并检验*/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):,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中*/stringinput(,15,Name:);p-data.cgrade=numberinput(Computer Score0-100:); /*输入并检验分数,分数必须在0100之间*/p-data.mgrade=numberinput(Math Score0-100:); /*输入并检验分数,分数必须在0100之间*/p-data.egrade=numberinput(English Score0-100:); /*输入并检验分数,分数必须在0100之间*/p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade; /*计算总分*/p-data.ave=(float)(p-data.total/3); /*计算平均分*/p-data.mingci=0;p-next=NULL; /*表明这是链表的尾部结点*/r-next=p; /*将新建的结点加入链表尾部中*/r=p;saveflag=1; return ;void Qur(Link l) /*按学号或姓名,查询学生记录*/int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/char searchinput20; /*保存用户输入的查询内容*/Node *p;if(!l-next) /*若链表为空*/system(cls);printf(n=没有学生记录!n);getchar();return;system(cls);printf(n =1 按学号查询 =2 按姓名查询n);printf( 请选择1,2:);scanf(%d,&select);if(select=1) /*按学号查询*/stringinput(searchinput,10,input the existing student number:);p=Locate(l,searchinput,num);/*在l中查找学号为searchinput值的节点,并返回节点的指针*/if(p) /*若p!=NULL*/ printheader(); printdata(p); printf(END); printf(按任意键返回); getchar();else Nofind(); getchar();else if(select=2) /*按姓名查询*/stringinput(searchinput,15,input the existing student name:);p=Locate(l,searchinput,name);if(p) printheader(); printdata(p); printf(END); printf(按任意键返回); getchar();else Nofind(); getchar();elseWrong();getchar();/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/void Del(Link l)int sel;Node *p,*r;char findmess20;if(!l-next) system(cls);printf(n=没有学生记录!n);getchar();return;system(cls);Disp(l);printf(n =1 按学号删除 =2 按姓名删除n);printf( 请选择1,2:);scanf(%d,&sel);if(sel=1)stringinput(findmess,10,输入要删除学生的学号:);p=Locate(l,findmess,num);if(p) /*p!=NULL*/ r=l; while(r-next!=p) r=r-next; r-next=p-next;/*将p所指节点从链表中去除*/ free(p); /*释放内存空间*/ printf(n=删除成功!n); getchar(); saveflag=1;else Nofind(); getchar();else if(sel=2) /*先按姓名查询到该记录所在的节点*/stringinput(findmess,15,输入要删除学生的姓名);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(); saveflag=1;else Nofind(); 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);stringinput(findmess,10,input the existing student number:); /*输入并检验该学号*/p=Locate(l,findmess,num); /*查询到该节点*/if(p) /*若p!=NULL,表明已经找到该节点*/printf(学号:%s,n,p-data.num);printf(姓名:%s,);stringinput(,15,input new name:);printf(计算机成绩:%d,p-data.cgrade);p-data.cgrade=numberinput(Computer Score0-100:);printf(高数成绩:%d,p-data.mgrade);p-data.mgrade=numberinput(Math Score0-100:);printf(英语成绩:%d,p-data.egrade); p-data.egrade=numberinput(English Score0-100:);p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade;p-data.ave=(float)(p-data.total/3);p-data.mingci=0;printf(n=修改成功!n);Disp(l);saveflag=1;elseNofind();getchar();/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/void Insert(Link l) Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/ char ch,num10,s10; /*s保存插入点位置之前的学号,num保存输入的新记录的学号*/ int flag=0; v=l-next; system(cls); Disp(l); while(1) stringinput(s,10,please input insert location after the Number:); flag=0;v=l-next; while(v) /*查询该学号是否存在,flag=1表示该学号存在*/ if(strcmp(v-data.num,s)=0) flag=1;break; v=v-next; if(flag=1) break; /*若学号存在,则进行插入之前的新记录的输入操作*/ else getchar(); printf(n=学号 %s 不存在,重新输入?(y/n):,s); scanf(%c,&ch); if(ch=y|ch=Y) continue; else return; /*以下新记录的输入操作与Add()相同*/stringinput(num,10,input new student Number:);v=l-next;while(v) 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(newinfo-data.num,num);stringinput(,15,Name:);newinfo-data.cgrade=numberinput(Computer Score0-100:);newinfo-data.mgrade=numberinput(Math Score0-100:);newinfo-data.egrade=numberinput(English Score0-100:);newinfo-data.total=newinfo-data.egrade+newinfo-data.cgrade+newinfo-data.mgrade;newinfo-data.ave=(float)(newinfo-data.total/3);newinfo-data.mingci=0;newinfo-next=NULL;saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着学生的记录*/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; /*用于指向分数最高的节点*/Node *r=l-next;int countc=0,countm=0,counte=0; /*保存三门成绩中不及格的人数*/if(!r) system(cls);printf(n=没有学生记录!n);getchar();return ;system(cls);Disp(l);pm=pe=pc=pt=r;while(r)if(r-data.cgradedata.mgradedata.egradedata.cgrade=pc-data.cgrade) pc=r;if(r-data.mgrade=pm-data.mgrade) pm=r;if(r-data.egrade=pe-data.egrade) pe=r;if(r-data.total=pt-data.total) pt=r;r=r-next;printf(n-统计打印-n);printf(计算机 60:%d 人n,countc);printf(高数 60:%d 人n,countm);printf(英语 ,pt-data.total);printf(英语分数最高学生 姓名:%s 分数:%dn,,pe-data.egrade);printf(高数分数最高学生 姓名:%s 分数:%dn,,pm-data.mgrade);printf(计算机分数最高学生 姓名:%s 分数:%dn,,pc-data.cgrade);printf(nn按任意键返回);getchar();/*利用插入排序法实现单链表的按总分字段的降序排序,从高到低*/void Sort(Link l)Link ll;Node *p,*rr,*s;int i=0;if(l-next=NULL) system(cls);printf(n=没有学生记录!n);getchar();return ;ll=(Node*)malloc(sizeof(Node); /*用于创建新的节点*/if(!ll) printf(n 分配失败 ); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/ ll-next=NULL;system(cls);Disp(l); /*显示排序前的所有学生记录*/p=l-next;while(p) /*p!=NULL*/s=(Node*)malloc(sizeof(Node); /*新建节点用于保存从原链表中取出的节点信息*/if(!s) /*s=NULL*/ printf(n 分配失败 ); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/ s-data=p-data; /*填数据域*/s-next=NULL; /*指针域为空*/rr=ll;/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/while(rr-next!=NULL & rr-next-data.total=p-data.total) rr=rr-next; /*指针移至总分比p所指的节点的总分小的节点位置*/if(rr-next=NULL)/*若

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论