《C程序设计基础课程设计设计报告_链表建立学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C程序设计基础课程设计设计报告_链表建立学生成绩管理系统.docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、设计题目: 班 级:姓 名: 学 号:完成日期:1目 录目 录11.课程设计目的和要求11.1课程设计学生成绩管理系统的题目要求12.课程设计任务内容22.1学生成绩管理系统主要功能实现方式22.1.1链表处理数据22.1.2文件读写存储学生信息22.2创建数据库管理系统(DBMS)23.详细设计说明33.1题目设计分析33.1.1需求分析33.1.2解题思路分析33.2设计过程33.2.1链表(结构体)定义33.2.2函数编写33.2.3编译与调试54.软件使用说明64.1主界面介绍64.2创建学生信息数据表64.3增加数据信息64.4删除数据信息64.5修改信息64.6查找信息64.7统计
2、功能75.课程设计心得与体会75.1概述75.2心得与体会75.2.1数据库管理系统链表+文件读写75.2.2指针与内存86.参考文献87.附录:部分程序清单8编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第21页 共23页1. 课程设计目的和要求1.1课程设计学生成绩管理系统的题目要求学生包含以下信息项:学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。系统的主要功能包括:1. 创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后按学号对学生信息进行排序,并将排序后的学生成绩信息存储到一个二进制文件中。2. 增加学生信息,在原有学
3、生信息文件的基础上增加新的学生成绩信息,要求:增加后的学生信息仍按学号排序,并继续保存至原文件。3. 删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。4. 修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。5. 按不同条件对学生信息进行查询操作,输出满足条件的学生信息。(1) 按学号查询,输入一个学号,输出对应的学生信息。(2) 按姓名查询,包括精确查询(输入全名),
4、模糊查询(输入姓)。(3) 按学院查询,输入学院名称,输出该学院的全部学生的信息。(4) 按班级查询,输入班级名称,输出该班级的全部学生的信息。6. 按不同条件对学生成绩进行统计工作。(两个表)(1) 按总分对学生信息进行排序(由高到低),输出排序后的信息,并将排序后的学生信息存放到一个新的二进制文件中。(2) 按平均分统计各个分数段的学生人数(n)(不及格,60-69,70-79,80-89,90-100)。(3) 分别找出3门课程成绩最高的学生,并输出他们的信息。(4) 分别统计出3门课程的不及格率(n/N),并输出。2. 课程设计任务内容2.1学生成绩管理系统主要功能实现方式2.1.1链
5、表处理数据学生作为某一对象,其自身包含不同属性,而每个属性的类型并不完全相同,因而,我们必须通过创建结构体类型的变量来定义学生信息。而用户在输入学生信息时,并不一定指定学生人数,因此,需要系统动态分配内存给节点,从而达到随时增删的目的。但,结构体仅能记录单个学生的信息,并不能是所有信息产生联系,故,必须通过定义结构体指针变量,来将全部的学生信息串连在一起。2.1.2文件读写存储学生信息在学生成绩管理系统中输入的学生信息只暂时存储于内存中,当学生成绩管理系统关闭时,内存会自动清除已输入的信息,从而使学生信息丢失。所以,必须将学生信息存入指定文件中才能实现数据的存储。2.2创建数据库管理系统(DB
6、MS)学生成绩管理系统的实质即简易的数据库管理系统,通过对数据的增删改查,而创建出特定的数据处理仓库。数据库管理系统(DBSM)可以对存入的数据进行统一的管理和控制,具有数据的完整性,数据的安全性,并发控制,和数据库的恢复等功能。利用关系模型和关系数据库系统,使数据以二维表的形式表示,数据结构简单清晰,易学易用。3. 详细设计说明3.1题目设计分析3.1.1需求分析学生成绩管理系统是应用于学生考试成绩存储的简易系统。通过该系统可以创建、增加、删除、查询学生的个人信息,统计学生考试情况,并可以存储到指定目录的文件中,以达到创建数据库管理系统的目的。3.1.2解题思路分析首先,分析学生成绩管理系统
7、的主要功能模块。该系统组要分为两大模块:一是,对数据信息的增删改查;二是,对已有信息的统计。其次,分析该系统的实现方式。该系统为链表的具体应用,需要熟练掌握链表及文件读写的相关知识。另外,需要将每个具体功能编写为单一的被调函数,主函数实现输入输出功能,以达到优化程序的目的。最后,运行并调试程序,更改程序错误,优化程序功能。3.2设计过程3.2.1链表(结构体)定义struct nodeint num;char namN;char colN;char claN;float math;float eng;float clan;float sum;float ave;struct node *nex
8、t;3.2.2函数编写l 主函数void main()主函数void main()实现各功能的选择,分为创建、增加、删除、修改、查询,以及统计等功能,而各功能分别编写为被调函数。利用while循环实现用户的人性化操作,以达到结束程序或继续运行程序的目的。创建、增加、删除、修改、查询、统计等被调函数,都须写于主函数之上;利用switch()函数实现各功能的选择。对数据的增、删、改操作,必须返回结构退指针,而查找功能只需要输出即可。l 创建链表struct node *creat(void)创建新链表函数,返回链表头指针。定义结构体指针变量“struct node *h=NULL, *p,*q,*
9、r;”。h为头指针,及数据表的表头;动态分配内存给p,令其始终指向新节点;而q,r而中间辅助指针,是链表按要求链接。在创建链表的过程中,动态分配内存给指针p,分别输入学生信息,并进行数据计算与赋值。在节点连接的过程中,通过对输入学号大小的比较while(p-numq-num)&(q-next!=NULL),按学号排序连接节点,使学号以升序排列。在输入玩一个信息之后,会有提示信息询问是否继续。l 增加新节点struct node *insert(struct node *h)增加过程与创建过程大致相同,唯一不同的是,增加过程需要得到形参继续增加学生信息。l 删除节点struct node *de
10、l(struct node *h,int n)删除节点实质就是,将链表指针所指向的地址在内存中擦除。主要分为两种情况:删除头指针所指向的节点地址和删除中间或结尾的节点地址。首先,需要判断所删除节点的地址“while(p-num!=n)&(p!=NULL)”,然后,进行逻辑判断,是否存在该学号的节点,以及判断是否为头指针,并将p的内存空间释放掉:“if(p=h)h=p-next;elseq-next=p-next;free(p);M-;printf(M:%dn,M);puts(Delete!);” 。l 修改节点struct node *modify(struct node *h)即删除和增加过
11、成功地结合。进行l 查找节点查找节点,即根据所查询的信息查找记录,需要定义结构体指针变量p,进行逻辑判断即可。while(strcmp(p-nam,nam)!=0)&(p-next!=NULL)p=p-next;if(strcmp(p-nam,nam)=0)l 统计平均分分数段需要根据创建(或增加)时计算出的平均分各分数段的个数,来统计。分为A,B,C,D,E五个分数段,若链表中的平均分满足判断条件,如if(p-ave=90)&(p-avesum=max),这样即使是相同分数的学生也可以同时输出到屏幕上。l 统计不及格率需要定义全局变量M,然后根据各科不及格的人数n计算出不及格率:“print
12、f(The RATE of %c-Failer:%.2f%cn,c,(a2/(float)M)*100,37);”l 按最高分排序按最高分排序需要建立新的链表。然后根据总分成绩进行排序。struct node *h1=NULL,*p,*a=NULL,*b,*c=NULL; struct node *sta_sor(struct node *h) struct node *h1=NULL,*p,*a=NULL,*b,*c=NULL;if(h=NULL)return NULL;/creat new link point/h1 : a,b,c;/b is the latest copied info
13、rmationp=h;/start to copy&compare theinformation constantlywhile(p != NULL)b = copyasta(p);if(c=NULL)h1 = b;/if h1 is null,insert b/printf(insert %d before h1n,b-num);elseif(a = NULL & b-sum = c-sum)b-next = c;h1 = b;/printf(2在最前面插入%dn,b-num);c = h1;a=NULL; p=p-next;continue;a=h1;c=a-next; doif(c=NU
14、LL)a-next=b; break; /compareif(b-sum = c-sum)b-next = c;a-next = b;break;a = c;c = c-next;while(c != NULL);c = h1;a = NULL;p=p-next;return h1;3.2.3编译与调试在VC+6.0的编译环境下,当程序编写完运行时,须先按F7,检查语法错误,之后按CTRL+F5运行程序,再根据程序运行结果进行调试,以优化程序。在程序调试过程中,如果要对某个被调函数进行调试,可以标记该被调函数的某一句,之后按F10开始调试,如果不运行为标记的函数,可直接按F5,进行操作,进入标
15、记过的函数之后,再逐句检查错误。逐句调试程序时,可以根据watch等窗口查看指定变量的值,再根据程序需要改写程序,以避免出现栈溢出等错误。4. 软件使用说明4.1主界面介绍打开程序进入主界面,出现项目编号,以及文字提示。可根据个人需要输入项目编号,单机回车进入。4.2创建学生信息数据表在主界面输入“1”单击回车后即可进入穿件数据表界面。然后根据提示信息输入学生信息,每个信息之间用空格(或回车符间隔开)。结束输入后,系统自动返回学生信息数据表,并询问存储文件地址。结束信息输入后,系统会提示,是否继续运行学生成绩管理系统,用户根据自己需要输入y或n,从而继续或退出程序。4.3增加数据信息界面与创建
16、相似,都是按照用户需求逐一输入学生信息,信息输入结束后,系统自动返回学生信息数据表,并输出到屏幕上。不同的是增加数据信息不会删除原有信息,而创建数据信息会返回新的链表表头,从而创建新的链表,而得到新的学生信息数据表。4.4删除数据信息在主界面选择项中,选择3.DELETE,进入删除功能。按照提示信息,删除学生的学号。程序自动删除后提示是否继续删除,否则,提示不存在,并询问是否继续删除。4.5修改信息修改信息是删除和增加的合成,功能与界面类似。4.6查找信息查找信息功能,分四个模块,分别是按学号,姓名,学院,班级查找。根据提示信息进入相应模块,即可查询学生信息。4.7统计功能根据用户需要,分别包
17、含平均分分数段统计,各科不及格率统计,最高分学生信息查询,以及按照总分排序等功能。用户可以根据提示信息,进入相应功能模块并进行操作。5. 课程设计心得与体会5.1概述本次程序设计最大的收获主要有两点:1.对数据库的创建及原理有了更进一步了解,2.对内存与指针更进一步了解。5.2心得与体会5.2.1数据库管理系统链表+文件读写数据库,是存放大量数据的地方,而现今最流行的数据库模型是关系型数据库。所谓关系型数据库,就是存放具体信息的二维数据表,该二维表的行称为记录,列称为字段。记录存放的是某个具体的对象,而字段存放的是对象所具有的属性。联系链表的实质我们就可以发现:其实,一个链表就是一个数据表,链
18、表中的每一个节点就是数据表中的记录(对象),而链表的数据成员就是数据表记录(对象)中对应的字段(属性)。因此,我们可以明白,其实链表就是要记录过个对象不同属性的一种变量类型。而链表的操作过程都是在内存中完成的,不能存储到磁盘中,因此,就产生了另外一种C语言的功能:文件读写。文件读写,是将内存中得到的数据存储到磁盘中,以达到长期的数据存储和处理的目的。这样,我们不难发现,其实,链表+文件读写就是简易的数据库管理系统(DBMS)。自然,这也是学习链表和文件读写的根本目的。因为,只有熟练掌握链表和文件读写,才能更好地进行数据挖掘,和数据开发,才能对大量数据进行高效率的处理。5.2.2指针与内存在刚开
19、始学习C语言之时,我一直有一个疑问:“为什么还要保留这种会造成内存溢出的指针概念?”现在,我终于明白了!指针变量,简称“指针”,其实就是存储内存地址的变量。我们知道栈存储区为静态变量和形参分配内存空间,而堆存储区为函数动态分配内存。而内存分配时其地址是随机的,比如0xcccccccc,而该数是超越内存大小的,是随机分配的,会导致内存溢出,无法进行程序。因此,程序员必须清楚指针所指向的内存地址,否则会出现内存错误。然而,即使指针会导致内存出错,也不能否定指针的作用。因为,指针是联系程序和内存的关键,进行基础的内存操作时,必须使用指针。譬如,将已建成的链表,以某个链表中的成员(属性)重新排序,就必
20、须通过指针进行链表的重建。指针是基础操作,而基础操作才是程序员的工作根本。C语言是低级的高级语言,可以通过指针的使用,来操作内存。因而,指针概念的保留是必然的。6. 参考文献程序设计基础(C语言)7. 附录:部分程序清单#includestdio.h#includestdlib.h#includestring.h#define N 100int M=0;/amount of stustruct nodeint num;char namN;char colN;char claN;float math;float eng;float clan;float sum;float ave;struct
21、node *next;#define L sizeof(struct node)/the length of struct node/list the link member informatinvoid list(struct node *h)struct node *p;if(h=NULL)puts(Empty!);elsep=h;puts(The students Information:nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);while(p!=NULL)printf(%dt%st%st%st%.2ft%.2ft%.2f
22、t%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);p=p-next;void list2(struct node *h)struct node *p;if(h=NULL)puts(Empty!);elsep=h;puts(The students Information:nTotaltNo.tNametCollegetClasstMathtEnglishtC_lantAve);while(p!=NULL)printf(%.2ft%dt%st%st%st%.2ft%.2ft%.2ft%.2fn,p-sum,p
23、-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-ave);p=p-next;/creat a new linkliststruct node *creat(void)struct node *h=NULL, *p,*q,*r;char c=y;while(c=y|c=Y)puts(Input the students Information:nNumbertNametCollegetClasstMathtEnglishtC_language);p=(struct node *)malloc(L);M+;printf(M:%dn,M);scanf(%d%
24、s%s%s%f%f%f,&p-num,&p-nam,&p-col,&p-cla,&p-math,&p-eng,&p-clan,&p-sum,&p-ave);getchar();p-next=NULL;float sum,ave;sum=p-math + p-eng + p-clan;ave=sum/3;p-sum=sum;p-ave=ave;if(h=NULL)h=p;elseq=h;while(p-numq-num)&(q-next!=NULL)r=q;q=q-next;if(p-numnum)if(q=h)h=p;elser-next=p;p-next=q;elseq-next=p;put
25、s(Continue CREAT or not?(y/n);scanf(%c,&c);getchar();return h;/insert information into the created-linkliststruct node *insert(struct node *h)struct node *p,*q,*r;char c=y;while(c=y|c=Y)puts(Insert Information:nNumbertNametCollegetClasstMathtEnglishtC_language);p=(struct node *)malloc(L);M+;printf(M
26、:%dn,M);scanf(%d%s%s%s%f%f%f,&p-num,&p-nam,&p-col,&p-cla,&p-math,&p-eng,&p-clan,&p-sum,&p-ave);getchar();p-next=NULL;float sum,ave;sum=p-math + p-eng + p-clan;ave=sum/3;p-sum=sum;p-ave=ave;if(h=NULL)h=p;elseq=h;while(p-numq-num)&(q-next!=NULL)r=q;q=q-next;if(p-numnum)if(q=h)h=p;elser-next=p;p-next=q
27、;elseq-next=p;puts(Continue INSERT or not?(y/n);scanf(%c,&c);getchar();return h;/delete the informationstruct node *del(struct node *h,int n)struct node *p,*q;p=h;while(p-num!=n)&(p!=NULL)q=p;p=p-next;if(p-num=n)if(p=h)h=p-next;elseq-next=p-next;free(p);M-;printf(M:%dn,M);puts(Delete!);elseputs(Cant
28、 Delete!);return h;/modifystruct node *modify(struct node *h)int n;puts(Which students information do you want to modify?nInput the No.:);scanf(%d,&n);getchar();h=del(h,n);h=insert(h);return h;/search the information by numberstruct node *sea_num(struct node *h)int n;puts(Input the Students Number:)
29、;scanf(%d,&n);getchar();struct node *p;p=h;while(p-num!=n)&(p-next!=NULL)p=p-next;if(p-num=n)puts(nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);printf(%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);elseputs(Error!nCant Find the Students Number!
30、);return h;/search the information by namestruct node *sea_nam(struct node *h)struct node *p;char namN;puts(Input the Students Name:);scanf(%s,nam);getchar();p=h;while(strcmp(p-nam,nam)!=0)&(p-next!=NULL)p=p-next;if(strcmp(p-nam,nam)=0)puts(nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);print
31、f(%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);elseputs(Error!nCant Find the Students Name!);return h;/search the information by collegestruct node *sea_col(struct node *h)struct node *p;char namN;puts(Input the Students College:);scanf(%s,nam);getch
32、ar();p=h;while(strcmp(p-nam,nam)!=0)&(p-next!=NULL)p=p-next;if(strcmp(p-col,nam)=0)puts(nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);printf(%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);elseputs(Error!nCant Find the Students College!);return
33、h;/search the information by classstruct node *sea_cla(struct node *h)struct node *p;char namN;puts(Input the Students Class:);scanf(%s,nam);getchar();p=h;while(strcmp(p-cla,nam)!=0)&(p-next!=NULL)p=p-next;if(strcmp(p-nam,nam)=0)puts(nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);printf(%dt%s
34、t%st%st%.2ft%.2ft%.2ft%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);elseputs(Error!nCant Find the Students Class!);return h;/search_displaystruct node *sea_dis(struct node *h)int k;int c=y;puts(*SEARCH*);puts(Choose the students information to search:);puts(nttt1.NUMBERt2.NAMEn
35、ttt3.COLLEGEt4.CLASSn);puts(Input the Item No. first:);scanf(%d,&k);getchar();switch(k)case 1:puts(*NUMBER SEARCH*);while(c=y|c=Y)h=sea_num(h);puts(Continue NUMBER SEARCH or not?(y/n);scanf(%c,&c);getchar();break;case 2:puts(*NAME SEARCH*);while(c=y|c=Y)h=sea_nam(h);puts(Continue NAME SEARCH or not?
36、(y/n);scanf(%c,&c);getchar();break;case 3:puts(*COLLEGE SEARCH*);while(c=y|c=Y)h=sea_col(h);puts(Continue COLLEGE SEARCH or not?(y/n);scanf(%c,&c);getchar();break;case 4:puts(*CLASS SEARCH*);while(c=y|c=Y)h=sea_cla(h);puts(Continue CLASS SEARCH or not?(y/n);scanf(%c,&c);getchar();break;default:puts(
37、Error!);return h;/statistics of the amount of averagevoid sta_ave(struct node *h)struct node *p;int i;int a5=0;p=h;while(p!=NULL)if(p-ave=90)&(p-aveave=80)&(p-aveave=70)&(p-aveave=60)&(p-aveave=0)&(p-avenext;puts(Tips:nA:90-100tB:80-89tC:70-79tD:60-69tE:Failedn);int c=65;for(i=0;isummax)max=p-sum;p=
38、p-next;p=h;puts(The HighestScore-Students Information are as follows:);puts(nNo.tNametCollegetClasstMathtEnglishtC_lantTotaltAve);while(p!=NULL)if(p-sum=max)printf(%dt%st%st%st%.2ft%.2ft%.2ft%.2ft%.2fn,p-num,p-nam,p-col,p-cla,p-math,p-eng,p-clan,p-sum,p-ave);p=p-next;/statisticsvoid sta_fai(struct n
39、ode *h)struct node *p;int a3=0,c=65;puts(Tips:nA:MathtB:EnglishtC:C-language);p=h;while(p!=NULL)if(p-mathnext;printf(The RATE of %c-Failer:%.2f%cn,c,(a0/(float)M)*100,37);p=h;while(p!=NULL)if(p-engnext;c+;printf(The RATE of %c-Failer:%.2f%cn,c,(a1/(float)M)*100,37);p=h;while(p!=NULL)if(p-clannext;c+;printf(The RATE of %c-Failer:%.2f%cn,c,(a2/(float)M)*100,37);/copy the previous linkliststruct node *copyasta(st