当前位置:文档之家› 运动会分数统计系统实验报告

运动会分数统计系统实验报告

运动会分数统计系统实验报告
运动会分数统计系统实验报告

运动会分数统计系统的实现

09计科(2)班

E10914044

杨素传

一、设计要求

1、问题描述

参加运动会有n个学校,学校编码为1,2,…,n,比赛分成m个男子项目和w个女子项目。项目编号为男子1,2,…,m,女子m+1,m+2,…,m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为7,5,3,2,1;前三名的积分分别5,3,2;哪些取前五名或前三名由学生自己设定(m<=20,n<=20)。

2、需求分析

(1)可以输入各个项目的前三名或前五名成绩;

(2)能统计各学校成绩;

(3)可以按学校编号、学校总分、男女团体总分排序输出;

(4)可以按学校编号查询学校某项目情况,可以按项目编号查询取得前三名或前五名的学校。

二、概要设计

1、主界面设计

为了实现运动会分数统计系统,设计一个含有多个菜单项的主控菜单子程序以连接系统的各项子程序,方便用户使用本程序。本系统主控菜单运行界面图1所示。

图1 运动会分数统计系统程序主菜单

2、存储结构设计

本程序采用链式存储类型(LNode)存储运动会分数统计系统的节点信息。运动会分数统计系统的链表中的结点包括8个域:项目编号域(objnum)、项目类型(objtype)、运动员编号(athnum)、运动员姓名(athname[20])、学校编号(schnum)、校名(schname[30])、

运动员分数(athscore)和指向下一个节点的指针欲(struct LNode *next)。

3、系统功能设计

本系统设置了8个子功能菜单。8个子功能的设计描述如下:

(1)录入各项目的成绩。由函数creatLink()实现。当用户选择该功能时,系统会以用户输入的数据运动会分数统计链表。

(2)统计各学校分数。由函数schoolScore()实现。当用户选择该功能时,系统会统计各学校分数。

(3)按学校编号顺序输出。由函数printfSchoolNumber()实现。当用户选择该功能时,系统会按学校编号顺序输出数据。

(4)按学校总分顺序输出。由函数printfSchoolScore()实现。当用户选择该功能时,系统会按学校总分顺序输出数据。

(5)按男女团体总分顺序输出。由函数printfManWomanScore()实现。当用户选择该功能时,系统会按男女团体总分顺序输出数据。

(6)按学校编号查询学校某项目情况。由函数printfSchoolObject()实现。当用户选择该功能时,系统会按学校编号输出学校某项目情况。

(7)按项目编号查询取得前三名或前五名的学校。由函数printfObjectSchool()实现。当用户选择该功能时,系统会按项目编号查询取得前三名或前五名的学校情况。

(8)退出。由exit(0)函数实现。

三、模块设计

1、模块设计

本程序包含两个模块:主程序模块和工作区选择模块。其调用关系如图2所示。

主程序模块工作区选择模块

图2 模块调用示意图

2、系统子程序及功能设计

本系统共设置个6子程序,各子程序的函数名及功能说明如下。

(1)LinkList creatLink() //创建链表(录入各项目的成绩)

(2)int schoolScore(LinkList L) //统计各学校总分

(3)void printfSchoolNumber() //按学校编号顺序输出

(4)void printfSchoolScore() //按学校总分顺序输出

