资源描述
东华大学
课程设计报告
设 计 题 目: 运动会分数统计
哈希表查找的设计
【设计题目一】
运动会分数统计
任务
参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1~m,女子m+1~m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些项目取前五名或前三名由学生自己设定。(m<=20,n<=20)
功能要求
1、可以输入各个项目的前三名或前五名的成绩;
2、能统计各学校总分;
3、可以按学校编号、学校总分、男女团体总分排序输出;
4、可以按学校编号查询学校某个项目的情况;
5、可以按项目编号查询取得前三或前五名的学校。
需求分析
1、由用户定义学校的编号、名称,项目的编号、名称,并输入相对应的成绩;
2、由用户选择各个项目取前三名或前五名;
3、系统根据用户的输入生成运动会分数信息相应文件并保存。
概要设计
1、定义数据结构
(1)学校数据类型
typedef struct ItemNode
{ int item; //该学校获奖的项目编号
char i_name[MAX]; //项目名字
int record; //项目成绩
struct ItemNode *next; //链域
}ItemNode;
typedef struct
{ int school; //学校编号
char school_name[MAX]; //学校名字
int shool_score; //学校总分
int boys_score; //男团体总分
int girl_score; //女团体总分
ItemNode *firstitem; //链域指向链表中第一个获奖项目的结点
}SCHNode;
typedef struct
{ int school_num; //学校总数
SCHNode school[MAX];
}AllSchool;
(2)项目数据类型
typedef struct SchoolNode
{ int school; //学校编号
char s_name[MAX]; //学校名字
int record; //项目成绩
struct SchoolNode *next; //链域
}SchoolNode;
typedef struct
{ int item; //项目编号
char item_name[MAX]; //项目名字
SchoolNode *firstschool; //链域指向链表中第一个结点
}Item;
typedef struct
{ int item_num; //项目总数
Item item[MAX];
}AllItems;
2、模块与函数
运动会分数统计系统分为四个模块:信息输入及统计模块、信息保存提取模块、信息排序输出模块、信息查询模块。
(1)信息输入及统计模块函数: void InitList()、void Item_Score()、void InputInfo();
(2)信息保存提取模块函数:void save()、void ReadInfo();
(3)信息排序输出函数:void School_Score()、void Sort_Schoolnum()、void Sort_SchoolScore()、void Sort_ManScore()、void Sort_WomanScore();
(4)信息查询模块函数:void FindInfo_SchoolNum()、void FindInfo_SchoolNum()。
3、主函数与各函数调用关系结构图:
运动会分数统计
信息保存提取模块
信息输入及统计模块
信息查询模块
信息排序输出模块
统计各学校总分
按学校总分排序
按女团体总分排序
按男团体总分排序
信息输入及统计
按学校编号排序
提取信息
保存信息
信息初始化
按项目编号查询
按学校编号查询
详细设计
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define S_SIZE sizeof(SchoolNode)
#define I_SIZE sizeof(ItemNode)
typedef struct SchoolNode
{ int school; //学校编号
char s_name[MAX]; //学校名字
int record; //项目成绩
struct SchoolNode *next; //链域
}SchoolNode;
typedef struct
{ int item; //项目编号
char item_name[MAX]; //项目名字
SchoolNode *firstschool; //链域指向链表中第一个结点
}Item;
typedef struct
{ int item_num; //项目总数
Item item[MAX];
}AllItems;
typedef struct ItemNode
{ int item; //该学校获奖的项目编号
char i_name[MAX]; //项目名字
int record; //项目成绩
struct ItemNode *next; //链域
}ItemNode;
typedef struct
{ int school; //学校编号
char school_name[MAX]; //学校名字
int shool_score; //学校总分
int boys_score; //男团体总分
int girl_score; //女团体总分
ItemNode *firstitem; //链域指向链表中第一个获奖项目的结点
}SCHNode;
typedef struct
{ int school_num; //学校总数
SCHNode school[MAX];
}AllSchool;
void InitList(AllSchool *as,AllItems *ai) //初始化链表
{ for (int i = 0;i<ai->item_num;i++) //初始化项目链表
{ ai->item[i].item = i+1;
strcpy(ai->item[i].item_name," ");
ai->item[i].firstschool = NULL;
}
for (int k = 1;k<=as->school_num;k++) //初始化学校链表
{ as->school[k].school = k;
strcpy(as->school[k].school_name," ");
as->school[k].firstitem = NULL;
as->school[k].shool_score = as->school[k].boys_score = as->school[k].girl_score = 0;
}
as->school[0].shool_score = as->school[0].boys_score = as->school[0].girl_score = 0;
strcpy(as->school[0].school_name," ");
}
void Item_Score(AllItems *ai,AllSchool *as,int x) //取三前名和前五名的项目
{ ItemNode *p; SchoolNode *q;
int j,num,k; int m = 3,n = 5;
char name[MAX];
for (int i = 0;i<ai->item_num;i++)
{ printf("\n\n\t|-----------------------请输入第%d个项目编号:",i+1);
scanf("%d",&ai->item[i].item);
printf("\n\n\t|-----------------------请输入第%d个项目名字:",i+1);
scanf("%s",ai->item[i].item_name);
getchar();
printf("\n\n\t|-----------------------1.前三名\t2.前五名\n");
printf("\n\n\t|-----------------------请选择:");
scanf("%d",&j);
if(j!=1&&j!=2)
{ printf("\n\n\t|-----------------------输入有误,请重新选择:");
scanf("%d",&j);
}
if (j == 1)
{ k = 0;m = 3;
do
{ printf("\n\n\t|-----------------------请输入第%d名学校编号:",m);
scanf("%d",&num);
printf("\n\n\t|-----------------------请输入第%d名学校名字:",m);
scanf("%s",name);
getchar();
q = (SchoolNode *)malloc(S_SIZE);
q->school = num;
strcpy(q->s_name,name);
p = (ItemNode *)malloc(I_SIZE);
p->item = ai->item[i].item;
strcpy(p->i_name,ai->item[i].item_name);
if(m==3) p->record=q->record = 2;
if(m==2) p->record=q->record = 3;
if(m==1) p->record=q->record = 5;
q->next = ai->item[i].firstschool;
ai->item[i].firstschool = q;
p->next = as->school[num].firstitem;
as->school[num].firstitem = p;
strcpy(as->school[num].school_name,q->s_name);
as->school[num].shool_score=as->school[num].shool_score+p->record;//累计总分
if(i+1<=x) as->school[num].boys_score+=p->record; //累计男团体总分
else as->school[num].girl_score += p->record; //累计女团体总分
m--;
k++;
if(k == as->school_num)break;
} while (m!=0);
}
if (j == 2)
{ k = 0;n = 5;
do
{ printf("\n\n\t|---------请输入第%d名学校编号:",n);
scanf("%d",&num);
printf("\n\n\t|---------请输入第%d名学校名字:",n);
scanf("%s",name);
getchar();
q = (SchoolNode *)malloc(S_SIZE);
q->school = num;
strcpy(q->s_name,name);
p = (ItemNode *)malloc(I_SIZE);
p->item = ai->item[i].item;
strcpy(p->i_name,ai->item[i].item_name);
if(n == 5) p->record = q->record = 1;
if(n == 4) p->record = q->record = 2;
if(n == 3) p->record = q->record = 3;
if(n == 2) p->record = q->record = 5;
if(n == 1) p->record = q->record = 7;
q->next = ai->item[i].firstschool;
ai->item[i].firstschool = q;
p->next = as->school[num].firstitem;
as->school[num].firstitem = p;
strcpy(as->school[num].school_name,q->s_name);
as->school[num].shool_score = as->school[num].shool_score + p->record; //累计总分
if(i+1<=x) as->school[num].boys_score += p->record; //累计男团体总分
else as->school[num].girl_score += p->record; //累计女团体总分
n--; k++;
if(k == as->school_num)break;
} while (n!=0);
}
}
}
void InputInfo(AllSchool *AS,AllItems *AI)
{ int m,w;
printf("\n\n\t|***********************输入各个项目信息***********************|\n\n");
printf("\n\n\t|---------请输入男子项目总数m:");
scanf("%d",&m);
if(m<0||m>20)
{ printf("\n\n\t|*********输入有误,m是20以内的整数,请重新输入:");
scanf("%d",&m);
}
printf("\n\n\t|---------请输入女子项目总数w:");
scanf("%d",&w);
if(w<0||w>20)
{ printf("\n\n\t|*********输入有误,w是20以内的整数,请重新输入:");
scanf("%d",&w);
}
printf("\n\n\t|---------请输入参加运动会的学校总数n:");
scanf("%d",&AS->school_num);
if (AS->school_num < 0 || AS->school_num > 20)
{ printf("\n\n\t|*********输入有误,n是20以内的整数,请重新输入:");
scanf("%d",&AS->school_num);
}
AI->item_num = m+w;
printf("\n\t则项目编号为男子1—%d,女子%d—%d",m,m+1,AI->item_num);
InitList(AS,AI); //初始化链表
Item_Score(AI,AS,m); //区分取前名和前名的项目给分情况
}
void save(AllItems *ai,AllSchool *as) //存储数据文件
{ FILE *fp1,*fp2;
if((fp1=fopen("AllItems.txt","w+"))==NULL)
{ printf("\n\n\t|-----------------------创建文件失败!-----------------------|\n"); return;
}
if(fwrite(ai,sizeof(AllItems),1,fp1)!=1)
printf("\n\n\t|------------------------保存信息失败!-----------------------|\n");
else
printf("\n\n\t|-------------------信息成功保存到AllItems.txt!--------------|\n");
fclose(fp1);
if((fp2=fopen("AllSchool.txt","w+"))==NULL)
{ printf("\n\n\t|-----------------------创建文件失败!-----------------------|\n"); return;
}
if(fwrite(as,sizeof(AllSchool),1,fp2)!=1)
printf("\n\n\t|------------------------保存信息失败!-----------------------|\n");
else
printf("\n\n\t|-------------------信息成功保存到AllSchool.txt!-------------|\n");
fclose(fp2);
system("pause");
}
void ReadInfo(AllSchool *as,AllItems *ai) //读取文件信息
{ FILE *fp1,*fp2;
if ((fp1 = fopen("AllItems.txt","r")) == NULL)
{ printf("\n\n\t|-------------------找不到文件AllItems.txt!------------------|\n");
system("pause");return ;
}
fread(ai,sizeof(AllItems),1,fp1);
printf("\n\n\t|-----------------AllItems.txt文件内容读取完毕!--------------|\n");
fclose(fp1);
if ((fp2 = fopen("AllSchool.txt","r")) == NULL)
{ printf("\n\n\t|-------------------找不到文件AllSchool.txt!------------------|\n");
system("pause");return ;
}
fread(as,sizeof(AllSchool),1,fp2);
printf("\n\n\t|-----------------AllSchool.txt文件内容读取完毕!-------------|\n");
fclose(fp2);
system("pause");
}
void School_Score(AllSchool *as) //统计学校总分
{ printf("\n\n\t|***********************输出各个学校总得分***********************|\n");
printf("\t|----------------------------------------------------------------|\n");
printf("\t|---- 学校编号\t|学校名字 |男团体总分|女团体总分|总分 |------|\n");
printf("\t|----------------------------------------------------------------|\n");
for (int i = 1;i<=as->school_num;i++)
{ printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",i,as->school[i].school_name,as->school[i].boys_score,as->school[i].girl_score,as->school[i].shool_score);
printf("\t|----------------------------------------------------------------|\n");
}
printf("\n\n");system("pause");
}
void Sort_Schoolnum(AllSchool *as) //按学校编号排序
{ printf("\n\n\t|***********************按学校编号排序输出***********************|\n");
printf("\t|----------------------------------------------------------------|\n");
printf("\t|---- 学校编号\t|学校名字 |男团体总分|女团体总分|总分 |------|\n");
printf("\t|----------------------------------------------------------------|\n");
for (int i = 1;i<=as->school_num;i++)
{ printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",i,as->school[i].school_name,as->school[i].boys_score,as->school[i].girl_score,as->school[i].shool_score);
printf("\t|----------------------------------------------------------------|\n");
}
printf("\n\n");system("pause");
}
void Sort_SchoolScore(AllSchool *as) //按学校总分排序(直接插入排序)
{ int i,j,k;
printf("\n\n\t|*********************按学校总分排序输出*************************|\n");
printf("\t|----------------------------------------------------------------|\n");
printf("\t|---- 学校编号\t|学校名字 |男团体总分|女团体总分|总分 |------|\n");
printf("\t|----------------------------------------------------------------|\n");
for (i = 2;i<as->school_num;i++)
{ as->school[0].boys_score = as->school[i].boys_score;
as->school[0].girl_score = as->school[i].girl_score;
as->school[0].shool_score = as->school[i].shool_score;
as->school[0].school = as->school[i].school;
strcpy(as->school[0].school_name,as->school[i].school_name);
j = i - 1;
while (as->school[0].shool_score < as->school[j].shool_score && j >0)
{ as->school[j+1].boys_score = as->school[j].boys_score;
as->school[j+1].girl_score = as->school[j].girl_score;
as->school[j+1].shool_score = as->school[j].shool_score;
as->school[j+1].school = as->school[j].school;
strcpy(as->school[j+1].school_name,as->school[j].school_name);
j--;
}
as->school[j+1].boys_score = as->school[0].boys_score;
as->school[j+1].girl_score = as->school[0].girl_score;
as->school[j+1].shool_score = as->school[0].shool_score;
as->school[j+1].school = as->school[0].school;
strcpy(as->school[j+1].school_name,as->school[0].school_name);
}
for (k = 1;k<=as->school_num;k++)
{ printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",as->school[k].school,as->school[k].school_name,as->school[k].boys_score,as->school[k].girl_score,as->school[k].shool_score);
printf("\t|----------------------------------------------------------------|\n");
}
printf("\n\n");system("pause");
}
void Sort_ManScore(AllSchool *as) //按男团体总分排序(直接插入排序)
{ int i,j,k;
printf("\n\n\t|*********************按男团体总分排序输出***********************|\n");
printf("\t|----------------------------------------------------------------|\n");
printf("\t|---- 学校编号\t|学校名字 |男团体总分|女团体总分|总分 |------|\n");
printf("\t|----------------------------------------------------------------|\n");
for (i = 2;i<=as->school_num;i++)
{ as->school[0].boys_score = as->school[i].boys_score;
as->school[0].girl_score = as->school[i].girl_score;
as->school[0].shool_score = as->school[i].shool_score;
as->school[0].school = as->school[i].school;
strcpy(as->school[0].school_name,as->school[i].school_name);
j = i - 1;
while (as->school[0].boys_score < as->school[j].boys_score && j >0)
{ as->school[j+1].boys_score = as->school[j].boys_score;
as->school[j+1].girl_score = as->school[j].girl_score;
as->school[j+1].shool_score = as->school[j].shool_score;
as->school[j+1].school = as->school[j].school;
strcpy(as->school[j+1].school_name,as->school[j].school_name);
j--;
}
as->school[j+1].boys_score = as->school[0].boys_score;
as->school[j+1].girl_score = as->school[0].girl_score;
as->school[j+1].shool_score = as->school[0].shool_score;
as->school[j+1].school = as->school[0].school;
strcpy(as->school[j+1].school_name,as->school[0].school_name);
}
for (k = 1;k<=as->school_num;k++)
{ printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",as->school[k].school,as->school[k].school_name,as->school[k].boys_score,as->school[k].girl_score,as->school[k].shool_score);
printf("\t|----------------------------------------------------------------|\n");
}
printf("\n\n");system("pause");
}
void Sort_WomanScore(AllSchool *as) //按女团体总分排序(直接插入排序)
{ int i,j,k;
printf("\n\n\t|*********************按女团体总分排序输出***********************|\n");
printf("\t|----------------------------------------------------------------|\n");
printf("\t|---- 学校编号\t|学校名字 |男团体总分|女团体总分|总分 |------|\n");
printf("\t|----------------------------------------------------------------|\n");
for (i = 2;i<=as->school_num;i++)
{ as->school[0].boys_score = as->school[i].boys_score;
as->school[0].girl_score = as->school[i].girl_score;
as->school[0].shool_score = as->school[i].shool_score;
as->school[0].school = as->school[i].school;
strcpy(as->school[0].school_name,as->school[i].school_name);
j = i - 1;
while (as->school[0].girl_score < as->school[j].girl_score && j >0)
{ as->school[j+1].boys_score = as->school[j].boys_score;
as->school[j+1].girl_score = as->school[j].girl_score;
as->school[j+1].shool_score = as->school[j].shool_score;
as->school[j+1].school = as->school[j].school;
strcpy(as->school[j+1].school_name,as->school[j].school_name);
j--;
}
as->school[j+1].boys_score =
展开阅读全文