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