C语言程序设计说明书

  • 格式:doc
  • 大小:77.50 KB
  • 文档页数:14

荆楚理工学院

课程设计说明书

题目: NBA球队战绩统计系统

院 系:计算机工程学院

专业班级:计算机应用技术一班

学 号:

学生姓名:谢芳,秦曼,张海霞,张雅勤,宁菊梅

高锐

指导教师:胡玉荣

2010年 6月24日

1. 球队战绩管理系统的分析与设计

为了完成球队战绩的管理,首先明确系统的定义。球队战绩统计系统就是统计球队的战绩,通过数据分析球队本年来实力的提升与否,方便大家浏览,进而为来年球队的调整做好准备。

(1)用户需求分析。用户需求分析阶段完成对用户需求的理解、抽象,详细描述用户的要求,为规划系统功、定义软件系统模块做前期准备,并完成可行性分析。根据战绩统计的需求,将该系统需要完成的工作归纳如下:

1)球队战绩表的组织。根据NBA里的规定30个球队分为两部分,15支球队分为东部球队(east),另外的15支球队作为西部球队(west)。并且战绩的统计,球队的排名都在自己所属的部(东部或西部)内进行,东西部之间的球队不进行比较。每个球队的战绩里应该包括球队名字,比赛胜利的场数,比赛失败的场数和这个赛季球队的胜率。

2)球队战绩的录入。完成球队战绩的录入,按照上述定义的字段逐一输入球队的战绩并以适当的格式存储。

3)球队战绩的修改。对录入的错误,可以修改数据的记录。

4)球队战绩的添加。添加新的记录到统计表中。

5)显示/打印战绩表。按一定的格式美观地将战绩表显示在屏幕上或者输出到打印机上。

(2)概要设计。根据以上分析,可以归纳NBA战绩统计系统的各功能模块,如下图所示。

各个功能模块定义如下:

1)主控模块。系统入口应设计友好用户交互界面,这里采用菜单模式,即以菜单形式在屏幕上显示各个功能,通过选择转向执行对应功能模块的子程序。

2)战绩录入模块。从键盘先输入东部球队记录,在输入西部球队记录,并分别按一定格式创建并保存到两个不同名称的数据文件中。

3)战绩浏览模块。先选择要浏览的是东部球队的战绩还是西部球队的战绩,之后球队按一定格式由屏幕显示球队战绩数据文件的所有记录。

4)修改记录模块。先选择是要对东部球队的战绩修改还是对西部球队的战绩修改,选定后即指定的数据记录进行修改。 主控模块

战绩数据录入模块 战绩数据浏览模块 增加记录模块 修改记录模块 5)增加记录模块。向你选定的东部或西部的战绩数据文件中添加新的球队记录。

(3)详细设计。在概要设计的基础上进一步详细描述各个功能模块的实现过程,定义相应的数据表的存储格式,以及各个功能模块的流程图。

战绩的数据结构。信息在内存中的表现格式,在外存中的表现格式,即为信息结构模块数据结构。选择二进制流文件格式,文件记录和内存中成绩记录的表示格式采用一致的结构体,这样处理比较方便。

结构体定义信息,一方面体现记录的完整性,即按照该类型定义的结构体类型变量,可以包括姓名、电话号码、性别等内容;另一方面,结构体类型适合二进制文件存储,记录长度为定长,且数据位压缩存储,对文件中记录的修改可以直接覆盖,易于实现。

球队战绩记录数据定义如下:

struct stu_stu

{

char name[20];

float score[3];

};

定义球队的名称应该考虑长度的,本例中可以使用汉语拼音,故定义20个字符长度。而球队的“胜”数和“负”数都为整型。

2.各模块的程序代码。

根据上述分析,对功能模块的划分,定义,以及规划出的数据结构,完成各个模块的代码编写。

(1)头文件。这里定义一个头文件,内容如下:

#include "stdio.h"

#define STUDENT struct stu_stu

struct stu_stu

{

char name[20];

float score[3];

};

头文件包含必须的系统头文件stdio.h,以及本程序集中的核心数据结构、信息结构体定义等等。文件中记录的存储格式,以及内存中信息结构体格式均采用此定义。设计一个单独的头文件,将共用的定义集中保护,各个模块程序只要将该头文件包含进去即可,不必重复定义结构体等内容,易于维护。

(2)主控模块。完成菜单的显示,根据用户输入调用不同的子函数实现相应的功能。各个子函数存储在不同的文件中,使用include命令将他们包含进来。对应源程序存储在文件zh1.c、zh2.c、zh3.c、zh4.c中。

程序如下:

#include "head.h"

#include "zh1.c"

#include "zh2.c"

#include "zh3.c"

#include "zh4.c"

void main()

{

char in_ch, filename[20];

while (1)

{

clrscr();

printf("==========================\n");

printf("*****1.input team records.\n");

printf("*****2.show team records.\n");

printf("*****3.modify team records.\n");

printf("*****4.append team records.\n");

printf("*****0.exit.\n");

printf("==========================\n");

printf("qing xuan ze:");

if ((in_ch=getchar())=='0')

{

printf("good bye!\n");

getch();

break;

}

switch (in_ch)

{

case 49:create();break;

case 50:printf("\nplease input filename:");

scanf("%s",filename);

show(filename);

break;

case 51:modify(filename);break;

case 52:append(filename);break;

}

}

}

程序说明: 1)该程序使用getchar()函数获取键盘输入字符,输入0-4数字,其他字符忽略。

2)使用多分支语句switch()判断输入字符ASCII码,调用相应的子函数实现相应的功能。输入字符0,结束程序执行。

3)对显示功能模块调用前,请求用户输入文件名,用户根据需要查看的内容选择排序前文件或汇总后文件,用户需要输入完整的文件名。

(3)战绩录入模块。

文件名:zh1.c。

功能:用户输入球队战绩。

输入:键盘输入球队战绩记录。

输出:以二进制留文件格式创建战绩数据文件。数据文件名为east.dat和west.dat。

程序如下:

void create()

{

{ FILE *fp;

STUDENT stud;

int i,stu_c;

if ((fp=fopen("east.dat","wb+"))==NULL)

{

printf("file open error!");

exit(1);

}

clrscr();

printf("please input Eastern team total counts:");

scanf("%d%*c",&stu_c);

printf("input %d team info\n",stu_c); for (i=1;i<=stu_c;i++)

{

printf("input NO %d teams information:\n",i);

printf("Name:");

gets();

printf("2 scores:");

scanf("%f,%f%*c",&stud.score[0],&stud.score[1]);

stud.score[2]=(stud.score[0])/(stud.score[0]+stud.score[1]);

fwrite(&stud,sizeof(STUDENT),1,fp);

}

fclose(fp);

}

{

FILE *fp;

STUDENT stud;

int i,stu_c;

if ((fp=fopen("west.dat","wb+"))==NULL)

{

printf("file open error!");

exit(1);

}

clrscr();

printf("please input Western team total counts:");

scanf("%d%*c",&stu_c);

printf("input %d team info\n",stu_c);

for (i=1;i<=stu_c;i++)

{

printf("input NO %d teams information:\n",i);

printf("Name:");

gets();

printf("2 scores:");

scanf("%f,%f%*c",&stud.score[0],&stud.score[1]);

stud.score[2]=(stud.score[0])/(stud.score[0]+stud.score[1]);

fwrite(&stud,sizeof(STUDENT),1,fp);

}

fclose(fp); }

printf("Press any key to continue...\n");

getch();

}