#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
struct student{
char name[20];
int num; //学号
int number; //票数
int Class;
char major[30];
char grade[10];
char achievement[200];
};
class votesystem{
private:
student*st;
int count; //当前元素个数
int size; //哈希表长
public:
void InitHashTable(int n); //初始化哈希表
int Hash(char*name); //计算哈希地址
void collision(int &s); //冲突,计算下一个地址
int search(char *name,int &s); //查找
void insert(char*name); //插入
int vote(char*name); //投票
void display(); //显示哈希表
void showvote(int k); //按哈希表下标显示票数
void showrank(); //显示排行榜
};
void votesystem::InitHashTable(int n) //初始化哈希表
{
size=n;
st=new student[size];
for(int i=0;i<size;i++)
st[i].name[0]='\0';
}
int votesystem::Hash(char *name) //求哈希地址,size为表长
{
char *p=name;
int key=0;
while(*p)
{
key += int(*p); key为所有名字(fyx)的累计值
p++;
}
return key%size; //size哈希表长,返回下标
}
void votesystem::collision(int &s) //开放地址法解决冲突
{
s=s+1;
}
int votesystem::search(char *name,int &s) //查找
{
s=Hash(name); //哈希表定位
while(st[s].name[0] != '\0' && strcmp(st[s].name,name))
collision(s); //开放地址处理冲突
if(!strcmp(st[s].name,name)) //strcmp(str1,str2) ==返回0,>返回1,<返回-1
return 1; //找到
else return 0; //未找到
}
void votesystem::insert(char *name)//插入
{
int s;
char a[2];
search(name,s);
cout<<"提名学生信息格式如下:"<<endl;
cout<<"\t学号:19101010"<<endl;
cout<<"\t班级:1"<<endl;
cout<<"\t专业:数学师范"<<endl;
cout<<"\t年级:二"<<endl;
cout<<"\t突出事迹:国家二等奖学金"<<endl;
strcpy(st[s].name,name);
cout<<"学号:\t";
cin>>st[s].num;
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++;
}
int votesystem::vote(char*name) //投票,纪录已存在时调用search函数
{
int s;
int f;
//定位
f=search(name,s); //search返回1 0
if(f) {
st[s].number++; return 1;} //投票成功
else return 0; //投票失败
}
void votesystem::display() //显示排名
{
for(int i=0;i<size;i++)
if(st[i].name[0]!='\0')
cout<<st[i].num<<' '
<<st[i].name<<' '<<st[i].grade<<"年级"<<' '
<<st[i].major<<' '
<<st[i].Class<<"班"<<' '
<<st[i].number<<"票"<<' '
<<st[i].achievement<<endl;
}
void votesystem::showvote(int k) //按排名表下标显示票数
{
cout<<"现得票数:"<<st[k].number;
}
void votesystem::showrank() //显示排行榜
{
int k;
int a[11]; //定义一个数组存放前十名在哈希表中的下标
for(int i=0; i<10; i++) a[i]=-1;
for(int i=0; i<size; i++) //遍历哈希表
{
if(st[i].name[0] != '\0')
{
//插入法排序
for( k=9; k >= 0; k--)//遍历a[]
{
if(a[k] > -1)
{
if(st[a[k]].number<st[i].number)
a[k+1]=a[k]; //这里的k+1是指当前定位
else break;
}
}
a[k+1]=i; //这里的k=0--, a[0] = i
}//if
}//for
cout<<" 学号 姓名 得票数"<<endl;
for(int i=0; i<10 && a[i]>-1; i++){
cout<<left<<setw(15)<<st[a[i]].num<<setw(15)<<st[a[i]].name<<setw(15)<<st[a[i]].number<<endl;
}//left左对齐,在右侧加空格 setw()设置空格 #include<iomanip>
}
int main()
{
int choose=-1,k=-1; //choose赋初值-1
char name[40];
votesystem L;
L.InitHashTable(50); //初值学生50
while(choose!=6) //6--退出投票系统
{
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 校园十大优秀青年评比系统"<<endl;
cout<<"1--提名新学生"<<endl;
cout<<"2--查看选手信息"<<endl;
cout<<"3--选手得票"<<endl;
cout<<"4--给选手投票"<<endl;
cout<<"5--前十排行榜单"<<endl;
cout<<"6--退出投票系统"<<endl;
cout<<endl<<endl<<endl<<endl;
cout<<"请您的选择操作:";
cin>>choose;
switch(choose)
{
char a[2];
case 1:
cout<<"输入姓名(例如:fyx)"<<endl;
cin>>name;
L.insert(name);
cout<<"选手提名成功\n";
break;
case 2:
L.display();
cout<<endl<<endl<<endl;
cout<<"信息如上"<<endl<<"END"<<endl;
break;
case 3:
cout<<"请输入选手姓名的拼音(如:fyx):"<<endl;
cin.getline(a,2);
cin.getline(name,40);
int f;
f=L.search(name,k);
if(f)
{
L.showvote(k);
cout<<endl;
break;
}
else
cout<<"提名名单中无此记录";
cout<<endl;
cout<<"1--提名该学生\n"
<<"2--返回系统界面\n"
<<"请选择操作:";
int t;
cin>>t;
if(t==1)
{
L.insert(name);
cout<<"选手提名成功\n";
}break;
case 4:
cout<<"请输入选手姓名拼音(如:fyx)"<<endl;
cin.getline(a,2);
cin.getline(name,40);
f=L.search(name,k);
if(f) {
L.vote(name);cout<<"投票成功\n";}
else
{
cout<<"无纪录!\n";
cout<<"1--提名该学生\n"
<<"2--返回系统界面\n"
<<"请选择操作:";
int t;
cin>>t;
if(t==1)
{
L.insert(name);
cout<<"选手提名成功\n";
}
}break;
case 5:L.showrank();break;
case 6:cout<<"投票系统已关闭!\n";
cout<<"感谢使用本系统!\n";
break;
default:
cout<<"操作无效,请重新选择!\n";
choose = -1;
break;
}
}
return 0;
}
数据结构课程设计——十佳优秀青年
猜你喜欢
转载自blog.csdn.net/fly_ship/article/details/110388063
今日推荐
周排行