研究生初试录取管理系统课程设计报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、小结
研究生初试录取系统的源程序是用VC++编写的,其特点在于层次分明并由不同函数组成。在程序的设计过程中,运用了各种基本的函数,相互交织同时又单独作用,由函数的声明,函数的结构体,最主要的特点是运用了链表的相关知识给予连接完善,不仅仅巩固了所学的知识,同时也使自己在动手实践的过程中学习了很多,产生了很多新体会。回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整五天的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
为了更有效地进行人工检查,所编的程序应力求做到以下几点:
①应当采用结构化程序方法编程,以增加可读性;
②尽可能多加注释,以帮助理解每段程序的作用;
③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。
二、算法设计
1.设计思想
本程序的算法思想主要是链表的创建以与对链表的信息处理和文件操作。创建链表时,逐个添加数据域,借助辅助指针变量完成链表的各级移动,从而完成数据的连接。
2.数据结构
为了更好地满足题目上的信息要求,从而创建了自定义数据类型,用以存储所有与学生相关的信息。所用的自定义类型是结构体类型,表示的所有的学生信息如下:
输入学生全部信息
输入录取要求并筛选保存
程序运行结果
四、测试与调试
1、先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。
struct Exam *Check(struct Exam *head):
void Daxian(struct Exam *head):
main():
3.设计表示
根据上面的分析,可以将这个系统分为五大模块:输入学生信息(、学号、专业、是否应届以与各科成绩)、输出并保存学生信息、输入合格分数线、自动筛选合格学生以与输出并保存已排序的合格学生信息。
4.算法设计中一些新的想法:
为使程序界面不至于太累琐,我在适当的位置都添加了清屏函数system(“cls”),使视觉上更清晰,同时,在实现排序功能上,并未直接将过线成绩结果与过线成绩排序显示在程序运行当中,以实际操作着想,便把上述结果直接显示到“c:\\jieguo.txt”文档中。最后,我的菜单设计的还是挺不错的。
puts("请输入你的:");
scanf("%s",p->name);
puts("请输入你的学号:");
scanf("%d",&(p->number));
puts("请输入你的专业:");
scanf("%s",&(p->Zhuanye));
puts("是否应届(y/n):");
scanf("%s",&(p->Yingjie));
学院
计算机科学与技术系
课程设计报告
2010~2011学年第二学期
课程
C语言课程设计
课程设计名称
研究生初试录取管理系统
学生
勇
学号
1004013038
专业班级
10级计本四班
指导教师
项响琴徐静
2011年6月
一、需求分析
本课程设计的任务和要设计一个研究生初试录取管理系统,该系统要求对研究生初试录取信息进行。研究生考试课程为4门,其中数学、外语、政治为统一命题,而专业基础课则根据不同的专业由招生学校自行命题。国家对初试录取分数有总分要求(如某一年要求4门课总分应达到310分),另外还有对每门课的最低分数要求(如总分为100的试卷最低应达到40分,总分为150的试卷最低应达到65分)。编程统计初试合格的人数,并按总分由高到低的顺序输出合格考生的信息。具体功能:(1)程序运行时首先要求输入:考生,号,报考专业,是否应届生,4门课(政治、数学、外语、专业基础课)成绩。同时,这些原始数据应保存到一个文件中。(2)然后输入:录取的总分要求,各课程的最低分数要求。(3)输出要求:过线考生的,号,报考专业,是否应届生,4门课程(政治、数学、外语、专业基础课)成绩与总分,这些信息应存放到另一个文件中。(4)测试数据。程序应输入不少于10名考生的信息,其中应届生和历届生分别有若干名,并且都有合格和不合格的情况。
puts("===考生的各科成绩===\n数学英语政治专业基础");
scanf("%d%d%d%d",&(p->math),&(p->English),&(p->polig),&(p->zyjc));
//scanf("%s%d%s%s%d%d%d%d",p->name,&(p->number),p->Zhuanye,p->Yingjie,&(p->math),&(p->English),&(p->polig),&(p->zyjc));
#include<stdlib.h>
struct Exam
{
int math;
int English;
int polig;
int zyjc;
int sum;
int number;
char name[10];
char Zhuanye[10];
char Yingjie[5];
struct Exam *next;
**************************
★研究生初试录取管理系统★
**************************
※学号:1004013038※
※制作:勇※
※计本四班※
5.不足之处:缺点就是感觉自己在一开始没有做个菜单形式,既主菜单、子菜单之类的,有待于改进。
三、用户手册
程序运行菜单
(4)struct Exam *Check(struc格的具体分数要求,进行设置以便进一步筛选出合格的研究生。
(5)void Daxian(struct Exam *head):
对合格达线的学生的信息进行保存,也是保存在“c:\\jieguo.txt”文档中。
(2)void Print(struct Exam *head):
对于上一个函数程序完成的所有学生信息的输入进行一个操作:保存至“c:\\jieguo.txt”文档中。
(3)struct Exam *Line(struct Exam *head):
难度操作最大的就是这个子函数,部不仅仅是难以操作的链表与指针之间的复杂关系,而且其担负一个重要的作用,就是用链表对struct Exam *Check(struct Exam *head)函数筛选过后的合格学生的全部信息运用链表按照总分进行由大到小的排序。链表的排序思路与先前所学的知识并无差异,同样是引入中间变量t,在这里的只是t->**类的,对其每一个节点而言,进行比较的只是其实部data,而指针next则不需要变化。
学海无涯,我将继续努力,坚持不懈,相信付出就有收获,一定会取得更好的成绩。
2、参考文献
[1]郭翠英编著《C语言课程设计案例精编》:中国水利水电
[2]谭浩强编著《C程序设计题解与上机指导(第3版)》:清华大学
[3]小红慧鹏志岗等编著的《C语言大学实用课程》
附录:
#include<stdio.h>
#include<string.h>
};
struct Exam *creat() /*动态输入数据*/
{
struct Exam *head,*p,*q;
int n=0;
int ch;
head=NULL;
p=(struct Exam *)malloc(sizeof(struct Exam));
puts("========信息========\n");
struct Exam
{
int math;//数学成绩
int English;//英语成绩
int polig;//政治成绩
int zyjc;//专业基础成绩
int sum;//各科分数总和
int number;//学生学号
char name[10];//学生
char Zhuanye[10];//专业名称
如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。
有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。
(struct Exam:)
程序首先声明了一个结构体并定义了相关的变量,同时定义了链表,为下面的其他函数的调用提供了数据源,同时,其链表的定义在整个程序中起到了重要的作用。)
(1)struct Exam *creat():
定义了一个完整的链表,在其部运用了指针、链表,同时还用到了goto语句,goto语句的作用是在当键入“0”的时候,就直接结束学生信息的输入,而进入到下面一个函数环节,此链表起到了动态输入数据的作用,也就是输入所有学生的全部信息以供参考。
3、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法:
(1).将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。(2).如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。(3).也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率。(4).如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题。如有则改正之,接着修改程序。
char Yingjie[5];//是否应届
struct Exam *next;//定义指针变量
};
各结构体与函数:
struct Exam:
struct Exam *creat():
void Print(struct Exam *head):
struct Exam *Line(struct Exam *head):
2、在人工检查无误后,再上机调试。
通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。
总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确”,而是“掌握调试的方法和技术”,要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序。
比如:scanf()问题:在编译时没有报错,但是在程序运行时总是退出或者运行结果出错。再对菜单进行选择时,scanf("%c",&choice),总是接受错误,后来才发现,原来要写这样的格式:scanf(" %c",&choice);(多一个空格),应为c在scanf()函数的缓冲区误读了回车键,空格的目的是吸收回车键。我干脆就用了scanf("%d",&choice).
研究生初试录取系统的源程序是用VC++编写的,其特点在于层次分明并由不同函数组成。在程序的设计过程中,运用了各种基本的函数,相互交织同时又单独作用,由函数的声明,函数的结构体,最主要的特点是运用了链表的相关知识给予连接完善,不仅仅巩固了所学的知识,同时也使自己在动手实践的过程中学习了很多,产生了很多新体会。回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整五天的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
为了更有效地进行人工检查,所编的程序应力求做到以下几点:
①应当采用结构化程序方法编程,以增加可读性;
②尽可能多加注释,以帮助理解每段程序的作用;
③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。
二、算法设计
1.设计思想
本程序的算法思想主要是链表的创建以与对链表的信息处理和文件操作。创建链表时,逐个添加数据域,借助辅助指针变量完成链表的各级移动,从而完成数据的连接。
2.数据结构
为了更好地满足题目上的信息要求,从而创建了自定义数据类型,用以存储所有与学生相关的信息。所用的自定义类型是结构体类型,表示的所有的学生信息如下:
输入学生全部信息
输入录取要求并筛选保存
程序运行结果
四、测试与调试
1、先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。
struct Exam *Check(struct Exam *head):
void Daxian(struct Exam *head):
main():
3.设计表示
根据上面的分析,可以将这个系统分为五大模块:输入学生信息(、学号、专业、是否应届以与各科成绩)、输出并保存学生信息、输入合格分数线、自动筛选合格学生以与输出并保存已排序的合格学生信息。
4.算法设计中一些新的想法:
为使程序界面不至于太累琐,我在适当的位置都添加了清屏函数system(“cls”),使视觉上更清晰,同时,在实现排序功能上,并未直接将过线成绩结果与过线成绩排序显示在程序运行当中,以实际操作着想,便把上述结果直接显示到“c:\\jieguo.txt”文档中。最后,我的菜单设计的还是挺不错的。
puts("请输入你的:");
scanf("%s",p->name);
puts("请输入你的学号:");
scanf("%d",&(p->number));
puts("请输入你的专业:");
scanf("%s",&(p->Zhuanye));
puts("是否应届(y/n):");
scanf("%s",&(p->Yingjie));
学院
计算机科学与技术系
课程设计报告
2010~2011学年第二学期
课程
C语言课程设计
课程设计名称
研究生初试录取管理系统
学生
勇
学号
1004013038
专业班级
10级计本四班
指导教师
项响琴徐静
2011年6月
一、需求分析
本课程设计的任务和要设计一个研究生初试录取管理系统,该系统要求对研究生初试录取信息进行。研究生考试课程为4门,其中数学、外语、政治为统一命题,而专业基础课则根据不同的专业由招生学校自行命题。国家对初试录取分数有总分要求(如某一年要求4门课总分应达到310分),另外还有对每门课的最低分数要求(如总分为100的试卷最低应达到40分,总分为150的试卷最低应达到65分)。编程统计初试合格的人数,并按总分由高到低的顺序输出合格考生的信息。具体功能:(1)程序运行时首先要求输入:考生,号,报考专业,是否应届生,4门课(政治、数学、外语、专业基础课)成绩。同时,这些原始数据应保存到一个文件中。(2)然后输入:录取的总分要求,各课程的最低分数要求。(3)输出要求:过线考生的,号,报考专业,是否应届生,4门课程(政治、数学、外语、专业基础课)成绩与总分,这些信息应存放到另一个文件中。(4)测试数据。程序应输入不少于10名考生的信息,其中应届生和历届生分别有若干名,并且都有合格和不合格的情况。
puts("===考生的各科成绩===\n数学英语政治专业基础");
scanf("%d%d%d%d",&(p->math),&(p->English),&(p->polig),&(p->zyjc));
//scanf("%s%d%s%s%d%d%d%d",p->name,&(p->number),p->Zhuanye,p->Yingjie,&(p->math),&(p->English),&(p->polig),&(p->zyjc));
#include<stdlib.h>
struct Exam
{
int math;
int English;
int polig;
int zyjc;
int sum;
int number;
char name[10];
char Zhuanye[10];
char Yingjie[5];
struct Exam *next;
**************************
★研究生初试录取管理系统★
**************************
※学号:1004013038※
※制作:勇※
※计本四班※
5.不足之处:缺点就是感觉自己在一开始没有做个菜单形式,既主菜单、子菜单之类的,有待于改进。
三、用户手册
程序运行菜单
(4)struct Exam *Check(struc格的具体分数要求,进行设置以便进一步筛选出合格的研究生。
(5)void Daxian(struct Exam *head):
对合格达线的学生的信息进行保存,也是保存在“c:\\jieguo.txt”文档中。
(2)void Print(struct Exam *head):
对于上一个函数程序完成的所有学生信息的输入进行一个操作:保存至“c:\\jieguo.txt”文档中。
(3)struct Exam *Line(struct Exam *head):
难度操作最大的就是这个子函数,部不仅仅是难以操作的链表与指针之间的复杂关系,而且其担负一个重要的作用,就是用链表对struct Exam *Check(struct Exam *head)函数筛选过后的合格学生的全部信息运用链表按照总分进行由大到小的排序。链表的排序思路与先前所学的知识并无差异,同样是引入中间变量t,在这里的只是t->**类的,对其每一个节点而言,进行比较的只是其实部data,而指针next则不需要变化。
学海无涯,我将继续努力,坚持不懈,相信付出就有收获,一定会取得更好的成绩。
2、参考文献
[1]郭翠英编著《C语言课程设计案例精编》:中国水利水电
[2]谭浩强编著《C程序设计题解与上机指导(第3版)》:清华大学
[3]小红慧鹏志岗等编著的《C语言大学实用课程》
附录:
#include<stdio.h>
#include<string.h>
};
struct Exam *creat() /*动态输入数据*/
{
struct Exam *head,*p,*q;
int n=0;
int ch;
head=NULL;
p=(struct Exam *)malloc(sizeof(struct Exam));
puts("========信息========\n");
struct Exam
{
int math;//数学成绩
int English;//英语成绩
int polig;//政治成绩
int zyjc;//专业基础成绩
int sum;//各科分数总和
int number;//学生学号
char name[10];//学生
char Zhuanye[10];//专业名称
如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。
有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。
(struct Exam:)
程序首先声明了一个结构体并定义了相关的变量,同时定义了链表,为下面的其他函数的调用提供了数据源,同时,其链表的定义在整个程序中起到了重要的作用。)
(1)struct Exam *creat():
定义了一个完整的链表,在其部运用了指针、链表,同时还用到了goto语句,goto语句的作用是在当键入“0”的时候,就直接结束学生信息的输入,而进入到下面一个函数环节,此链表起到了动态输入数据的作用,也就是输入所有学生的全部信息以供参考。
3、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法:
(1).将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。(2).如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。(3).也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率。(4).如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题。如有则改正之,接着修改程序。
char Yingjie[5];//是否应届
struct Exam *next;//定义指针变量
};
各结构体与函数:
struct Exam:
struct Exam *creat():
void Print(struct Exam *head):
struct Exam *Line(struct Exam *head):
2、在人工检查无误后,再上机调试。
通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。
总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确”,而是“掌握调试的方法和技术”,要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序。
比如:scanf()问题:在编译时没有报错,但是在程序运行时总是退出或者运行结果出错。再对菜单进行选择时,scanf("%c",&choice),总是接受错误,后来才发现,原来要写这样的格式:scanf(" %c",&choice);(多一个空格),应为c在scanf()函数的缓冲区误读了回车键,空格的目的是吸收回车键。我干脆就用了scanf("%d",&choice).