收藏 分销(赏)

东华大学数据结构课程设计哈希表和运动会.doc

上传人:仙人****88 文档编号:11721984 上传时间:2025-08-09 格式:DOC 页数:25 大小:797.54KB 下载积分:10 金币
下载 相关 举报
东华大学数据结构课程设计哈希表和运动会.doc_第1页
第1页 / 共25页
东华大学数据结构课程设计哈希表和运动会.doc_第2页
第2页 / 共25页


点击查看更多>>
资源描述
东华大学 课程设计报告 设 计 题 目: 运动会分数统计 哈希表查找的设计 【设计题目一】 运动会分数统计 任务 参加运动会有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 =
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服