1、高级语言程序设计学生成绩评定系统设计高级语言程序设计课程设计说明书 设计题目:学生成绩评定系统设计 目 录课程设计内容 3需求分析 3流程图: 3模块说明 6用户使用说明 7测试结果 8设计小结 12参考文献 12附录 13课程设计内容需求分析: 用C语言编写学生成绩管理系统的程序需要用到指针处理链表,及处理动态链表的函数.还需要用到输出链表,对链表的删除操作,对链表的插入操作,排序等.链表是一种常见的重要的数据结构,它是动态进行存储分配的一种结构,链表是必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一个结点的地址.流程图:主函数子函数 模块说明 (1) 调用creat函
2、数后,函数的值是所建立的链表的第一个结点的地址. 令NULL代表0,用它表示空地址,令LEN代表struct student类型数据的长度,sizeof是”求字节数运算符”.malloc(LEN)的作用是开辟一个长度为LEN的内存区,malloc带回的是不指向任何类型数据的指针,p1,p2是指针变量.最后一行的return 后面的参数是head,因此函数返回的是 head的值也就是链表的头地址.n是个结点个数.这个算法的思路是让p1指向新开辟的结点,p2指向链表中最后一个结点,把p1所指的结点连接在p2所指的结点后面,用”p2-next=p1”来实现. (2)求总分和平均分: 调用calcul
3、函数后,令p等于链头. 最后一行的return 后面的参数是head这个算法的思路是用”p-sum”代表总分,平均分用”p-average=p-sum/3”来实现. (3)求平均分的最高和最低分:调用search函数后,令p1,p2,p等于链头. 如果只有链头的话,最大值最小值都为链头,用dowhile循环语句实现求平均分分的最大和最小值. 同时打印出最高分和最低分的同学信息. (4)记录平均分各分数段的人数:调用seek函数后,令p等于链头. 分别用do.while循环语句和ifelse条件语句来实现. (5).删除学生记录:调用del函数后,可以设两个指针变量p1和p2,先使p1指向第一个
4、结点,如果要删除的不是第一个结点,则使p1后移指向下一个结点,在次之前先将p1的值赋给p2,使p2指向刚才检查过的那个结点.如此一次一次的使p1后移,直到找到所要删除的结点或检查完全部链表都找不到要删除的结点为止. 函数的类型是指向struct student类型数据的指针,它的值是链表的头指针.函数参数为head和要删除的学号num.head的值可能在函数执行过程中被改变. (6).插入学生记录:调用insert函数后,使p1指向第一个结点,p0指向要插入的结点, 若原来的链表是空表,使p0指向的结点为头结点,否则p2指向刚才p1指向的结点,p1后移一个结点,链头等于p1时插到原来第一个结点
5、之前,否则插到p2指向的结点之后,还有一种可能是插到最后的结点之后. 结点数加1. (7).对平均分排序:调用sort函数,此子函数是定义指针变量first指向链头与下面的链表相比较找到比它小的之后赋值给它p用来寻找新的满足条件的新的存储单元,把它赋给first,后p再继续寻找,如果first指向的下一个存储单元为空,就说明最后一个学生的成绩最低. 用户使用说明A、 安装 C+ 3.0;B、 在Windows XP professional操作系统环境下,左键单击桌面上所安装程序的图标,在弹出的窗口中执行程序。C. 开始并运行程序.D. 本程序运行时候开始界面的密码为2010142134.E、
6、 进入程序,选择所要执行的程序,如按1用户输入学号,姓名,3门课成绩即打印链表.如按2程序即打印出学号,姓名,3门课成绩及总分,平均分。如按3即打印出总分最高及最低的学生信息.如按4即出现平均分数段人数,如按5,6即是删除和插入学生学号的指令,再按7即打印排序后的结果.按8即退出程序.F.程序执行结束,用户通过运行便可知此程序的目的及功能. 测试结果 设计小结程序分为两大板块: (1)主函数部分:用于界面选择和调用子函数等功能的实现。(2) 子函数部分:用于各种各种要求算法的实现。2.特点: (1)能够分别进行各种功能的选择。 (2)对学生的成绩进行求总分、平均分。 (3)求出链表中的最高分,
7、最低分,及对应同学的信息。 (4).统计各个分数段的人数。 (5).能插入新的同学的信息。 (6).能删除当中一个或多个同学的信息。 (7).对链表中的同学进行按平均分从大到小排序。参考文献 1 谭浩强著.C程序设计(第二版).北京:清华大学出版社,1999 2 谭浩强编著.C+程序设计.北京:清华大学出版社,2004 3 C编写组编.常用C语言用法速查手册.北京:龙门书局,1995 4 Herberb Schildt 著.王曦若、李沛译。ANSI C标准详解。北京:学苑出版社,1994-附录# include # include # include # include # define NU
8、LL 0# define end NULL# define LEN sizeof(struct student)FILE *fp;struct studentlong num;char name20;float score3;float average;float sum;struct student * next;void search(struct student *head);void seek(struct student *head);void sort(struct student *head);int instructions(void);int n;float p,q,t;ch
9、ar z;struct student * creat(void)struct student * head;struct student * p1,* p2;n=0;p1=p2=(struct student *)malloc(LEN);scanf(%ld %s %f %f %f,&p1-num,p1-name,&p,&q,&t); p1-score0=p,p1-score1=q,p1-score2=t;fprintf(fp,%ld %s %f %f %fn,p1-num,p1-name,p,q,t);head=NULL;while(p1-num!=0) n+=1; if(n=1) head
10、=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(%ld %s %f %f %f,&p1-num,p1-name,&p,&q,&t); p1-score0=p,p1-score1=q,p1-score2=t; fprintf (fp,%ld %s %f %f %fn,p1-num,p1-name,p,q,t); p2-next=NULL;return(head);void print(struct student * head)struct student * p;printf(n以下是%d位学生的基本信息
11、及成绩记录情况:n,n);fprintf (fp,n以下是%d位学生的基本信息及成绩记录情况:n,n);p=head;printf(学号 姓名 语文 数学 英语n);if(head!=NULL) do printf(%ld %10s %10.1f %10.1f %10.1fn,p-num,p-name, p-score0,p-score1,p-score2); fprintf (fp,%ld %10s %10.1f %10.1f %10.1fn,p-num,p-name, p-score0,p-score1,p-score2); p=p-next; while(p!=NULL);struct
12、student *calcul(struct student *head)struct student *p;p=head;if(head!=NULL) do p-sum=p-score0+p-score1+p-score2; p-average=p-sum/3; p=p-next; while(p!=NULL);return(head);void reprint(struct student *head)struct student *p;printf(n以下是%d个学生的基本信息及成绩记录情况:n,n);fprintf (fp,n以下是%d个学生的基本信息及成绩记录情况:n,n);p=he
13、ad;printf(学号t 姓名 语文 数学 英语 总分 平均分n);fprintf (fp,学号t 姓名 语文 数学 英语 总分 平均分n);if(head!=NULL) do printf(%ld %10s %10.1f %10.1f %10.1f %10.1f %10.1fn,p-num,p-name, p-score0,p-score1,p-score2,p-sum,p-average); fprintf (fp,%ld %10s %10.1f %10.1f %10.1f %10.1f %10.1fn,p-num,p-name, p-score0,p-score1,p-score2,p
14、-sum,p-average); p=p-next; while(p!=NULL);void search(struct student *head)struct student *p,*p1,*p2;float max,min;p1=p2=p=head;if(head!=NULL) max=min=p-average; if(p-next!=NULL) p=p-next; do if(p-summax) max=p-average; p1=p; if(p-averageaverage; p2=p; p=p-next; while(p!=NULL); printf(平均分最高的分数是:%dn,
15、max);fprintf(fp,平均分最高的分数是:%dn,max);printf(他的信息是:%ld %s %5.2f %5.2f %5.2f %5.2f %5.2fn,p1-num,p1-name,p1-score 0,p1-score1,p1-score2,p1-sum,p1-average);fprintf(fp,他的信息是:%ld %s %5.2f %5.2f %5.2f %5.2f %5.2fn,p1-num,p1-name,p1-score 0,p1-score1,p1-score2,p1-sum,p1-average);printf(平均分最低的分数是:%dn,min);fpr
16、intf(fp,平均分最低的分数是:%dn,min);printf(他的信息是:%ld %s %5.2f %5.2f %5.2f %5.2f %5.2fn,p2-num,p2-name,p2-score 0,p2-score1,p2-score2,p2-sum,p2-average);fprintf(fp,他的信息是:%ld %s %5.2f %5.2f %5.2f %5.2f %5.2fn,p2-num,p2-name,p2-score 0,p2-score1,p2-score2,p2-sum,p2-average);void seek(struct student *head)struct
17、 student *p;int a,b,c,d,e;p=head;a=b=c=d=e=0;if(head!=NULL) do if(p-average=90) a+; else if(p-average=80) b+; else if(p-average=70) c+; else if(p-average=60) d+; else e+; p=p-next; while(p!=NULL);printf(平均分在90100的人数为:%dn,a);printf(平均分在8090的人数为:%dn,b);printf(平均分在7080的人数为:%dn,c);printf(平均分在6070的人数为:%d
18、n,d);printf(平均分在60分以下的人数为:%dn,e);fprintf(fp,平均分在90100的人数为:%dn,a);fprintf(fp,平均分在8090的人数为:%dn,b);fprintf(fp,平均分在7080的人数为:%dn,c);fprintf(fp,平均分在6070的人数为:%dn,d);fprintf(fp,平均分在60分以下的人数为:%dn,e);struct student * del(struct student *head)struct student *p1,*p2;long num;printf(n请输入要删除的学生的学号:);fprintf(fp,n请
19、输入要删除的学生的学号:);scanf(%ld,&num);fprintf (fp,%ldn,num);while(num!=0) if(head=NULL) printf(n此链表为空表!n); fprintf(fp,n此链表为空表!n); p1=head; while(num!=p1-num & p1-next!=NULL) p2=p1; p1=p1-next; if(num=p1-num) if(p1=head) head=p1-next; else p2-next=p1-next; printf(要删除学生记录的学号为:%ldn,num); fprintf(fp,要删除学生记录的学号为
20、:%ldn,num); n=n-1; else printf(没有找到学号为%ld的记录!n,num); fprintf(fp,没有找到学号为%ld的记录!n,num); reprint(head); printf(请输入要删除的学生的学号:n); fprintf(fp,请输入要删除的学生的学号:n); scanf(%ld,&num); fprintf (fp,%ldn,num); return(head);struct student *insert(struct student *head,struct student *stud)struct student *p0,*p1,*p2;pr
21、intf(n请输入要插入的学生的学号,姓名以及三门课程的成绩:n);fprintf(fp,n请输入要插入的学生的学号,姓名以及三门课程的成绩:n);stud=(struct student *)malloc(LEN);scanf(%ld %s %f %f %f,&stud-num,stud-name,&p,&q,&t);fprintf(fp,%ld %s %f %f %fn,stud-num,stud-name,p,q,t);stud-score0=p;stud-score1=q;stud-score2=t;while(stud-num!=0) p1=head; p0=stud; if(hea
22、d=NULL) head=p0; p0-next=NULL; else while(p0-nump1-num) & (p1-next!=NULL) p2=p1; p1=p1-next; if(p0-numnum) if(head=p1) head=p0; else p2-next=p0; p0-next=p1; else p1-next=p0; p0-next=NULL; n=n+1; head=calcul(head); reprint(head); printf(请输入要插入的学生的学号,姓名以及三门课程的成绩:n); fprintf(fp,请输入要插入的学生的学号,姓名以及三门课程的成绩
23、:n); stud=(struct student *)malloc(LEN); scanf(%ld %s %f %f %f,&stud-num,stud-name,&p,&q,&t); fprintf(fp,%ld %s %f %f %fn,stud-num,stud-name,p,q,t); stud-score0=p;stud-score1=q;stud-score2=t; return(head); printf(输入直到4个学生后按任意键返回n); fprintf(fp,输入直到4个学生后按任意键返回n); z=getch();void sort(struct student *he
24、ad)struct student *first;struct student *tail;struct student *q;struct student *max;struct student *p;first=NULL;while(head!=NULL) for(p=head,max=head;p-next!=NULL;p=p-next) if(p-next-averagemax-average) q=p; max=p-next; if(first=NULL) first=max; tail=max; else tail-next=max; tail=max; if(max=head)
25、head=head-next; else q-next=max-next; if(first!=NULL) tail-next=NULL; head=first; reprint(head);instructions(void)int m;printf(1.学生的基本信息及考试成绩!n);printf(2.学生的基本资料及三门课程的成绩,总分和平均分!n);printf(3.平均分最高及最低的学生的情况!n);printf(4.各平均分分数段的人数情况!n);printf(5.需要删除的学生的记录!n);printf(6.需要插入的学生的记录!n);printf(7.学生平均分成绩由高到低的排
26、序情况!n);printf(8.退出!n);do printf(请选择以上需要进行的操作!n); scanf(%d,&m); fprintf(fp,请选择以上需要进行的操作!n); fprintf(fp,%dn,m); while(m8);return(m);void main() char pass3;struct student * head,*stud; fp=fopen(a1.txt,a); printf (请输入密码n); fprintf (fp,请输入密码n); scanf (%s,pass); fprintf (fp,%s,pass);system(color 3F); if (
27、strcmp (2010142134,pass)=0) for( ; ; ) switch(instructions() case 1:printf(请输入学生的学号,姓名及三门课程的成绩!n); fprintf(fp,请输入学生的学号,姓名及三门课程的成绩!n); head=creat(); print(head); break; case 2:head=calcul(head); reprint(head); break; case 3: search(head); break; case 4:seek(head); break; case 5:del(head); break; case 6:head=insert(head,stud); break; case 7:sort(head); break; case 8:return; printf(请看仔细后,按任意键返回!n); fprintf(fp,请看仔细后,按任意键返回!n); z=getch(); system(cls); fclose(fp);else printf (密码错误n); fprintf(fp,密码错误n); z=getch(); exi