(5)void printfManWomanScore(LinkList L //按男女团体总分排序输出

(6)void printfSchoolObject(LinkList L) //按学校编号查询学校某项目情况

(7)void printfObjectSchool(LinkList L) //按项目编号查询取得前三名或前五名的学校

(8)int main() //主函数

3、函数主要调用关系图

本系统6个子系统之间的主要调用关系如图3所示,图中数字是各函数的编号。

8 main()

1 2 3 4 5 6 7

图3 系统函数调用关系图

四、详细设计

1、数据类型定义

(1)本系统采用链式结构存储运动会分数统计的结点。节点定义如下:

typedef struct LNode{// 链表节点数据结构

int objnum;

char objtype;

int athnum;

char athname[20];

int schnum;

char schname[30];

int athscore;

struct LNode *next;

}LNode,*LinkList;

(2)各学校情况数据结构的结构定义成结构体数组形式。定义如下:

struct School{

int schoolnumber;

char schoolname[30];

int schoolscore;

}school[30];

2、系统主要子程序详细设计

(1)创建链表(录入各项目的成绩)子程序设计

LinkList creatLink(){

LinkList L=(LinkList)malloc(LEN);

LinkList p,q;

int num,objnum,n;

char objtype;

L->next=NULL;

p=L;

printf("请输入男女项目总个数:");

scanf("%d",&num);

while(num--){

printf("请输入项目编号:");

scanf("%d",&objnum);

printf("请输入项目类型:");

getchar();

objtype=getchar();

printf("请输入3(代表取前三名)或5(代表取前五名):");

scanf("%d",&n);

printf("请按名次顺序输入运动员编号,姓名,学校编号,校名和成绩\n");

while(n--){

q=(LinkList)malloc(LEN);

q->objnum=objnum;

q->objtype=objtype;

printf("请输入运动员编号:");

scanf("%d",&q->athnum);

printf("请输入运动员姓名:");

getchar();

scanf("%s",q->athname);

printf("请输入学校编号:");

scanf("%d",&q->schnum);

printf("请输入校名:");

getchar();

scanf("%s",q->schname);

printf("请输入成绩:");

scanf("%d",&q->athscore);

q->next=NULL;

p->next=q;

p=q;

}

}

return(L);

}

(2)统计各学校总分子程序设计

int schoolScore(LinkList L){

LinkList p;

int i;

p=L->next;

for(i=0;i<20;i++){

school[i].schoolscore=0;

school[i].schoolnumber=-1;

}

while(!p==NULL){

for(i=0;i<20;i++){

if(school[i].schoolnumber==-1){

strcpy(school[i].schoolname,p->schname);

school[i].schoolnumber=p->schnum;

school[i].schoolscore=p->athscore;

p=p->next;

break;

}

else if(school[i].schoolnumber==p->schnum){

school[i].schoolscore+=p->athscore;

p=p->next;

break;

}

}

}

return 0;

}

五、测试分析

1、创建链表(录入各项目的成绩)

在主菜单下,用户输入1并回车,然后输入数据结点的个数并回车,再输入数据,运行结果如图4所示。

图4 链表建立(录入各项目的成绩)

2、统计各学校总分

在主菜单下,用户输入2并回车,运行结果如图5所示。

图5 统计各学校总分

3、按学校编号顺序输出

在主菜单下,用户输入3并回车,运行结果如图6所示。

图6 按学校编号顺序输出的数据4、按学校总分顺序输出

在主菜单下,用户输入4并回车,运行结果如图7所示。

图7 按学校总分顺序输出的数据

5、按男女团体总分排序输出

在主菜单下,用户输入5并回车,运行结果如图8所示。

图8 按男女团体总分排序输出的数据

6、按学校编号查询学校某项目情况

在主菜单下,用户输入6并回车,再输入学校编号回车,然后输入项目编号,运行结果如图9所示。

图9 按学校编号查询学校某项目情况

6、按项目编号查询取得前三名或前五名的学校

在主菜单下,用户输入7并回车,再输入项目编号回车,然后输入取名规则,运行结果如图10所示。

图10 按项目编号查询取得前三名或前五名的学校

8、退出

在主菜单下,用户输入0并回车,运行结果如图11所示。

图11 退出程序

六、源程序清单

#include

#include

#include

#define NULL 0

#define LEN sizeof(LNode)

typedef struct LNode{// 链表节点数据结构

int objnum;

char objtype;

int athnum;

char athname[20];

int schnum;

char schname[30];

int athscore;

struct LNode *next;

}LNode,*LinkList;

//学校情况数据结构

struct School{

int schoolnumber;

char schoolname[30];

int schoolscore;

}school[30];

//创建链表

LinkList creatLink(){

LinkList L=(LinkList)malloc(LEN);

LinkList p,q;

int num,objnum,n;

char objtype;

L->next=NULL;

p=L;

printf("请输入男女项目总个数:");

scanf("%d",&num);

while(num--){

printf("请输入项目编号:");

scanf("%d",&objnum);

printf("请输入项目类型:");

getchar();

objtype=getchar();

printf("请输入3(代表取前三名)或5(代表取前五名):");

scanf("%d",&n);

printf("请按名次顺序输入运动员编号,姓名,学校编号,校名和成绩\n");

while(n--){

q=(LinkList)malloc(LEN);

q->objnum=objnum;

q->objtype=objtype;

printf("请输入运动员编号:");

scanf("%d",&q->athnum);

printf("请输入运动员姓名:");

getchar();

scanf("%s",q->athname);

printf("请输入学校编号:");

scanf("%d",&q->schnum);

printf("请输入校名:");

getchar();

scanf("%s",q->schname);

printf("请输入成绩:");

scanf("%d",&q->athscore);

q->next=NULL;

p->next=q;

p=q;

}

}

return(L);

}

//统计各学校总分

int schoolScore(LinkList L){

LinkList p;

int i;

p=L->next;

for(i=0;i<20;i++){

school[i].schoolscore=0;

school[i].schoolnumber=-1;

}

while(!p==NULL){

for(i=0;i<20;i++){

if(school[i].schoolnumber==-1){

strcpy(school[i].schoolname,p->schname);

school[i].schoolnumber=p->schnum;

school[i].schoolscore=p->athscore;

p=p->next;

break;

}

else if(school[i].schoolnumber==p->schnum){

school[i].schoolscore+=p->athscore;

p=p->next;

break;

}

}

}

return 0;

}

//按学校编号顺序输出

void printfSchoolNumber(){

int i,j,num,flag;

printf(" 学校编号校名学校总分\n");

for(i=0;;i++){

if(school[i].schoolnumber==-1)break;

num=school[0].schoolnumber;

flag=0;

for(j=1;;j++){

if(school[j].schoolnumber==-1)break;

if(school[j].schoolnumber

printf("%8d%10s%12d\n",school[flag].schoolnumber,school[flag].schoolname,school[flag].s choolscore);

school[flag].schoolnumber=35565;

}

}

//按学校总分顺序输出

void printfSchoolScore(){

int i,j,sco,flag;

printf(" 学校编号校名学校总分\n");

for(i=0;;i++){

if(school[i].schoolscore==0)break;

sco=school[0].schoolscore;

flag=0;

for(j=1;;j++){

if(school[j].schoolscore==0)break;

if(school[j].schoolscore>sco){sco=school[j].schoolscore;flag=j;}

}

printf("%8d%10s%12d\n",school[flag].schoolnumber,school[flag].schoolname,school[flag].s choolscore);

school[flag].schoolscore=-1;

}

}

//按男女团体总分排序输出

void printfManWomanScore(LinkList L){

LinkList p;

int manscore=0,womanscore=0;

p=L->next;

while(!p==NULL){

if(p->objtype=='m')manscore+=p->athscore;

else womanscore+=p->athscore;

p=p->next;

}

printf(" 团体总分\n");

if(manscore>=womanscore){

printf(" 男生%8d\n",manscore);

printf(" 女生%8d\n",womanscore);

}

else {

printf(" 女生%8d\n",womanscore);

printf(" 男生%8d\n",manscore);

}

}

//按学校编号查询学校某项目情况

void printfSchoolObject(LinkList L){

LinkList p;

int scnum,obnum,sum=0;

char scname[30];

p=L->next;

printf("请输入要查看的学校编号:");

scanf("%d",&scnum);

printf("请输入项目编号:");

scanf("%d",&obnum);

while(p!=NULL){

if(p->schnum==scnum&&p->objnum==obnum){sum+=p->athscore;strcpy(scname,p->schna me);}

p=p->next;

}

printf(" 学校编号校名项目编号获得总分\n");

printf("%8d%10s%12d%12d\n",scnum,scname,obnum,sum);

}

//按项目编号查询取得前三名或前五名的学校

void printfObjectSchool(LinkList L){

LinkList p;

int obnum,n,i;

p=L->next;

printf("请输入要查看的项目编号:");

scanf("%d",&obnum);

printf("请输入3(前三名)或5(前五名):");

scanf("%d",&n);

for(i=20;i<30;i++){

school[i].schoolscore=0;

school[i].schoolnumber=-1;

}

while(p!=NULL){

for(i=20;i<30;i++){

if(school[i].schoolnumber==-1&&p->objnum==obnum){

strcpy(school[i].schoolname,p->schname);

school[i].schoolnumber=p->schnum;

school[i].schoolscore=p->athscore;

p=p->next;

break;

}

else if(school[i].schoolnumber==p->schnum&&p->objnum==obnum){

school[i].schoolscore+=p->athscore;

p=p->next;

break;

}

else{p=p->next;break;}

}

}

printf(" 项目编号学校编号校名学校总分\n");

/*i=20;

while(n--){

if(school[i].schoolscore!=0){

printf("%8d%12d%10s%12d\n",obnum,school[i].schoolnumber,school[i].schoolname,school [i].schoolscore);

i++;

}

else break;

}*/

p=L->next;

while(p->objnum!=obnum)p=p->next;

while(n--){

printf("%8d%12d%10s%12d\n",obnum,p->schnum,p->schname,p->athscore);

p=p->next;

}

}

//主函数

int main(){

LinkList L;

int menu;

while(menu!=0){

printf("***********************欢迎使用运动会分数统计系统***********************\n");

printf(" 1.录入各项目的成绩\n");

printf(" 2.统计各学校分数\n");

printf(" 3.按学校编号顺序输出\n");

printf(" 4.按学校总分顺序输出\n");

printf(" 5.按男女团体总分顺序输出\n");

printf(" 6.按学校编号查询学校某项目情况\n");

printf(" 7.按项目编号查询取得前三名或前五名的学校\n");

printf(" 0.退出系统\n");

printf("***********************欢迎使用运动会分数统计系统***********************\n");

printf("请选择功能0-7:");

scanf("%d",&menu);

switch(menu){

case 1: L=creatLink();printf("各项目的成绩录入完毕!\n");break;

case 2: schoolScore(L);printf("统计各学校成绩完毕!\n");break;

case 3: printfSchoolNumber();break;

case 4: schoolScore(L); printfSchoolScore();break;

case 5: printfManWomanScore(L);break;

case 6: printfSchoolObject(L);break;

case 7: printfObjectSchool(L);break;

case 0: printf("退出系统成功,欢迎使用!\n");exit(0);

default :printf("功能选项错误,请重新输入!");

}

printf("\n");

}

return 0;

}

七、用户手册

(1)本程序执行文件为“运动会分数统计系统演示.exe”。

(2)进入本程序之后,就会进入系统主菜单界面,用户可在该界面下输入各子菜单前对应的数字并按回车,执行相应子菜单命令。

相关主题
文本预览
相关文档 最新文档