1、数据结构课程设计汇报书 课内设计任务一:1. 设计题目:运动会分数统计2.任务:参与运动会有n个学校,学校编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不一样项目取前五名或前三名积分;取前五名积分分别为:7、5、3、2、1,前三名积分分别为:5、3、2;哪些项目取前五名或前三名由学生自己设定。(m=20,n=20)3. 功效要求:1) 能够输入各个项目标前三名或前五名成绩;2) 能统计各学校总分;3) 能够按学校编号、学校总分、男女团体总分排序输出;4) 能够按学校编号查询学校某个项目标情况;5) 能够按项目编号查询取得前三或前五名学校。需求分析: 本
2、程序需要建立两个个线性表,一个计运动项目,一个计学校,项目信息中统计了前几名,经过遍历项目表能够统计出每个学校成绩,统计出成绩统计在学校数组中,最终算出男子,女子和总体总分,并以此排序。概要设计:typedef struct school char name60; int id; int male_score; int female_score;School, * School_List;typedef struct sport char name60; int id; int category; int winner5;Sport, * Sport_List; School_List scl
3、; Sport_List spl;具体设计:# include#include#include#includetypedef struct school char name60; int id; int male_score; int female_score;School, * School_List;typedef struct sport char name60; int id; /类别(积分类型1:75321;0:532) int category; int winner5;Sport, * Sport_List;/统计每个学校分数void count_score(int m, int
4、 n, int w, School_List scl,Sport_List spl) int i = 0; /初始化分数为0 for(i;in;i+) scli.male_score = 0; scli.female_score = 0; /统计男子项目 for(i=0;im;i+) if(spli.category = 1) sclspli.winner0-1.male_score += 7; sclspli.winner1-1.male_score += 5; sclspli.winner2-1.male_score += 3; sclspli.winner3-1.male_score +
5、= 2; sclspli.winner4-1.male_score += 1; else sclspli.winner0-1.male_score += 5; sclspli.winner1-1.male_score += 3; sclspli.winner2-1.male_score += 2; /女子项目 for(i=m;im+w;i+) if(spli.category = 1) sclspli.winner0-1.female_score += 7; sclspli.winner1-1.female_score += 5; sclspli.winner2-1.female_score
6、+= 3; sclspli.winner3-1.female_score += 2; sclspli.winner4-1.female_score += 1; else sclspli.winner0-1.female_score += 5; sclspli.winner1-1.female_score += 3; sclspli.winner2-1.female_score += 2; /初始化全部数据void init(int *m, int *n, int *w,School_List *scl,Sport_List *spl) *m = *n = *w = 0; /初始化数量 int
7、M,N,W; M = N = W = 0; printf(课题1:运动会分数统计) ; printf(请分别输入学校数目,男子项目和女子项目数:n); while(N 20) printf(学校数目(1-20):); fflush(stdin); scanf(%d,&N); while(M 20) printf(男子项目数(1-20):); fflush(stdin); scanf(%d,&M); while(W 20) printf(女子项目数(1-20):); fflush(stdin); scanf(%d,&W); *m = M; *n = N; *w = W; /分配空间 *scl =
8、 (School*)malloc(N * sizeof(School); *spl = (Sport*)malloc(M+W) * sizeof(Sport); /初始化项目学校基础信息 School_List sh_l = *scl; Sport_List sp_l = *spl; int i = 0; printf(请依次输入%d个学校名称:n,N); for(i;iN;i+) fflush(stdin); scanf(%s,sh_li.name); sh_li.id = i+1; printf(请依次输入%d个男子项目:n,M); for(i=0;iM;i+) fflush(stdin)
9、; scanf(%s,sp_li.name); sp_li.id = i+1; printf(请依次输入%d个女子项目:n,W); for(i=M;iM+W;i+) fflush(stdin); scanf(%s,sp_li.name); sp_li.id = i+1; /初始化项目成绩 printf(请依次输入%d个项目标积分类型和成绩:n,W+M); for(i=0;iM+W;i+) sp_li.category = -1; while(sp_li.category != 1 & sp_li.category != 0) printf(选择%s积分类型(1.统计前5名;0.统计前3名):,
10、sp_li.name); fflush(stdin); scanf(%d,&sp_li.category); if(sp_li.category = 1) printf(请次序输入%s前五名所属学校(1-%d):,sp_li.name,N); fflush(stdin); scanf(%d%d%d%d%d,&(sp_li.winner0),&(sp_li.winner1),&(sp_li.winner2),&(sp_li.winner3),&(sp_li.winner4); int j = 0; for(j;j N | sp_li.winnerj 1) /不正当输入强制设为1 sp_li.wi
11、nnerj = 1; else printf(请次序输入%s前三名所属学校(1-%d):,sp_li.name,N); fflush(stdin); scanf(%d%d%d,&(sp_li.winner0),&(sp_li.winner1),&(sp_li.winner2); sp_li.winner3 = sp_li.winner4 = 0; int j = 0; for(j;j *n | sp_li.winnerj 1) /不正当输入强制设为1 sp_li.winnerj = 1; count_score(M,N,W,sh_l,sp_l);/按学校编号查询全部项目标成绩void gets
12、hool_mark(int s_id, int m, int w, School_List scl, Sport_List spl) printf(学校%s在此次运动会成绩:n,scls_id-1.name); int i = 0; for(i;im+w;i+) int j = 0; if(spli.category = 1) for(j;j5;j+) if(s_id = spli.winnerj) printf(在%s中取得第%d名!n,spli.name,1+j); else for(j;j3;j+) if(s_id = spli.winnerj) printf(在%s中取得第%d名!n,
13、spli.name,1+j); /按项目编号查询前几名学校void getsport_inf(int s_id, School_List scl, Sport_List spl) if(spls_id-1.category = 1) printf(%s前五名分别为:n,scls_id-1.name); int j=0; for(j;j5;j+) printf(第%d名:%d%sn,1+j,spls_id-1.winnerj,sclspls_id-1.winnerj-1.name); else printf(%s前三名分别为:n,scls_id-1.name); int j=0; for(j;j
14、 5 | choose 0) printf(0.返回n); printf(1.按学校编号输出n); printf(2.按成绩排名输出n); printf(3.按男子成绩输出n); printf(4.按女子成绩输出n); fflush(stdin); scanf(%d,&choose); int i = 0; switch(choose) case 0: return; case 1: for(i=0;in;i+) printf(%d:%s总分为%dn,1+i,scli.name,scli.male_score+scli.female_score); break; case 2: int *ma
15、x=new intn; for(i=0;in;i+) maxi = i; /排序,maxi统计第i大项位置 for(i=0;in-1;i+) int j = 1+i; for(j;jn;j+) if(sclmaxi.male_score + sclmaxi.female_score sclmaxj.male_score + sclmaxj.female_score) maxi = maxj + maxi; maxj = maxi - maxj; maxi = maxi - maxj; /输出 for(i=0;in;i+) printf(%d:%s总分为%dn,1+maxi, sclmaxi.n
16、ame, sclmaxi.male_score+sclmaxi.female_score); break; case 3: int *max=new intn; for(i=0;in;i+) maxi = i; /排序,maxi统计第i大项位置 for(i=0;in-1;i+) int j = 1+i; for(j;jn;j+) if(sclmaxi.male_score sclmaxj.male_score) maxi = maxj + maxi; maxj = maxi - maxj; maxi = maxi - maxj; /输出 for(i=0;in;i+) printf(%d:%s男
17、子项目总分为%dn,1+maxi, sclmaxi.name, sclmaxi.male_score); break; case 4: int *max=new intn; for(i=0;in;i+) maxi = i; /排序,maxi统计第i大项位置 for(i=0;in-1;i+) int j = 1+i; for(j;jn;j+) if(sclmaxi.female_score sclmaxj.female_score) maxi = maxj + maxi; maxj = maxi - maxj; maxi = maxi - maxj; /输出 for(i=0;i n | sid
18、1) printf(请输入需查询学校编号(1-%d):n,n); scanf(%d,&sid); getshool_mark(sid, m, w, scl, spl); break; case 3: int i = 0; for(i;i m+w | sid 1) printf(请输入需查询项目编号(1-%d):n,m+w); fflush(stdin); scanf(%d,&sid); getsport_inf(sid, scl, spl); break; return 0;调试分析:a)因为n忘记添加造成界面混乱。b)有值在循环时,程序自动判定有时不正当,所以需要循环前进行判定。或强制讲不正
19、当内容默认为1.c.) max没有要求用户手册:演示程序运行环境为 Windows8系统,C-free 5 中C-free5.0中运行。实施文件为:sports_meet.exe(1) 进入演示程序后即显示 DOS 形式界面: (2) 输入各个项目和名次,系统计算排名。 (3) 接收其它命令后即实施对应运算和显示对应结果。测试结果:课内设计任务二:1.哈希表查找设计问题描述:设哈希表长为20,用除留余数法结构一个哈希函数,以开放定址法中线性探测再散列法作为处理冲突方法,编程实现哈希表查找、插入和建立算法。测试数据关键字组为19,01,23,14,55,20,84,27,68,11,10,77,
20、哈希函数为H(key)=key%132.需求分析:1. 用户能够依据自己需求输入一个次序表(哈希表)2. 经过用除留余数法结构哈希函数,并用开放地址二次探测再散列处理冲突。3. 在经过排序后显示该哈希表。4. 程序实施命令包含:创建哈希表 输出哈希表 二次探测再散列处理冲突3.概要设计: #include #include #include #include #include #define TableSize 20 #define SUCCESS 1 #define UNSUCCESS 0 typedef int Status;typedef struct int key; Elemtype
21、; typedef struct Elemtype elem; int tag; HashItem; typedef struct HashItem tableTableSize; int currentSize; HashTable;Status Initiate(HashTable *h) int i; for(i=0; iTableSize; i+) (*h).tablei.tag=0; (*h).tablei.elem.key=NULL; (*h).currentSize=0; return SUCCESS; int SearchHash(HashTable h, Elemtype x
22、, int p) int i=x.key%p; int j=i; while(h.tablej.tag=1 & h.tablej.elem.key!=x.key) j=(j+1)%TableSize; if(j=i) cout哈希表中未查找到x.keyendl;return TableSize; if(h.tablej.tag=1) cout该元素在哈希表第j位endl; return -j; else cout哈希表中未查找到x.keyendl; return j; Status Insert(HashTable *h, Elemtype x, int p) int i=SearchHash
23、(*h, x, p); if(i0) coutx.key元素已存在,无法再录入,操作失败!endlendl; return UNSUCCESS; else if(i!=TableSize & (*h).tablei.tag!=1) (*h).tablei.elem.key=x.key; (*h).tablei.tag=1; (*h).currentSize+; cout录入成功!endlendl; return SUCCESS; else if(i=TableSize) cout哈希表已满,无法再插入x.key,操作失败!endlendl; return UNSUCCESS; Status P
24、rint(HashTable h) coutendl哈希表序数 存放情况 存放元素endl; for(int i=0;iTableSize;i+) coutsetw(4)isetw(10)h.tablei.tagsetw(10)h.tablei.elem.keyendl; coutendl表中非空元素个数:h.currentSizeendlendl; return SUCCESS; int main( ) coutendl* 哈希表设计*endlendl; HashTable h; Initiate(&h); int prime; coutprime; char choice; while(1
25、) coutendl; cout按 a 输出哈希表endl; cout按 b 查找指定元素在表中位置endl; cout按 c输入,插入元素endl; cout按 其它键 退出endlendlchoice; coutendl; switch(choice) casea: Print(h); break;caseb: couta.key;SearchHash(h,a,prime);break;casec:coutn;Elemtype *pi=0;pi=(Elemtype*)malloc(n*sizeof(Elemtype);cout请依次输入n个元素值:endl;for(i=0;ipii.key; Insert(&h,pii,prime);break;default:return 0; 用户手册:演示程序运行环境为 Windows8系统,C-free 5 中C-free5.0中运行(4) 进入演示程序后即显示 DOS 形式界面: (5) 输入除数. (6) 接收其它命令后即实施对应运算和显示对应结果。测试结果: