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

更新时间:2023-04-14 09:09:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

9计科 (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(" printf(" printf(" printf(" printf(" printf(" printf(" 1.录入各项目的成绩\n");

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

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

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

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

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

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

\n");

printf("

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

欢迎使用运动会分数统计系统

***********************\n");

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

scanf("%d",&menu);

switch(menu){

case 1: L=creatLink();printf("各项目的成绩录入完毕case 2: schoolScore(L);printf(" 统计各学校成绩完毕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(" 功能选项错误,请重新输入 !");

!\n");break; !\n");break;

}

printf("\n");

}

return 0;

}

七、用户手册

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

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

本文来源:https://www.bwwdw.com/article/x3yq.html

Top