1、学生成绩管理系统课程设计报告专 业: 信息科学与工程学院 班 级: 姓 名: 指导教师:学 号:课程设计报告一、 课程设计题目学生成绩管理系统1、需要处理的基础数据 学生基本信息:如班级、学号、姓名、性别、年龄等。 学生选修课程的基本信息:课程编号、课程名称、学分、考试成绩、平时成绩、综合成绩(考试成绩*0.7+平时成绩*0.3)等。主菜单2、系统的基本功能 数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息; 数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息; 数据的插入:插入某个学生信息; 数据的查询:如按学号查询、按姓名查询等; 数据的删除:如删除指
2、定学号、或者指定姓名的学生及其选修课程信息; 平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息; 列出不及格学生清单(学号、姓名、不及格的课程和成绩)。 考虑用文件把数据保存起来(可选)。3、链表struct stu /*定义学生基本信息结构体*/ int i; /*以输入的顺序来确定的学生序号*/ char num11; char classnum5; char name128; char sex32; int age; float ave; struct stu *next; int n=0; /*学生人数*/ struct stu *head=0;s
3、truct stu1 /*定义学生选修课信息结构体*/ char lessonnum11; char lessonname256; float score; float testgrade; float commongrade; float grade; struct stu1 *next;int m;struct stu1 *amax_num ;/*定义一个指针数组来记住课程链表地址*/ /*- 数据的录入程序 -*/ void create(void) /*建立学生基本信息链表*/ n=0; struct stu *p1,*p2; char ch,ch1; struct stu1 *cre
4、ate1(void); do n=n+1; an=0; system(cls); p1=(struct stu *)malloc(LEN); printf(n学号:); scanf(%s,p1-num); printf(n班级:); scanf(%s,p1-classnum); printf(n姓名:); scanf(%s,p1-name) ; printf(n性别:); scanf(%s,p1-sex); printf(n年龄:); scanf(%d,&p1-age); if(n=1)head=p1; else p2-next=p1; p2=p1; printf(n是否输入选修课信息(y/n
5、)n); fflush(stdin); /*清空输入缓冲区*/ ch1=getchar(); if(ch1=y|ch1=Y) an=create1(); /*根据序号来记忆课程链表地址*/ p1-i=n; system(cls); printf(n是否继续输入另一学生信息(y/n)n); fflush(stdin); /*清空输入缓冲区*/ ch=getchar(); while(ch=y|ch=Y); p2-next=0;struct stu1 *create1(void) /*建立课程链表*/ m=0; struct stu1 *p1,*p2; char ch; struct stu1 *
6、head=0; do m=m+1; system(cls); p1=(struct stu1 *)malloc(LEM); printf(n课程编号:); scanf(%s,p1-lessonnum); printf(n课程名称:); scanf(%s,p1-lessonname); printf(n学分:); scanf(%f,&p1-score); printf(n考试成绩:); scanf(%f,&p1-testgrade); printf(n平时成绩:); scanf(%f,&p1-commongrade); p1-grade=p1-testgrade*0.7+p1-commongra
7、de*0.3; printf(n综合成绩:%-6.1f,p1-grade); if(m=1)head=p1; else p2-next=p1; p2=p1; printf(n是否继续输入另一课程信息(y/n)n); fflush(stdin); /*清空输入缓冲区*/ ch=getchar(); while(ch=y|ch=Y); p2-next=0; return(head);二、 设计思路界面:界面的显示由循环语句和switch语句来控制完成。数据的录入:运用链表进行数据的存储,由于要录入的数据有两种即学生的基本信息和学生的选修课程信息,本系统采用两个链表分别存储数据,采用数组将两个链表联
8、系起来,运用循环语句和判断语句来进行数据的录入。作者感到本功能设计中的难点在于将两个链表联系起来,解决方案是采用一个指针数组来将第二个链表中每个节点地址存储起来,进而将两个链表联系起来。信息的修改:本系统采用的是按学号查找信息,系统采用一个由判断语句和循环语句构成的查询函数struct stu *findnum(void)来提供信息存储地址;再按照地址来进行修改,其中采用switch语句和循环语句来控制使系统能够提供选择修改的功能。在这一功能的设计中,作者感到课程信息的修改中的添加课程信息功能是一个难点,解决方案是按插入方案来进行设计。插入信息:本系统采用的是按学号顺序来进行插入的,在这一功能
9、的设计中,首先在开辟一个结构体空间将插入学生的信息存储于其中,在采用判断语句和循环语句来查找该条信息应该插入位置的地址,将上一结点的下行指针指向本结点,再将该节点的下行指针指向下一个结点从而达到插入信息的目的。在这一功能的设计中作者感到插入的具体算法是个难点,本系统采用的教材书本上的方法。查询信息:本功能实现是调用struct stu *findnum(void)函数查找该条信息的地址,然后再采用for循环进行信息的输出,本功能的实现比较简单,难点在于对函数的调用的灵活运用。删除信息:系统采用按学号删除的方案,在这一功能的设计中我没有采用直接调用struct stu *findnum(void
10、)函数,而是又重写查找地址程序,这是出于考虑系统功能的更好实现而采用的举措。具体删除算法采用该节点上一个结点的下行指针直接指向该结点下一个结点从而达到删除该结点的目的。在此功能的设计中,本作者感到难点不在于算法而在于思维设计的是否缜密。计算平均成绩:本功能的实现需要首先计算各个学生的平均成绩,再按照平均成绩进行排序。这两个过程的设计排序是个难点,因为本系统存储结构为链表,在排序方面较数组有很大区别,在作者看来比较困难,解决方案是运用一个指针型数组将每个结点的地址存在其中,再按照该指针指向的平均成绩来排序数组中的地址,再按照数组中的地址顺序来输出信息,间接达到排序的目的。不及格学生清单:判断语句
11、和循环语句的结合运用以达到列出清单的目的,本功能的实现不难,难在于准确控制。三、 系统流程主函数界面输入学生信息修改学生信息查询学生信息删除学生信息插入学生信息计算平均分列出不及格学生清单保存到文件 四、 程序代码 #include#include#include#define LEN sizeof(struct stu)#define LEM sizeof(struct stu1) #define max_num 256struct stu /*定义学生基本信息结构体*/ int i; /*以输入的顺序来确定的学生序号*/ char num11; char classnum5; char n
12、ame128; char sex32; int age; float ave; struct stu *next; int n=0; /*学生人数*/ struct stu *head=0;struct stu1 /*定义学生选修课信息结构体*/ char lessonnum11; char lessonname256; float score; float testgrade; float commongrade; float grade; struct stu1 *next;int m;struct stu1 *amax_num ;/*定义一个指针数组来记住课程链表地址*/ /*- 数据的
13、录入程序 -*/ void create(void) /*建立学生基本信息链表*/ n=0; struct stu *p1,*p2; char ch,ch1; struct stu1 *create1(void); do n=n+1; an=0; system(cls); p1=(struct stu *)malloc(LEN); printf(n学号:); scanf(%s,p1-num); printf(n班级:); scanf(%s,p1-classnum); printf(n姓名:); scanf(%s,p1-name) ; printf(n性别:); scanf(%s,p1-sex)
14、; printf(n年龄:); scanf(%d,&p1-age); if(n=1)head=p1; else p2-next=p1; p2=p1; printf(n是否输入选修课信息(y/n)n); fflush(stdin); /*清空输入缓冲区*/ ch1=getchar(); if(ch1=y|ch1=Y) an=create1(); /*根据序号来记忆课程链表地址*/ p1-i=n; system(cls); printf(n是否继续输入另一学生信息(y/n)n); fflush(stdin); /*清空输入缓冲区*/ ch=getchar(); while(ch=y|ch=Y);
15、p2-next=0;struct stu1 *create1(void) /*建立课程链表*/ m=0; struct stu1 *p1,*p2; char ch; struct stu1 *head=0; do m=m+1; system(cls); p1=(struct stu1 *)malloc(LEM); printf(n课程编号:); scanf(%s,p1-lessonnum); printf(n课程名称:); scanf(%s,p1-lessonname); printf(n学分:); scanf(%f,&p1-score); printf(n考试成绩:); scanf(%f,&
16、p1-testgrade); printf(n平时成绩:); scanf(%f,&p1-commongrade); p1-grade=p1-testgrade*0.7+p1-commongrade*0.3; printf(n综合成绩:%-6.1f,p1-grade); if(m=1)head=p1; else p2-next=p1; p2=p1; printf(n是否继续输入另一课程信息(y/n)n); fflush(stdin); /*清空输入缓冲区*/ ch=getchar(); while(ch=y|ch=Y); p2-next=0; return(head);/*-*/struct s
17、tu *findnum(void) char num11; struct stu *p1; struct stu1 *p2; char c; printf(n输入学生学号:); fflush(stdin); gets(num); struct stu *fa; fa=head; if(head=0) printf(nlist nulln);goto end; while(strcmp(fa-num,num)!=0) if(fa-next=0)break; fa=fa-next; if(strcmp(fa-num,num)=0)return fa; else printf(%s cant be
18、found!n,num); end: return 0;/*- 查询信息模块 -*/void search(void) system(cls); char ch2; struct stu *findnum(void); struct stu *p; struct stu1 *p1; p=findnum(); if(p=0) goto end; p1=ap-i; printf(n%17s,学号); printf(%15s,班级); printf(%16s,姓名); printf(%15s,性别); printf(%15s,年龄); printf(n%17s,p-num); printf(%15s
19、,p-classnum); printf(%16s,p-name) ; printf(%15s,p-sex); printf(%15d,p-age); printf(n*); printf(n%11s,课程编号); printf(%19s,课程名称); printf(%9s,学分); printf(%13s,考试成绩); printf(%13s,平时成绩); printf(%13s,综合成绩); for(;p1!=0;) printf(n%11s,p1-lessonnum); printf(%19s,p1-lessonname); printf(%9.1f,p1-score); printf(
20、%13f,p1-testgrade); printf(%13f,p1-commongrade); printf(%13f,p1-grade); p1=p1-next; end: printf(n按任意键退出); ch2=getchar();/*-修改模块-*/ void modify(void) struct stu *findnum(void); char selmenu,selmenu1; system(cls); char ch2; char ch3; char ch4; char ch6; char ch7; char ch8; struct stu *findnum(void); s
21、truct stu *p; struct stu1 *p1; struct stu1 *p2; char lessonno11; p=findnum(); if(p=0) printf(n按任意键退出); fflush(stdin); scanf(%c,&ch2); else p1=ap-i; printf(n%17s,学号); printf(%15s,班级); printf(%16s,姓名); printf(%15s,性别); printf(%15s,年龄); printf(n%17s,p-num); printf(%15s,p-classnum); printf(%16s,p-name)
22、; printf(%15s,p-sex); printf(%15d,p-age); printf(n*); printf(n%11s,课程编号); printf(%19s,课程名称); printf(%9s,学分); printf(%13s,考试成绩); printf(%13s,平时成绩); printf(%13s,综合成绩); for(;p1!=0;) printf(n%11s,p1-lessonnum); printf(%19s,p1-lessonname); printf(%9.1f,p1-score); printf(%13f,p1-testgrade); printf(%13f,p1
23、-commongrade); printf(%13f,p1-grade); p1=p1-next; p1=ap-i; printf(n按任意键开始修改); scanf(%c,&ch2);do system(cls); printf(nn); printf(ttt1.修改学号); printf(tt2.修改班级n); printf(ttt3.修改姓名); printf(tt4.修改性别n); printf(ttt5.修改年龄); printf(tt6.修改选修课程信息n); printf(ttt0.退出); printf(nttt请输入功能选择编号(0-6):); scanf(%c,&selme
24、nu); switch(selmenu) case 1: system(cls); printf(学号:%s,p-num); printf(n输入新的数据:); scanf(%s,p-num); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 2: system(cls); printf(班级:%s,p-classnum); printf(n输入新的数据:); scanf(%s,p-classnum); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8);
25、break; case 3: system(cls); printf(姓名:%s,p-name); printf(n输入新的数据:); scanf(%s,p-name); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 4: system(cls); printf(性别:%s,p-sex); printf(n输入新的数据:); scanf(%s,p-sex); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 5: system(
26、cls); printf(年龄:%d,p-age); printf(n输入新的数据:);scanf(%d,&p-age); printf(n修改成功!n按任意键退出);fflush(stdin); scanf(%c,&ch8); break; case 6: do system(cls); printf(nnttt1.添加选修课程信息); printf(tt2.修改已有课程信息); printf(nttt0.退出); printf(nttt请输入功能选择编号(0-2):); fflush(stdin); scanf(%c,&ch6); if(ch6=0) break; if(ch6=1) p2
27、=(struct stu1 *)malloc(LEM); printf(nttt课程编号:); scanf(%s,p2-lessonnum); printf(nttt课程名称:); scanf(%s,p2-lessonname); printf(nttt学分:); scanf(%f,&p2-score); printf(nttt考试成绩:); scanf(%f,&p2-testgrade); printf(nttt平时成绩:); scanf(%f,&p2-commongrade); p2-grade=p2-testgrade*0.7+p2-commongrade*0.3; printf(ntt
28、t综合成绩:%-6.1f,p2-grade); p2-next=p1; ap-i=p2; p1=ap-i; printf(nttt按任意键退出); fflush(stdin);scanf(%c,&ch7) ; if(ch6=2) if(p1=0) printf(无任何课程信息); goto end; printf(nn输入要修改课程的编号:); fflush(stdin); scanf(%s,lessonno); while(strcmp(p1-lessonnum,lessonno)!=0) if(p1-next=0)break; p1=p1-next; if(strcmp(p1-lesson
29、num,lessonno)=0) printf(n%11s,课程编号); printf(%19s,课程名称); printf(%9s,学分); printf(%13s,考试成绩); printf(%13s,平时成绩); printf(%13s,综合成绩); printf(n%11s,p1-lessonnum); printf(%19s,p1-lessonname); printf(%9.1f,p1-score); printf(%13f,p1-testgrade); printf(%13f,p1-commongrade); printf(%13f,p1-grade); printf(n按任意键
30、进行修改); fflush(stdin); scanf(%c,&ch3); do system(cls); printf(nn); printf(ttt1.修改课程编号); printf(tt2.修改课程名称n); printf(ttt3.修改学分); printf(tt4.修改考试成绩n); printf(ttt5.修改平时成绩); printf(ttt0.退出); printf(nttt请输入功能选择编号(0-5):); scanf(%c,&selmenu1); switch(selmenu1) case 1: printf(n输入新的课程编号:); scanf(%s,p1-lessonn
31、um); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 2: printf(n输入新的课程名称:); scanf(%s,p1-lessonname); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 3: printf(n输入新的学分:); scanf(%f,&p1-score); printf(n修改成功!n按任意键退出); fflush(stdin); scanf(%c,&ch8); break; case 4: printf(n输入新的考试成绩:);scanf(%f,&p1-testgrade); printf(n修改成功!n按任意键退出);fflush(stdin); scanf(%c,&ch8);