1、校园十大优秀青年评比数据结构课程设计报告书1.问题的描述和分析 11.1问题描述 11.2 问题分析 22.概要设计 32.1系统模块划分 32.2 ADT(抽象数据类型)描述 33.详细设计 33.1 ADT基本操作算法设计 43.2 功能模块设计 44.运行和调试 134.1 运行和测试 134.2 调试记录与收获 161.问题的描述和分析1.1问题描述新一届校园十大青年评比开始了!每一位在校学生可通过网上评比系统,为自己认为优秀的学生提名与投票。请开发一个用于该需求的系统,满足下列基本功能:(1)提名优秀学生与投票。(2)查看提名学生的基本信息。(3)显示各提名学生的票数。(4)显示排行
2、榜。一基本要求:.(1)采用散列存储,存放提名学生的相关信息。(2)设计哈希函数和冲突解决方法。(3)提名学生至少包括以下信息:姓名、票数、个人基本信息(如:班级、专业、年级、突出事迹等)。(4)设计输入提名学生信息的界面。(5)完成基本功能。(6)界面友好,操作简单。(7)设计足够多的测试用例。(8)查看指定学生的票数。(9)按序显示各提名学生票数。二较高要求(1)限制每人的投票次数。(2)按软件要求,扩充其他功能。(3)实现数据的后效验,即不接收非法数据。1.2 问题分析(1)用哈希表存储提名学生相关信息。每位选手即学生的基本信息含有多个属性,为此可根据学生信息建立结构体,如下:struc
3、t student char name20;/姓名的拼音 int studentnum;/学号 int number;/票数 int Class;/班级 char major30;/专业 char grade10;/年级 char achievement200;/突出事迹;(2)设计哈希函数,并用开放定址线性探测法处理冲突。哈希函数根据姓名拼音的ascll码来设计,hash(key)=key%hashlength,其中k为姓名所有拼音的ascll码值的累加和,hashlength为表长。因此需储存学生姓名的拼音。(3)设计一个投票系统类:votesystemclass votesystempr
4、ivate: student *st; int count;/当前元素个数 int hashlength;/哈希表长public: votesystem() st=NULL;count=0;hashlength=0; votesystem() delete st;count=0; void HashTable(int n);/初始化哈希表 int Hash(char *name);/哈希函数 void collision(int &s)s=s+;/开放定址线性探测法处理冲突 int hashfind(char *name,int&k);/查找 void inserthash(char*name
5、);/插入 int vote(char*name);/投票 void display();/显示哈希表 void showvote(int k); /按哈希表下标显示票数 void showrank();/显示排行榜;(4)加入用户登录系统,所以同时构造用户user的结构体;结构体中需要有用户姓名和用户权限次数的数据。struct user char username20; int root; user()root=4;2.概要设计2.1系统模块划分图2-1 系统模块图2.2 ADT(抽象数据类型)描述1.为了满足程序功能的设计,定义了两个结构体;分别是学生选手student和登录用户user
6、;2.定义了投票系统类class votesystem;3.详细设计3.1 ADT基本操作算法设计3.1.1struct student char name20;/姓名的拼音 int studentnum;/学号 int number;/票数 int Class;/班级 char major30;/专业 char grade10;/年级 char achievement200;/突出事迹;struct user char username20; int root; user()root=4;user store20;3.1.2class votesystemprivate: student *
7、st; int count;/当前元素个数 int hashlength;/哈希表长public: votesystem() st=NULL;count=0;hashlength=0; votesystem() delete st;count=0; void HashTable(int n);/初始化哈希表 int Hash(char *name);/哈希函数 void collision(int &s)s=s+;/开放定址线性探测法处理冲突 int hashfind(char *name,int&k);/查找 void inserthash(char*name);/插入 int vote(c
8、har*name);/投票 void display();/显示哈希表 void showvote(int k); /按哈希表下标显示票数 void showrank();/显示排行榜;3.2 功能模块设计3.2.1 评比界面模块(1)界面设计(2)处理流程设计评比系统选择界面:由于选择结构比较单一,故在选择时没有选择使用switch语句,使用简单的if语句;while(choice!=2) system(cls); cout*欢迎来到校园十大优秀青年评比系统*endl; char username20; cout投票=endl退出=choice;if(choice=1) else cout退
9、出成功!;3.2.2 用户登录模块(1)界面设计(2)处理流程设计while(choose!=5)/不是选择5的情况下继续运行,否则退出 cout*n 校园十大优秀青年评比系统n 1、 提名选手信息n 2、 查询选手得票n 投票n 4、 前十排行榜单n 5、 退出投票系统n *n 感谢使用本系统!O(_)Oendlchoose;if(choose=3)/每次投票后限制次数减一 storei.root-; switch(choose) char a2; case 1: L.display();break; case 2: cout请输入选手姓名的拼音(如:zhangjing ):endl; ci
10、n.getline(a,2); cin.getline(name,20); int f; f=L.hashfind(name,k); if(f) L.showvote(k),coutendl; else cout选手尚未提名!n; break; case 3: if(storei.root=0)/当限制次数使用全部后,3操作不可继续操作 cout【每人限投3票,您的投票次数已经用完】。endl; break; else cout请输入选手姓名的拼音(如:zhangjing ):endl; cin.getline(a,2); cin.getline(name,20); f=L.hashfind(
11、name,k); if(f) L.vote(name);cout投票成功!剩余投票次数为:(storei.root-1)endl; else cout无此记录!n; cout 1、提名该学生n 2、返回系统界面n t; if(t=1) L.inserthash(name); cout选手提名成功n; cout剩余投票次数为:(storei.root-1)endl; break; case 4: L.showrank(); break; case 5: cout已登出,感谢您的使用! endl; break; default: cout操作无效,请重新选择!n; break; 3.2.3选手信息
12、模块(1)界面设计(2)处理流程设计此处利用了类votesystem中定义的函数display;显示哈希表保存的下标对应储存位置中的数据;void votesystem:display()/【显示哈希表】 for(int i=0;ihashlength;i+) if(sti.name0!=0) coutsti.studentnum sti.name sti.number票 sti.major sti.grade sti.Class班 sti.achievementt endl;3.2.4查询得票模块(1)界面设计(2)处理流程设计利用类中定义的函数showvote,表现出选手得票数;得票数储存
13、在用哈希表下表表示位置的student类型的数组中;void votesystem:showvote(int k) /【按哈希表下标显示票数】 cout现得票数:stk.number;3.2.5 投票模块(1)界面设计(2)处理流程设计投票模块的功能是整个系统中最主要的,其中需要考虑的有进行姓名插入时调用的哈西函数,使其排序更合理;同时调用的collision。用以解决冲突。int votesystem:Hash(char *name)/【哈希函数】 char *p=name; int key=0; while(*p) key+=int(*p); p+; return key%hashleng
14、th;查找函数用以检验表中是否会产生冲突,并解决;int votesystem:hashfind(char *name,int&k)/【查找】 k=Hash(name);/哈希函数定位 while(stk.name0!=0&strcmp(stk.name,name) collision(k);/处理冲突 if(!strcmp(stk.name,name) return 1;/【找到】 else return 0;投票函数同时调用了查找,哈西函数;int votesystem:vote(char*name)/记录已存在时调用hashfind函数 【投票】 int s; int f; f=hash
15、find(name,s);/定位 if(f) sts.number+;return 1;/投票成功 else return 0;/投票失败3.2.6 前十排行模块(1)界面设计(2)处理流程设计选择4选项后,调用的类中的showrank函数;利用循环去其前十名,并且其中使用的插入排序法使数据中的票数按降序排列;再输出。void votesystem:showrank() /【显示排行榜】 int a11;/定义一个数组存放前十名在哈希表中的下标 for(int i=0;i10;i+) ai=-1; for( i=0;i=0;k-)/利用插入法进行排序 if(ak-1) if(stak.numb
16、ersti.number) ak+1=ak; else break; ak+1=i; cout学号t姓名t得票数tendl; for(i=0;i-1;i+)/输出前十名 coutstai.studentnumt stai.name t stai.numbert endl;3.2.7退出系统模块(1)界面设计(2)处理流程设计当在用户界面选择5退出后,此时会清除屏幕上的信息同时回到系统界面;等待新的用户使用。当在系统界面登出后,则程序运行结束;4.运行和调试4.1 运行和测试通过不同的用户登录,输入下面的数据;测试数据:学号姓名拼音 票数班级专业年级突出事迹11113042030lu yu 12
17、软件二全国大学生广告艺术大赛一等奖1113042039cai zhi tong12软件二全国大学生街舞大赛一等奖1113042041wang yong xi 12软件二全国多媒体课件设计大赛一等奖1113042042sun qian ping 12网络二全国大学生摄影比赛一等奖1113042045ma jing chao 22计二全国三好学生1113042046xu yang 12软外二中国名校大学生辩论赛一等奖1113042047guo peng 12网络二中国大学生数学建模竞赛一等奖1113022053Zhangjing42计二全国优秀短篇小说奖1113042049li hong 22计二
18、全国物理竞赛一等奖1113042050liu han 22网络二国家一等奖学金1113042051wang jian 12软件二全国软件设计大赛一等奖1113042059chen wan 12网合二全国大学生创业大赛一等奖(1) 对不存在的记录提名,(2) 选择“1”,查询选手信息;(3)选择“2”,定位查询选手票数;(4)选择“3”,若选手已经提名;则直接记录;(5)选择“4”查询前十名榜单;(6)选择“5”,退出用户系统时,回到系统界面,同时清除之前信息,等待其他用户登录;4.2 调试记录与收获通过一周的课程设计,我再一次复习了数据结构的知识,在设计过程中虽然遇到了不少问题,但经过一次又一
19、次的思考,一点又一点的纠正终于实现了投票系统的基本功能并且完成了系统的功能的添加。我认为,在这学期的课程设计中,不仅培养了独立思考和操作的能力,在各种其它能力上也都有了提高,比如,我们在查找大量资料的过程中渐渐地培养了搜索信息的能力。更重要的是,在设计中,我们学会了很多学习方法。在此次课程设计中,在收获知识的同时,还收获了阅历,收获了成熟。然而,这个程序还有不完善的地方,让我清楚地认识到了自己能力的欠缺。我再次确信要更加努力,更加完善提高编程能力,为将来步入社会奠定基础。 源代码:#include#include#include#includestdio.h#includewindows.hs
20、truct student char name20;/姓名的拼音 int studentnum;/学号 int number;/票数 int Class;/班级 char major30;/专业 char grade10;/年级 char achievement200;/突出事迹;struct user char username20; int root; user()root=4;user store20;class votesystemprivate: student *st; int count;/当前元素个数 int hashlength;/哈希表长public: votesystem
21、() st=NULL;count=0;hashlength=0; votesystem() delete st;count=0; void HashTable(int n);/初始化哈希表 int Hash(char *name);/哈希函数 void collision(int &s)s=s+;/开放定址线性探测法处理冲突 int hashfind(char *name,int&k);/查找 void inserthash(char*name);/插入 int vote(char*name);/投票 void display();/显示哈希表 void showvote(int k); /按
22、哈希表下标显示票数 void showrank();/显示排行榜;void votesystem:HashTable(int n)/【初始化哈希表】 hashlength=n; st=new studenthashlength; for(int i=0;ihashlength;i+) sti.name0=0;int votesystem:Hash(char *name)/【哈希函数】 char *p=name; int key=0; while(*p) key+=int(*p); p+; return key%hashlength;int votesystem:hashfind(char *n
23、ame,int&k)/【查找】 k=Hash(name);/哈希函数定位 while(stk.name0!=0&strcmp(stk.name,name) collision(k);/处理冲突 if(!strcmp(stk.name,name) return 1;/【找到】 else return 0;void votesystem:inserthash(char *name)/【插入】 int s;char a2; hashfind(name,s); cout提名学生信息格式如下:n t学号: 1113022053n t班级:2n t专业:计算机n t年级:二n t突出事迹:好好学习,天天向
24、上!n; strcpy(sts.name,name); coutsts.studentnum; coutsts.Class; cout专业:t;cin.getline(a,2);cin.getline(sts.major,30); cout年级:t;cin.getline(sts.grade,10); cout突出事迹:t;cin.getline(sts.achievement,200); sts.number=1;/提名即为投一票 count+;/当前人数加1int votesystem:vote(char*name)/记录已存在时调用hashfind函数 【投票】 int s; int f; f=hashfind(name,s);/定位 if(f) sts.number+;return 1;/投票成功 else return 0;/投票失败void votesystem:display()/【显示哈希表】 for(int i=0;ihashlength;i+) if(sti.name0!=0)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1