分享
分享赚钱 收藏 举报 版权申诉 / 19

类型实验二 学生成绩管理系统.doc

  • 上传人:w89153
  • 文档编号:6667508
  • 上传时间:2019-04-20
  • 格式:DOC
  • 页数:19
  • 大小:116.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    实验二 学生成绩管理系统.doc
    资源描述:

    1、实验二 学生成绩管理系统一、 系统功能模块结构图本系统具有以下 10 个功能“ 1. Enter list“ 输入记录“ 2. Delete a record from list“ 从表中删除记录“ 3. Print list “ 显示链表中所有记录“ 4. Search record on name“ 按照姓名查找记录“ 5. Save the file“ 将链表中记录保存到文件中“ 6. Load the file“ 从文件中读入记录“ 7. Compute the score“ 计算所有学生的总分和均分“ 8. Query by class“ 按班级查询显示学生总分“ 9. Insert

    2、 record to list “ 插入记录到表中“ 10. Quit“ 退出学生成绩管理系统输入记录 从表中删除记录显示链表中所有记录按照姓名查找记录将链表中记录保存到文件中从文件中读入记录计算所有学生的总分很均分按班级查询显示学生总分插入记录到表中退出二、数据结构设计及用法说明学生基本信息:学号(例如 2003 级 12 班 6 号写作 20031206)、姓、名、性别、出生年月日、课程名称(外语 SCORE0、高数SCORE1、C 语言 SCORE2、马哲 SCORE3)、考试成绩等。这些信息采用结构体数据类型表示更为方便。同时,学生数量可能的不确定性,采用链表存数更符合实际。所以采用结

    3、构体数据结构。typedef struct St1 char IDNumber16;/*学号*/char FamilyName16; /*姓*/char GivenName16; /*名*/int sex; /*性别(0 代表“女”,1 代表“男”)*/int BirthYear; /*出生年*/int BirthMonth; /*出生月*/int BirthDay; /*出生日*/float score4; /*成绩*/float sum; /*总分*/float average; /*平均分*/struct St1 *next; StudentNode;其中 char IDNumber16

    4、用来存储学号,char FamilyName16用来存储姓,char GivenName16用来存储名,int sex 存储性别(0 代表“女”,1 代表“男”),int BirthYear;存储年份,int BirthMonth 存储月份。int BirthDay 存储日,float score4存储四门课的成绩,float sum 存储总分,float average存储平均分,struct St1 *next 存储结构体指针。三、流程图四、各模块的功能各模块的功能主要依据系统功能进行编写,此处不再赘述。其中系统调用的函数功能如下。1. int LocateElem(StudentNode

    5、 *L,char a) StudentNode *L 传递头指针,char a传递学号。函数返回学号所在链表节点位置。2. int ListDelete(StudentNode *L,int n) StudentNode *L 传递头指针,int n 传递节点位置。函数功能为删除链表的第 n 个节点。删除成功返回 1,失败返回 0。3. void DispList(StudentNode *L) StudentNode *L 传递头指针,功能为输出链表内容。4. char *split(char a) 。返回数组 a 的第 5、6 个字符的指针。5. StudentNode *record(S

    6、tudentNode *s) 函数功能为。录入学生信息,并返回一个节点。6. int ListInsert(StudentNode *L,int m,StudentNode *q) 节点插入函数。7. void quare(StudentNode *L,int m,int n)。StudentNode *L 传递头指针,m 表示分数,n 表示科目 。返回链表中科目 n 分数段为 m 的所有学生信息。五、实验结果输入 输出1 请输入学号20102206 请输入姓张 请输入名为民 请输入性别1 请输入出生年1991 请输入出生月12 请输入出生日9 请输入外语成绩90 请输入高数成绩80 请输入

    7、c 语言成绩70 请输入马哲成绩61 请输入您要查找的菜单3 学号为为 20102206.姓名为张为民出生日期为1991 年 12 月 9 日.英语 90 高数 80 c 语言 70 马哲 61请输入您要查找的菜单4 请输入姓张张 请输入名为民 学号为为 20102206.姓名为张为民出生日期为1991 年 12 月 9 日.英语 90 高数 80 c 语言 70 马哲 61请输入您要查找的菜单5 请输入文件的绝对路径D:s 文件保存成功请输入您要查找的菜单10 程序关闭打开程序请输入您要查找的菜单6 请输入文件的绝对路径D:s 文件读取成功请输入您要查找的菜单3 学号为为 20102206.

    8、姓名为张为民出生日期为1991 年 12 月 9 日.英语 90 高数 80 c 语言 70 马哲 61请输入您要查找的菜单6 请选择功能1 名次为 1 学号为为 20102206.姓名为张为民出生日期为 1991 年 12 月 9 日.英语 90 高数 80 c 语言 70 马哲 61请输入您要查找的菜单7 请选择功能2 请选择课程1(英语) 请选择分数段 1(90 分以上) 学号为 20102206 姓名为张为民请输入您要查找的菜单7 请选择功能3 请输入班级22 学号为 20102206 的总成绩为 301请输入您要查找的菜单10 退出程序六、体会在实验一的基础上,实验二在语法上变得较为

    9、容易。但实验二要求的功能较实验一多得多。很多功能是对链表进行操作。这就要求我们队链表有相当的掌握。同时,这次实验数组用的比较多,合理的运用一些数组函数将大大简化程序。这次实验,我设计的程序有一处犯了很大的错误,由于结构体数据将姓和名分开录入。当我们需要姓名的时候,必须将这姓和名这两个数组合并。我采用的办法是采用数组函数 strcat(s-FamilyName, s-GivenName).这个函数虽然能将两个数组合并。但这也改变了原来链表的 s-FamilyName 值。导致在后面的按姓名查找频频出错。后来,我另定义了两个数组用来存储姓和名才解决了这个问题。附录程序清单#include#incl

    10、ude#include “time.h “#include#define MAX 20typedef struct St1 char IDNumber16;/*学号*/char FamilyName16; /*姓*/char GivenName16; /*名 */int sex; /*性别( 0 代表“ 女“,1 代表“男“ )*/int BirthYear; /*出生年*/int BirthMonth; /*出生月*/int BirthDay; /*出生日*/int score4; /*成绩*/int sum; /*总分 */int average; /*平均分*/struct St1 *n

    11、ext; StudentNode;int LocateElem(StudentNode *L,char a) /*元素查找函数*/StudentNode *p=L-next;int n=1;while(p!=NULLn+;if(p=NULL)return(0);elsereturn(n);int ListDelete(StudentNode *L,int n) /*删除节点函数*/int m=0;StudentNode *p=L,*q;while(mnext;if(p=NULL)return 0;elseq=p-next;if(q=NULL)return 0;p-next=q-next;fre

    12、e(q);return 1;void DispList(StudentNode *L) StudentNode *p=L-next;while(p!=NULL)printf(“学号为:%s 姓名为%s ,出生日期为%d 年%d 月%d 日 英语%d 高数%d c 语言%d 马哲%dn“,p-IDNumber,strcat(p-FamilyName,p-GivenName),p-BirthYear,p-BirthMonth,p-BirthDay,p-score0,p-score1,p-score2,p-score3);p=p-next;printf(“n“);void DispList1(Stu

    13、dentNode *L) /*输出所有节点*/int i=1;StudentNode *p=L-next;while(p!=NULL)printf(“名次为%d,学号为:%s,姓名为%s,平均成绩为%d 英语 %d 高数%d c语言%d 马哲%dn“,i,p-IDNumber,strcat(p-FamilyName,p-GivenName),p-average,p-score0,p-score1,p-score2,p-score3);p=p-next;i+;printf(“n“);int ListLength(StudentNode *L) /*求链表的长度*/StudentNode *p=L

    14、;int i=0;while(p-next!=NULL)i+;p=p-next;return(i);char dest4;char *split(char a) /*班级截取函数*/ int i;for(i=4;iIDNumber);printf(“请输入姓 n“);scanf(“%s“,s-FamilyName);printf(“请输入名 n“);scanf(“%s“,s-GivenName);printf(“请输入性别, 0 代表女, 1 代表男n“);while(k)scanf(“%d“,switch(sex1)case 0:k=0;break;case 1:k=0;break;defa

    15、ult:printf(“请重新输入性别,0 代表女,1 代表男n“);k=1;k=1;s-sex=sex1;printf(“请输入出生年 n“);while(k)scanf(“%d“,if(2012-year10k=1;printf(“请输入出生月 n“);while(k)scanf(“%d“,if(month1=1printf(“请输入出生日 n“);scanf(“%d“,printf(“请输入外语成绩n“);scanf(“%d“,printf(“请输入高数成绩n“);scanf(“%d“,printf(“请输入 c 语言成绩n“);scanf(“%d“,printf(“请输入马哲成绩n“)

    16、;scanf(“%d“,s-sum=s-score0+s-score1+s-score2+s-score3;s-average=(double)s-sum/4;return s;int ListInsert(StudentNode *L,int m,StudentNode *q) /*节点插入函数*/int j=0;StudentNode *p=L,*s;while(jnext;if(p=NULL)return 0;elses=(StudentNode*)malloc(sizeof(StudentNode);s=q;s-next=p-next;p-next=s;return 1;void qu

    17、are(StudentNode *L,int m,int n)/*m 表示分数,n 表示科目 及格分数段查询函数*/int i;StudentNode *p=L;for(i=0;inext;if(p-scoren=mvoid bujige(StudentNode *L) int i;StudentNode *p=L;for(i=0;inext;if(p-score0score1score2score3IDNumber,strcat(p-FamilyName,p-GivenName);if(p-score0score1score2score3next=NULL;r=head; head-next

    18、=NULL;while(c)printf(“请输入您要查找的菜单n1. 输入记录n2.从表中删除记录n3.显示链表中所有记录n4.按照姓名查找记录n5. 将链表中记录保存到文件中n6.从文件中读入记录n7. 计算所有学生的总分和均分n8.按班级查询显示学生总分n9.插入记录到表中n10.退出n“);/*菜单项*/scanf(“%d“,switch(caidan)case 1:h=record(h);r-next=h; /*将节点插入到链表中*/r=h;r-next=NULL;break;case 2: printf(“请输入您要删除的学号 n“);scanf(“%s“,IDNumber1);j

    19、=LocateElem(head,IDNumber1);a=ListDelete(head,j);if(a=1)printf(“删除成功n“);elseprintf(“不存在这个学号 n“);break;case 3:DispList(head);break;case 4: /*未完成 */printf(“请输入您要查询人的姓名 n“);scanf(“%s“,name);a=ListLength(head);h=(StudentNode*)malloc(sizeof(StudentNode);h=head;for(i=0;inext;if(strcmp(name,strcat(h-Family

    20、Name,h-GivenName)=0)printf(“此学生的信息为学号为 %sn 性别为%dn 出生日期为%d 年%d 月%d日n 外语成绩为%dn 高数成绩为%dnc 语言成绩为%dn 马哲成绩为%dn“,h-IDNumber,h-sex,h-BirthYear,h-BirthMonth,h-BirthDay,h-score0,h-score1,h-score2,h-score3);break;case 5:printf(“请输入您要保存位置的绝对路径 “);scanf(“%s“,filename);if(fp=fopen(filename,“wb“)=NULL)printf(“打开文件

    21、失败,无法存储 n“);exit(0);a=ListLength(head);h=(StudentNode*)malloc(sizeof(StudentNode);h=head;for(i=0;inext;fwrite(h,sizeof(StudentNode),1,fp);fclose(fp);printf(“存储成功n“);break;case 6:printf(“请输入文件所在位置的绝对路径 “); scanf(“%s“,filename);if(fp=fopen(filename,“rb“)=NULL)printf(“打开文件失败,无法存储 n“);exit(0);h=(Student

    22、Node*)malloc(sizeof(StudentNode);for(i=0;inext=h; /*将节点插入到链表中*/r=h;r-next=NULL;printf(“读取文件成功 n“);fclose(fp);break;case 7:h=(StudentNode*)malloc(sizeof(StudentNode);h=head;for(i=0;inext;h-sum=h-score0+h-score1+h-score2+h-score3;h-average=(double)h-sum/4;printf(“已经计算所有学生的总分和均分 n“);h=head;printf(“请选择以

    23、下功能 n 1.按平均成绩从高到低的次序排名n2.列出 90 分以上、80 分以上、70 分以上、60 分以上n3.统计输出各门功课的平均成绩和总平均成绩 n4.按班级统计并输出总成绩。“);scanf(“%d“,switch(caidan)case 1:for(i=0;inext;k=p-average;strcpy(IDNumber2,p-IDNumber);while(p-next!=NULL)if(knext-averagekstrcpy(IDNumber2,p-next-IDNumber);elsek=p-next-average;strcpy(IDNumber2,p-next-ID

    24、Number);p=p-next;p=head;for(j=0;jnext;r1-next=p; r1=p;r1-next=NULL;k1=k;p=head1;DispList1(head1);break;case 2:printf(“请输入要查询的课程 n1.英语n2.高数n3.c 语言n4. 马哲n5.不及格名单n“);scanf(“%d“,switch(caidan)case 1:printf(“请选择 1.90 以上名单n2.80 分以上名单n3.70 分以上名单n4.60 分以上名单n“);scanf(“%d“,switch(caidan)case 1:quare(head,90,

    25、0);break;case 2:quare(head,80, 0);break;case 3:quare(head,70, 0);break;case 4:quare(head,60, 0);break;break;case 2:printf(“请选择 1.90 以上名单n2.80 分以上名单n3.70 分以上名单n4.60 分以上名单n“);scanf(“%d“,switch(caidan)case 1:quare(head,90, 1);break;case 2:quare(head,80, 1);break;case 3:quare(head,70, 1);break;case 4:qu

    26、are(head,60, 1);break;break;case 3:printf(“请选择 1.90 以上名单n2.80 分以上名单n3.70 分以上名单n4.60分以上名单n“);scanf(“%d“,switch(caidan)case 1:quare(head,90, 2);break;case 2:quare(head,80, 2);break;case 3:quare(head,70, 2);break;case 4:quare(head,60, 2);break;break;case 4:printf(“请选择 1.90 以上名单n2.80 分以上名单n3.70 分以上名单n4.

    27、60分以上名单n“);scanf(“%d“,switch(caidan)case 1:quare(head,90, 3);break;case 2:quare(head,80, 3);break;case 3:quare(head,70, 3);break;case 4:quare(head,60, 3);break;break;case 5:bujige(head);break;break;case 3:p=head;sum0=0;sum1=0;sum2=0;sum3=0;for(i=0;inext;sum0+=p-score0;sum1+=p-score1;sum2+=p-score2;s

    28、um3+=p-score3;average10=(double)sum0/ListLength(head);average11=(double)sum1/ListLength(head);average12=(double)sum2/ListLength(head);average13=(double)sum3/ListLength(head);sum0=sum0+sum1+sum2+sum3;printf(“英语平均分为 %f,高数%f c 语言%f 马哲%fn“,average10,average11,average12,average13);printf(“总平均分为 %f“,(doub

    29、le)(average10+average11+average12+average13)/4);break;case 4:printf(“请输入您要查询的班级 “);scanf(“%s“,banji);p=head;for(i=0;inext;if(strcmp(banji,split(p-IDNumber)=0)printf(“学号为%s 的总成绩为%dn“,p-IDNumber,p-score0+p-score1+p-score2+p-score3);break;case 8:printf(“请输入您要查询的班级 “);scanf(“%s“,banji);h=(StudentNode*)m

    30、alloc(sizeof(StudentNode);h=head;a=ListLength(head);for(i=0;inext;if(strcmp(banji,split(h-IDNumber)=0)printf(“学号为 %s 的总成绩为%dn“,h-IDNumber,h-sum);break;case 9:printf(“请先录入您将要插入节点的信息 n“);h=record(h);printf(“请输入您打算将节点插入的位置 n“);scanf(“%d“,if(ListInsert(head,b,h)printf(“节点插入成功 “);else printf(“节点插入失败 “);break;case 10:c=0;break;

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:实验二 学生成绩管理系统.doc
    链接地址:https://www.docduoduo.com/p-6667508.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开