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();
}