数据结构课程设计——十佳优秀青年

#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