《校园十大优秀青年评比》由会员分享,可在线阅读,更多相关《校园十大优秀青年评比(8页珍藏版)》请在金锄头文库上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流校园十大优秀青年评比.精品文档.实验报告实验课名称:数据结构实验实验名称:校园十大优秀青年评比班级:20130613学号:16姓名:施洋时间:2015-5-25一、问题描述新一届校园十大青年评比开始了!每一位在校学生可通过网上评比系统,为自己认为优秀的学生提名与投票。请开发一个用于该需求的系统,满足下列基本功能:(1)提名优秀学生与投票。(2)查看提名学生的基本信息。(3)显示各提名学生的票数。(4)显示排行榜。基本要求:(1)采用散列存储,存放提名学生的相关信息。(2)设计哈希函数和冲突解决方法。(3)提名学生至少包括以下信息:姓名、票数、
2、个人基本信息(如:班级、专业、年级、突出事迹等)。(4)设计输入提名学生信息的界面。(5)完成基本功能。(6)界面友好,操作简单。(7)设计足够多的测试用例。(8)查看指定学生的票数。二、数据结构设计1)用哈希表存储提名学生相关信息。每位选手即学生的基本信息含有多个属性,为此可根据学生信息建立结构体,如下:struct studentchar name40;/姓名的拼音+学号int number;/票数int Class;/班级char Major50;/专业char Grade10;/年级char Honour100;/突出事迹;(2)设计哈希函数,并用开放定址线性探测法处理冲突。(3)设计
3、一个投票系统类:votesystemclass votesystemprivate:student *stu;int count;/当前元素个数int sizeindex;/哈希表长public:votesystem() stu=NULL;count=0;sizeindex=0;votesystem() delete stu;count=0;void InitHashTable(int n);/初始化哈希表int Hash(char *name);/哈希函数void collision(int &s)s=s+;/开放定址线性探测法处理冲突int search(char *name,int&k)
4、;/查找void insert(char*name);/插入int vote(char*name);/投票void display();/显示哈希表void showvote(int k); /按哈希表下标显示票数void showrank();/显示排行榜;三、算法设计votesystem成员函数详细设计:(1)哈希函数Hash根据实现要点提示设计哈希函数int votesystem:Hash(char *name)/哈希函数char *p=name;int key=0;while(*p)key+=int(*p);p+;return key%sizeindex;(2)查找函数search S
5、tep1:对指定的选手调用哈希函数求值 Step2:用开放定址线性探测法处理冲突,在哈希表中查找k=Hash(name);/哈希函数定位while(stuk.name0!=0&strcmp(stuk.name,name) collision(k);/处理冲突Step3:若找到返回1;否则返回0if(!strcmp(stuk.name,name) return 1;/找到else return 0;(3)插入函数insert Step1:调用查找函数search,找到插入信息的位置 Step2:按照提名学生信息示例格式输入学生的信息void votesystem:insert(char *nam
6、e)int s;char a2;search(name,s);cout提名学生信息格式如下:nt班级:2nt专业:软件工程nt年级:二n t突出事迹:全国三好学生n;strcpy(stus.name,name);coutstus.Class;cout专业:t;cin.getline(a,2);cin.getline(stus.Major,50);cout年级:t;cin.getline(stus.Grade,10);cout突出事迹:t;cin.getline(stus.Honour,100);Step3:提名即为投一票,同时当前元素个数加1stus.number=1;/提名即为投一票coun
7、t+;/当前人数加1(4)投票函数voteStep1:记录已存在时调用search函数int votesystem:vote(char*name) int s;int f;f=search(name,s);/定位if(f) stus.number+;return 1;/投票成功else return 0;/投票失败Step2:记录不存在时,转到提名或返回cout无此记录!n;cout 1、提名该学生n 2、返回nt;if(t=1) L.insert(name);cout提名成功n;(5)显示哈希表函数display 从表头开始,若表中记录已存在,则输出该学生的基本信息:姓名,票数,专业,年级,
8、班级,突出事迹;否则转到下一个。void votesystem:display()for(int i=0;isizeindex;i+)if(stui.name0!=0)coutstui.name stui.number票 stui.Major stui.Grade stui.Class班 stui.Honourtendl;(6)显示排行榜函数showrankStep1:定义一个数组a11,存储前十名在哈希表中的下标,并初始化数组 Step2:从哈希表表头开始依次访问,记录存在时即转到Step3 Step3:利用插入法对进行记录进行排序 Step4:将哈希表下标保存到数组a中int a11;/定
9、义一个数组存放前十名在哈希表中的下标for(int i=0;i10;i+) ai=-1; for( i=0;i=0;k-)/利用插入法进行排序if(ak-1) if(stuak.numberstui.number)ak+1=ak;else break; ak+1=i;Step5:根据数组a中排序结果,顺序输出前十名选手的姓名,票数for(i=0;i-1;i+)/对前十名输出 coutstuai.nametstuai.numberendl;四、界面设计*1、选手信息 2、选手得票数 3、投票 4、排行榜 5、退出系统 * 五、 运行测试与分析(1)对记录不存在的学生进行投票,即提名过程依此模式对记录不存在的学生进行提名,具体信息如图(3)所示(2)对记录已存在的选手进行投票(3)显示选手信息(4)显示排行榜(5)显示指定选手得票数(6)显示记录不存在选手的得票数(7)选择无效操作六、实验收获与思考通过此次课程设计,我又一次复习了数据结构的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一点又一点的纠正终于实现了投票系统的基本功能,对哈希函数有了更深入的学习与运用。教师评分:教师签字: