南通大学计算机学院
《数据结构课程设计报告书》
题目:校园十大优秀青年评比
专业: 计算机科学与技术
班级:
姓名:
学号:
指导教师:
开始日期: 2013.1.14
完成日期: 2013.1.16
1
数据结构课程设计
1.问题的描述和分析
1.1 问题描述
新一届校园十大青年评比开始了!每一位在校学生可通过网上评比系统,为
自己认为优秀的学生提名与投票。请开发一个用于该需求的系统,满足下列
基本功能:
(1)提名优秀学生与投票。
(2)查看提名学生的基本信息。
(3)显示各提名学生的票数。
(4)显示排行榜。
一.基本要求:.
(1)采用散列存储,存放提名学生的相关信息。
(2)设计哈希函数和冲突解决方法。
(3)提名学生至少包括以下信息:姓名、票数、个人基本信息(如:班级、专
业、年级、突出事迹等)。
(4)设计输入提名学生信息的界面。
(5)完成基本功能。
(6)界面友好,操作简单。
(7)设计足够多的测试用例。
(8)查看指定学生的票数。
(9)按序显示各提名学生票数。
二.较高要求
(1)限制每人的投票次数。
(2)按软件要求,扩充其他功能。
(3)实现数据的后效验,即不接收非法数据。
1.2 问题分析
(1)用哈希表存储提名学生相关信息。
每位选手即学生的基本信息含有多个属性,为此可根据学生信息建立结构
体,如下:struct student{
char name[20];//姓名的拼音
int studentnum;//学号
int number;//票数
int Class;//班级
char major[30];//专业
char grade[10];//年级
char achievement[200];//突出事迹
};
2 / 22
数据结构课程设计
(2)设计哈希函数,并用开放定址线性探测法处理冲突。哈希函数根据姓名拼
音的 ascll 码来设计,hash(key)=key%hashlength,其中 k 为姓名所有拼音的 ascll
码值的累加和,hashlength 为表长。因此需储存学生姓名的拼音。
(3)设计一个投票系统类:votesystem
class votesystem{
private:
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);//插入
int vote(char*name);//投票
void display();//显示哈希表
void showvote(int k); //按哈希表下标显示票数
void showrank();//显示排行榜
};
(4)加入用户登录系统,所以同时构造用户 user 的结构体;
结构体中需要有用户姓名和用户权限次数的数据。
struct user{
char username[20];
int root;
user(){root=4;}
};
2.概要设计
2.1 系统模块划分
3 / 22
数据结构课程设计
评比系统
界面模块
用户登录
模块
选手信息
查询得票
投票模块
前十排行
退出系统
模块
模块
模块
模块
图 2-1 系统模块图
2.2 ADT(抽象数据类型)描述
1.
为了满足程序功能的设计,定义了两个结构体;
分别是学生选手 student 和登录用户 user;
2.
定义了投票系统类 class
votesystem;
3.详细设计
3.1 ADT 基本操作算法设计
3.1.1
struct student{
char name[20];//姓名的拼音
int studentnum;//学号
int number;//票数
int Class;//班级
char major[30];//专业
char grade[10];//年级
char achievement[200];//突出事迹
};
struct user{
char username[20];
int root;
4 / 22
数据结构课程设计
user(){root=4;}
};
user store[20];
3.1.2
class votesystem{
private:
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);//插入
int vote(char*name);//投票
void display();//显示哈希表
void showvote(int k); //按哈希表下标显示票数
void showrank();//显示排行榜
};
3.2 功能模块设计
3.2.1 评比界面模块
(1)界面设计
(2)处理流程设计
评比系统选择界面:由于选择结构比较单一,故在选择时没有选择使用 switch
语句,使用简单的 if 语句;
while(choice!=2)
{
system("cls");
5 / 22
数据结构课程设计
cout<<"***欢迎来到校园十大优秀青年评比系统***"<
<=============="<
<=============="<>choice;
if(choice==1)
{……
}
else cout<<"退出成功!";
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"<>choose;
if(choose==3)//每次投票后限制次数减一
6 / 22
数据结构课程设计
store[i].root--;
switch(choose)
{
char a[2];
case 1:
case 2:
L.display();break;
cout<<"请输入选手姓名的拼音(如:zhangjing ):"<
>t;
if(t==1)
{
7 / 22
case 3:
操作
"<数据结构课程设计
L.inserthash(name);
cout<<"选手提名成功\n";
cout<<"剩余投票次数为:"<<(store[i].root-1)<