C语言课程设计报告—校际运动会管理系统.doc
C语言课程设计校际运动会管理系统C语言程序设计报告书 一、C 语言程序设计的目的 巩固已学习的内容,复习程序设计和上机调试的基本方法方法。通过学习一个综合程序的设计与编写,使学生能够在较短的时间内掌握综合程序设计的基本步骤和方法。通过学习课本上的习题,举一反三,学会构建程序的柜架以及部分常用的算法代码的收发室。在加强的基础上,动手两个程序的完整设计与编写。二、 课程设计报告正文(一)、题目(1)信息初始化,输入:N-参赛学校总数,M-男子竞赛项目数,W-女子竞赛项目数;各项目名次取法有以下几种:1取前5名:第1名得分 7,第2名得分 5,第3名得分 3,第4名得分 2,第5名得分 1.2取前3名:第1名得分 5,第2名得分 3,第3名得分 2.3用户自定义:各名次权值由用户指定。(2)提醒用户填写比赛结果,输入各项目获奖运动员的信息。(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩,生成团体总分报表,查看参赛学校信息和比赛项目信息等。提示(1)总体设计:系统设计为信息输入模块、比赛结果录入模块和查询模块三个模块。(2)数据结构采用结构体数组,包括学校、项目、运动员三个结构体。比如学校结构体成员包括学校校名、竞赛项目、得分项目结构体成员包括项目名、权值。(二)题目的总体要求是要建立三个模块:信息输入模块、比赛结果录入模块以及查询模块。在建立完之后,要求该程序能够在用户将各种必要的信息记录之后,用户可以查询所有学校的比赛成绩,而且也可以生成团体总分表,查看参赛学校信息和比赛项目信息等一切录入的信息,为此,要示编程人员能通过一些具体的程序将以上的功能加以实现。在建立三个模块的大前提下,我们将采用结构体,循环体,指针和各种函数来实现这种功能,在数据结构体中,要采用结构体数组,其中包括学校、项目、运动员三个结构体。学校结构体成员包括学校校名、竞赛项目、得分项目结构体成员包括项目名、权值。(1)在此程序中,包括几个头文件:mainfile.h; dos.h; conio.h; momery.h; 接下来,定义全局变量,其中包括“参赛学校项目数N;男子项目数M;女子项目数W;参赛学校g_school;竞赛项目g_sport; 各名次链表指针ptrHead,ptrThis,ptrNew;总体设计:系统设计为信息输入模块、比赛结果录入模块和查询模块三个模块。(2)各种结构的分析:静态存储方式:它是指在程序运行期间由系统分配固定的存储空间的方式,全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。用static声明局部变量:使用该变量可以使局部变量的值在函数调用结束后不消失而保留原值,这即为静态局部变量的特点。静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。如在定义局部变量时不赋初值的话,则对静态局部不说,编译时自动赋初值0(对数值型变量)或空字符(对总体设计信息输入模块比赛结果录入模块查询模块打印竞赛项目信息设置竞赛项目信息设置参赛学校信息填充参赛学校信息设置项目名次取法取法及每一名次的分值设置竞赛项目总数生成报表主菜单 字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。Malloc函数的作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值是一个指向分配域起始地址的指针,如果此函数未能成功地执行,则返回空指针。链表是动态地进行存储分配的一种结构,所谓建立动态链表是指在程序执行过程中从无到有地建立一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。循环结构是结构程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。通常用while、dowhile语句实现循环,最常用的是for语句的循环,夺循环中还有循环的嵌套,它是指一个循环体内又包含另一个完整的循环结构。用语句来实现从循环体内跳出来,即提前结束循环,接着执行循环下面的语句,但break语句不能用于循环语句和swich语句之外的任何其他语句中。另外一种就是continue语句,它的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。Swich语句是多分支选择语句,它后面括号内的“表达式”,ANSI标准允许它为任何类型。当表达式的值与一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句,每一个case的常量表达式的值必须都不相同;否则就会出现相互矛盾的现象。各个case和default的出现次序不影响执行结果,执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行swich语句时,根据swich后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。程序流程图cqpisn=0?MAXMMAXW学校编号i<=2012男团总分女团总分团体总分结束i=0i=1r生成报表输出t项目名次的取法及每一名次的分值开始请选择编号0120432112357n<5输出t210235n<3输入名次t=ii=i+1i>0 *MENU1* 1.enter! 2.record! 3.search!*choice your number:( )二、课程设计体会在此次的C语言的课程设计中,从一开始到最后的结束自己的课程设计报告,我不仅学到了许多专业知识,更重要的是我学会了如何在拿到一个题目时进行简单的程序分析,并编译出一些相对简单的程序,当然了,对自己编译出的不对的程序,我也能进行一些分析,并对其进行完善。在此次的学习过程中,同伴教给了我们很多的东西,从一开始的不懂VC+这种软件,到最后的我们可以进行较熟练的应用它,也许在这过程中,我们无论是谁都遇到了一些小的困难,但是在我们的共同努力下,我们最终还是克服了它,单从这一点来说,我们就学到了许多的东西,比如teamwork,同学之间的相互帮助与配合,都证明了这一点,我相信这是我此次学习C语言程序的最大收获。在我的程序设计的过程中,遇到了很大有难题,特别是在刚拿到我的题目时,头脑中根本没有头绪,更不要说去编译程序了,当时真的很担心是否可以完成老师布置的任务,但慢慢的在学习的过程中,我开始懂得了一些编译的方法,就尝试着去编译一些程序,结果还是很好,最后我编出了我题目的程序,但是在程序的运行过程中,又遇到了新的难题,那就是我所编的程序中有太多的错误,根本无法进行运行,没办法,只好硬着头皮修改,不过还好,在同伴的帮助下,我最终将我的程序成功地进行了运行,在我自己的程序运行时,心中有一种说不出的高兴,是的,我们这几天的努力总是没有白费。 附录:程序源代码ll/*include some head files*/ #include "mainfile.h" #include "dos.h" #include "conio.h" #include "memory.h" /*global variant define*/ int N, /*参赛学校数*/ M, /*男子项目数*/ W; /*女子项目数*/ static School g_school; /*参赛学校*/ static Sport g_sport; /*竞赛项目*/ pPosition ptrHead,ptrThis,ptrNew; /*名次链表指针*/ /*/ /* 主程序入口 */ /*/ void main() char ch; Bool err=_FALSE; memset(&g_school,0,sizeof(School); memset(&g_sport,0,sizeof(Sport); printf("n="); printf("n*"); printf("n* *"); printf("n* 欢迎进入校际运动会信息管理系统 *"); printf("n* *"); printf("n*"); printf("n="); printf("nnnn按“Q”键退出运行,n其它任意键继续."); ch=toupper(getch(); if (ch='Q') exit(0); /*设置参赛学校信息*/ if (SetSchoolInfo(&N) GetSchoolInfo(); else printf("发生错误,程序将退出"); return; printf("nn按任意健继续."); getch(); system("cls"); /*设置竞赛项目信息*/ err=SetSportInfo(); /*打印竞赛项目信息*/ GetSportInfo(); /*填写竞赛结果信息*/ SetPosition For All Sports(); system("cls"); /*主菜单*/ while (1) printf("n*"); printf("n* *"); printf("n* 键入'q'退出程序 *"); printf("n* 键入's'查询学校成绩 *"); printf("n* 键入'r'生成报表 *"); printf("n* 键入'i'查看参赛学校 *"); printf("n* 键入'p'查看竞赛项目 *"); printf("n* 键入'c'刷新屏幕 *"); printf("n* *"); printf("n*"); printf("n请输入您的选择:"); ch=toupper(getch(); printf("n"); system("cls"); switch(ch) case 'Q': exit(0); break; case 'R': /*生成报表*/ GetReport(); break; case 'S': /*打印成绩*/ GetScoreBySchool(); break; case 'I': GetSchoolInfo(); break; case 'P': GetSportInfo(); break; case 'C': system("cls"); break; default: printf("n请键入一个正确的选择"); return; /*/ /* 设置竞赛项目总数 */ /*/ Bool SetFMSportTotalNum(int* pnTotalNmOfFMSprt,int type/*0:男子;1:女子*/) if (pnTotalNmOfFMSprt=NULL) return _FALSE; system("cls"); printf("n- - - -"); if (type=0) /*男子*/ printf("n请输入男子竞赛项目总数:"); scanf("%d",pnTotalNmOfFMSprt); if (*pnTotalNmOfFMSprt<=0|*pnTotalNmOfFMSprt>MAX_M) printf("n学校总数必须大于0小于%d",MAX_M); return _FALSE; else return _TRUE; else/*女子*/ printf("n请输入女子竞赛项目总数:"); scanf("%d",pnTotalNmOfFMSprt); if (*pnTotalNmOfFMSprt<=0|*pnTotalNmOfFMSprt>MAX_W) printf("n学校总数必须大于0小于%d",MAX_W); return _FALSE; else return _TRUE; /*/ /* 设置某项目名次的取法及每一名次的分值 */ /*/ Bool SetScoreType(int n/*项目编号-1*/) char ch; Bool ret=_FALSE; Bool err=_FALSE; int totalPrv,i,power; do system("cls"); printf("n请选择编号为%d的竞赛项目取名次类型n(0: 取前5名; 1: 取前3名; 2: 用户自定义):",n+1); ch=toupper(getch(); printf("n"); switch(ch) case '0':/*取前5名*/ g_sport.sportInfoArrayn.scrTyp=_FIVE; g_sport.sportInfoArrayn.scrInfo.total=5; if (g_sport.sportInfoArrayn.scrInfo.power=(int*)malloc(sizeof(int)*5)=NULL) printf("n memory err"); return _FALSE; g_sport.sportInfoArrayn.scrInfo.power0=7; g_sport.sportInfoArrayn.scrInfo.power1=5; g_sport.sportInfoArrayn.scrInfo.power2=3; g_sport.sportInfoArrayn.scrInfo.power3=2; g_sport.sportInfoArrayn.scrInfo.power4=1; ret=_TRUE; break; case '1':/*取前3名*/ g_sport.sportInfoArrayn.scrTyp=_THREE; g_sport.sportInfoArrayn.scrInfo.total=3; if (g_sport.sportInfoArrayn.scrInfo.power=(int*)malloc(sizeof(int)*3)=NULL) printf("n memory err"); return _FALSE; g_sport.sportInfoArrayn.scrInfo.power0=5; g_sport.sportInfoArrayn.scrInfo.power1=3; g_sport.sportInfoArrayn.scrInfo.power2=2; ret=_TRUE; break; case '2':/*用户自定义类型*/ g_sport.sportInfoArrayn.scrTyp=_CUSTOM; do printf("n请输入本项目取前多少名:"); scanf("%d",&totalPrv); if (totalPrv<=0) printf("n输入有误。只能大于0"); else err=_TRUE; while(err=_FALSE); g_sport.sportInfoArrayn.scrInfo.total=totalPrv; if (g_sport.sportInfoArrayn.scrInfo.power=(int*)malloc(sizeof(int)*totalPrv)=NULL) printf("n memory err"); return _FALSE; for(i=0;i<totalPrv;i+); ("*pnTotalNmOfSch<=0|*pnTotalNmOfSch");if scanf("%d",pnTotalNmOfSch); printf("n请输入参加运动会的学校总数:?");-?);- -);printf("n-",system("cls"); (ret="=_FALSE") while _FALSE;return (pnTotalNmOfSch="=NULL") ret="_TRUE"Bool pnTotalNmOfSch)SetSchoolTotalNum(int* * * 设置学校总数 _TRUE; SetScoreType(i); ; g_sport.sportInfoArrayi.sportNameMAXLENGTH-1="0" scanf("%s",g_sport.sportInfoArrayi.sportName);printf("n请输入编号为%d的竞赛项目名称:",i+1);*项目名称* g_sport.sportInfoArrayi.sprtTyp="_MAN;"else (i+1<="M)" *项目类型:男子或女子项目* g_sport.sportInfoArrayi.sportNum="i+1;/*项目编号*/" for(i="0;i<g_sport.nTotalNmOfFSprt+g_sport.nTotalNmOfMSprt;i+)" *女子项目总数* g_sport.nTotalNmOfFSprt="W;"while(err="=_FALSE);" )err="_FALSE;" do *男子项目总数* g_sport.nTotalNmOfMSprt="M;" i="0;" int SetSportInfo() 设置竞赛项目信息 ret; while(ret="=_FALSE);"printf("n错误的选择!"); *错误的输入* default: break; g_sport.sportInfoArrayn.scrInfo.poweri="power;" else printf("n输入有误。只能大于0"); (power<="0)" scanf("%d",&power); printf("n请输入该项目第%d名的分值:",i+1);>MAX_N) printf("n学校总数必须大于0小于%dn",MAX_N); printf("nn按任意健继续"); getch(); ret=_FALSE; else ret=_TRUE; return _TRUE; /*/ /* 填充参赛学校信息 */ /*/ Bool SetSchoolInfo(int* pnTotalNmOfSch) int i=0; if (!SetSchoolTotalNum(pnTotalNmOfSch) printf("nerr!"); return _FALSE; 待添加的隐藏文字内容1 else g_school.nTotalNmOfSch=*pnTotalNmOfSch; for(i=0;i<G_SCHOOL.NTOTALNMOFSCH;i+) if printf(?n- while return Bool * * _TRUE; ; for(i="0;i<g_school.nTotalNmOfSch;i+)" err="_FALSE;" i="0;" int else (ptrThis- ptrThis="ptrHead;" ptrHead="ptrThis=ptrNew;" (ptrHead="=(pPosition)NULL)" ptrNew="(pPosition)malloc(LEN);" printf(?n填写项目%d的比赛结果?,sportNum+1); -?); - - ) *项目编号-1* sportNum SetPositionForOneSport(int void *为某个竞赛项目设定比赛结果信息 校名:%s?,g_school.schInfoArrayi.schoolName); printf(? printf(?n学校编号:%d?,g_school.schInfoArrayi.SchoolNum); printf(?n共有%d个学校参赛?,g_school.nTotalNmOfSch); GetSchoolInfo() 打印参赛学校信息 *截断多余字符* g_school.schInfoArrayi.schoolNameMAXLENGTH-1="0" scanf(?%s?,g_school.schInfoArrayi.schoolName); printf(?n请输入编号为%d的学校名称:?,i+1); g_school.schInfoArrayi.SchoolNum="i+1;">ptrNext!=(pPosition)NULL) ptrThis=ptrThis->ptrNext; ptrThis->ptrNext=ptrNew; ptrThis=ptrNew; /*项目编号*/ ptrThis->sportNum=sportNum+1; printf("n输入获得第%d名的学生信息",i+1); /*姓名*/ printf("n姓名:"); scanf("%s",ptrThis->name); /*学校编号*/检查编号合法性 do printf("n学校编号:"); scanf("%d",&ptrThis->schoolNum); if (ptrThis->schoolNum<=0|ptrThis->schoolNum>g_school.nTotalNmOfSch) printf("n学校编号必须大于0小于等于%d",g_school.nTotalNmOfSch); err=_FALSE; else err=_TRUE; while(err=_FALSE); /*名次*/ ptrThis->score=i+1; ptrThis->ptrNext=(pPosition)NULL; /*/ /* 填充所有竞赛项目结果信息