校园十大优秀青年评比数据结构课程设计报告书.docx
- 文档编号:9631381
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:33
- 大小:374.72KB
校园十大优秀青年评比数据结构课程设计报告书.docx
《校园十大优秀青年评比数据结构课程设计报告书.docx》由会员分享,可在线阅读,更多相关《校园十大优秀青年评比数据结构课程设计报告书.docx(33页珍藏版)》请在冰豆网上搜索。
校园十大优秀青年评比数据结构课程设计报告书
1.问题的描述和分析1
1.1问题描述1
1.2问题分析2
2.概要设计3
2.1系统模块划分3
2.2ADT(抽象数据类型)描述3
3.详细设计3
3.1ADT基本操作算法设计4
3.2功能模块设计4
4.运行和调试13
4.1运行和测试13
4.2调试记录与收获16
1.问题的描述和分析
1.1问题描述
新一届校园十大青年评比开始了!
每一位在校学生可通过网上评比系统,为自己认为优秀的学生提名与投票。
请开发一个用于该需求的系统,满足下列基本功能:
(1)提名优秀学生与投票。
(2)查看提名学生的基本信息。
(3)显示各提名学生的票数。
(4)显示排行榜。
一.基本要求:
.
(1)采用散列存储,存放提名学生的相关信息。
(2)设计哈希函数和冲突解决方法。
(3)提名学生至少包括以下信息:
姓名、票数、个人基本信息(如:
班级、专业、年级、突出事迹等)。
(4)设计输入提名学生信息的界面。
(5)完成基本功能。
(6)界面友好,操作简单。
(7)设计足够多的测试用例。
(8)查看指定学生的票数。
(9)按序显示各提名学生票数。
二.较高要求
(1)限制每人的投票次数。
(2)按软件要求,扩充其他功能。
(3)实现数据的后效验,即不接收非法数据。
1.2问题分析
(1)用哈希表存储提名学生相关信息。
每位选手即学生的基本信息含有多个属性,为此可根据学生信息建立结构体,如下:
structstudent{
charname[20];//姓名的拼音
intstudentnum;//学号
intnumber;//票数
intClass;//班级
charmajor[30];//专业
chargrade[10];//年级
charachievement[200];//突出事迹
};
(2)设计哈希函数,并用开放定址线性探测法处理冲突。
哈希函数根据姓名拼音的ascll码来设计,hash(key)=key%hashlength,其中k为姓名所有拼音的ascll码值的累加和,hashlength为表长。
因此需储存学生姓名的拼音。
(3)设计一个投票系统类:
votesystem
classvotesystem{
private:
student*st;
intcount;//当前元素个数
inthashlength;//哈希表长
public:
votesystem(){st=NULL;count=0;hashlength=0;}
~votesystem(){delete[]st;count=0;}
voidHashTable(intn);//初始化哈希表
intHash(char*name);//哈希函数
voidcollision(int&s){s=s++;}//开放定址线性探测法处理冲突
inthashfind(char*name,int&k);//查找
voidinserthash(char*name);//插入
intvote(char*name);//投票
voiddisplay();//显示哈希表
voidshowvote(intk);//按哈希表下标显示票数
voidshowrank();//显示排行榜
};
(4)加入用户登录系统,所以同时构造用户user的结构体;
结构体中需要有用户姓名和用户权限次数的数据。
structuser{
charusername[20];
introot;
user(){root=4;}
};
2.概要设计
2.1系统模块划分
图2-1系统模块图
2.2ADT(抽象数据类型)描述
1.
为了满足程序功能的设计,定义了两个结构体;
分别是学生选手student和登录用户user;
2.
定义了投票系统类classvotesystem;
3.详细设计
3.1ADT基本操作算法设计
3.1.1
structstudent{
charname[20];//姓名的拼音
intstudentnum;//学号
intnumber;//票数
intClass;//班级
charmajor[30];//专业
chargrade[10];//年级
charachievement[200];//突出事迹
};
structuser{
charusername[20];
introot;
user(){root=4;}
};
userstore[20];
3.1.2
classvotesystem{
private:
student*st;
intcount;//当前元素个数
inthashlength;//哈希表长
public:
votesystem(){st=NULL;count=0;hashlength=0;}
~votesystem(){delete[]st;count=0;}
voidHashTable(intn);//初始化哈希表
intHash(char*name);//哈希函数
voidcollision(int&s){s=s++;}//开放定址线性探测法处理冲突
inthashfind(char*name,int&k);//查找
voidinserthash(char*name);//插入
intvote(char*name);//投票
voiddisplay();//显示哈希表
voidshowvote(intk);//按哈希表下标显示票数
voidshowrank();//显示排行榜
};
3.2功能模块设计
3.2.1评比界面模块
(1)界面设计
(2)处理流程设计
评比系统选择界面:
由于选择结构比较单一,故在选择时没有选择使用switch语句,使用简单的if语句;
while(choice!
=2)
{system("cls");
cout<<"***欢迎来到校园十大优秀青年评比系统***"< charusername[20]; cout<<"1.=============>投票<=============="< cin>>choice; if(choice==1) {…… } elsecout<<"退出成功! "; 3.2.2用户登录模块 (1)界面设计 (2)处理流程设计 while(choose! =5)//不是选择5的情况下继续运行,否则退出 { cout<<"****************************\n" <<"校园十大优秀青年评比系统\n" <<"1、提名选手信息\n" <<"2、查询选手得票\n" <<"3、=======>投票\n" <<"4、前十排行榜单\n" <<"5、退出投票系统\n" <<"****************************\n" <<"感谢使用本系统! O(∩_∩)O"< "; cin>>choose; if(choose==3)//每次投票后限制次数减一 store[i].root--; switch(choose) { chara[2]; case1: L.display();break; case2: cout<<"请输入选手姓名的拼音(如: zhangjing): "< cin.getline(a,2); cin.getline(name,20); intf; f=L.hashfind(name,k); if(f)L.showvote(k),cout< elsecout<<"选手尚未提名! \n"; break; case3: if(store[i].root<=0)//当限制次数使用全部后,3操作不可继续操作 { cout<<"【每人限投3票,您的投票次数已经用完】。 "< break; } else cout<<"请输入选手姓名的拼音(如: zhangjing): "< cin.getline(a,2); cin.getline(name,20); f=L.hashfind(name,k); if(f){L.vote(name);cout<<"投票成功! 剩余投票次数为: "<<(store[i].root-1)< else { cout<<"无此记录! \n"; cout<<"1、提名该学生\n" <<"2、返回系统界面\n" <<"请选择操作: "; intt; cin>>t; if(t==1) { L.inserthash(name); cout<<"选手提名成功\n"; cout<<"剩余投票次数为: "<<(store[i].root-1)< } } break; case4: L.showrank(); break; case5: cout<<"已登出,感谢您的使用! "< break; default: cout<<"操作无效,请重新选择! \n"; break; } 3.2.3选手信息模块 (1)界面设计 (2)处理流程设计 此处利用了类votesystem中定义的函数display;显示哈希表保存的下标对应储存位置中的数据; voidvotesystem: : display()//【显示哈希表】 { for(inti=0;i if(st[i].name[0]! ='\0') cout< < < < < < < < } 3.2.4查询得票模块 (1)界面设计 (2)处理流程设计 利用类中定义的函数showvote,表现出选手得票数;得票数储存在用哈希表下表表示位置的student类型的数组中; voidvotesystem: : showvote(intk)//【按哈希表下标显示票数】 { cout<<"现得票数: "< } 3.2.5投票模块 (1)界面设计 (2)处理流程设计 投票模块的功能是整个系统中最主要的,其中需要考虑的有进行姓名插入时调用的哈西函数,使其排序更合理;同时调用的collision。 用以解决冲突。 intvotesystem: : Hash(char*name)//【哈希函数】 { char*p=name; intkey=0; while(*p) { key+=int(*p); p++; } returnkey%hashlength; } 查找函数用以检验表中是否会产生冲突,并解决; intvotesystem: : hashfind(char*name,int&k)//【查找】 { k=Hash(name);//哈希函数定位 while(st[k].name[0]! ='\0'&&strcmp(st[k].name,name)) collision(k);//处理冲突 if(! strcmp(st[k].name,name))return1;//【找到】 elsereturn0; } 投票函数同时调用了查找,哈西函数; intvotesystem: : vote(char*name)//记录已存在时调用hashfind函数【投票】 { ints; intf; f=hashfind(name,s);//定位 if(f){st[s].number++;return1;}//投票成功 elsereturn0;//投票失败 } 3.2.6前十排行模块 (1)界面设计 (2)处理流程设计 选择4选项后,调用的类中的showrank函数;利用循环去其前十名,并且其中使用的插入排序法使数据中的票数按降序排列;再输出。 voidvotesystem: : showrank()//【显示排行榜】 { inta[11];//定义一个数组存放前十名在哈希表中的下标 for(inti=0;i<10;i++)a[i]=-1; for(i=0;i { if(st[i].name[0]! ='\0') { for(intk=9;k>=0;k--)//利用插入法进行排序 { if(a[k]>-1) { if(st[a[k]].number a[k+1]=a[k]; elsebreak; } } a[k+1]=i; } } cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"得票数"<<'\t'< for(i=0;i<10&&a[i]>-1;i++)//输出前十名 cout< < < < } 3.2.7退出系统模块 (1)界面设计 (2)处理流程设计 当在用户界面选择5退出后,此时会清除屏幕上的信息同时回到系统界面;等待新的用户使用。 当在系统界面登出后,则程序运行结束; 4.运行和调试 4.1运行和测试 通过不同的用户登录,输入下面的数据; 测试数据: 学号 姓名拼音 票数 班级 专业 年级 突出事迹 11113042030 luyu 1 2 软件 二 全国大学生广告艺术大赛一等奖 1113042039 caizhitong 1 2 软件 二 全国大学生街舞大赛一等奖 1113042041 wangyongxi 1 2 软件 二 全国多媒体课件设计大赛一等奖 1113042042 sunqianping 1 2 网络 二 全国大学生摄影比赛一等奖 1113042045 majingchao 2 2 计 二 全国三好学生 1113042046 xuyang 1 2 软外 二 中国名校大学生辩论赛一等奖 1113042047 guopeng 1 2 网络 二 中国大学生数学建模竞赛一等奖 1113022053 Zhangjing 4 2 计 二 全国优秀短篇小说奖 1113042049 lihong 2 2 计 二 全国物理竞赛一等奖 1113042050 liuhan 2 2 网络 二 国家一等奖学金 1113042051 wangjian 1 2 软件 二 全国软件设计大赛一等奖 1113042059 chenwan 1 2 网合 二 全国大学生创业大赛一等奖 (1)对不存在的记录提名, (2)选择“1”,查询选手信息; (3)选择“2”,定位查询选手票数; (4)选择“3”,若选手已经提名;则直接记录; (5)选择“4”查询前十名榜单; (6)选择“5”,退出用户系统时,回到系统界面,同时清除之前信息,等待其他用户登录; 4.2调试记录与收获 通过一周的课程设计,我再一次复习了数据结构的知识,在设计过程中虽然遇到了不少问题,但经过一次又一次的思考,一点又一点的纠正终于实现了投票系统的基本功能并且完成了系统的功能的添加。 我认为,在这学期的课程设计中,不仅培养了独立思考和操作的能力,在各种其它能力上也都有了提高,比如,我们在查找大量资料的过程中渐渐地培养了搜索信息的能力。 更重要的是,在设计中,我们学会了很多学习方法。 在此次课程设计中,在收获知识的同时,还收获了阅历,收获了成熟。 然而,这个程序还有不完善的地方,让我清楚地认识到了自己能力的欠缺。 我再次确信要更加努力,更加完善提高编程能力,为将来步入社会奠定基础。 源代码: #include #include #include #include"stdio.h" #include"windows.h" structstudent{ charname[20];//姓名的拼音 intstudentnum;//学号 intnumber;//票数 intClass;//班级 charmajor[30];//专业 chargrade[10];//年级 charachievement[200];//突出事迹 }; structuser{ charusername[20]; introot; user(){root=4;} }; userstore[20]; classvotesystem{ private: student*st; intcount;//当前元素个数 inthashlength;//哈希表长 public: votesystem(){st=NULL;count=0;hashlength=0;} ~votesystem(){delete[]st;count=0;} voidHashTable(intn);//初始化哈希表 intHash(char*name);//哈希函数 voidcollision(int&s){s=s++;}//开放定址线性探测法处理冲突 inthashfind(char*name,int&k);//查找 voidinserthash(char*name);//插入 intvote(char*name);//投票 voiddisplay();//显示哈希表 voidshowvote(intk);//按哈希表下标显示票数 voidshowrank();//显示排行榜 }; voidvotesystem: : HashTable(intn)//【初始化哈希表】 { hashlength=n; st=newstudent[hashlength]; for(inti=0;i st[i].name[0]='\0'; } intvotesystem: : Hash(char*name)//【哈希函数】 { char*p=name; intkey=0; while(*p) { key+=int(*p); p++; } returnkey%hashlength; } intvotesystem: : hashfind(char*name,int&k)//【查找】 { k=Hash(name);//哈希函数定位 while(st[k].name[0]! ='\0'&&strcmp(st[k].name,name)) collision(k);//处理冲突 if(! strcmp(st[k].name,name))return1;//【找到】 elsereturn0; } voidvotesystem: : inserthash(char*name)//【插入】 { ints;chara[2]; hashfind(name,s); cout<<"提名学生信息格式如下: \n" <<"\t学号: 1113022053\n" <<"\t班级: 2\n" <<"\t专业: 计算机\n" <<"\t年级: 二\n" <<"\t突出事迹: 好好学习,天天向上! \n"; strcpy(st[s].name,name); cout<<"学号: \t";cin>>st[s].studentnum; cout<<"班级: \t";cin>>st[s].Class; cout<<"专业: \t";cin.getline(a,2);cin.getline(st[s].major,30); cout<<"年级: \t";cin.getline(st[s].grade,10); cout<<"突出事迹: \t";cin.getline(st[s].achievement,200); st[s].number=1;//提名即为投一票 count++;//当前人数加1 } intvotesystem: : vote(char*name)//记录已存在时调用hashfind函数【投票】 { ints; intf; f=hashfind(name,s);//定位 if(f){st[s].number++;return1;}//投票成功 elsereturn0;//投票失败 } voidvotesystem: : display()//【显示哈希表】 { for(inti=0;i if(st[i].name[0]! ='\0')
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 校园 优秀青年 评比 数据结构 课程设计 报告书