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

#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;
}
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目采自 《数据结构题集》(c语言版)(严蔚敏`吴伟民)6.3 图书管理,最大的难度在于要求用B树对书号进行索引。 设计语言:C语言 编译环境: VC++6.0 里面包含完整的源程序和报告文档,程序为dos界面,有彩色菜单,对数据显示实现表格化……本课程设计成绩为优秀。 源程序有注释,报告文档完全按要求,包括所用数据结构的描述与实现、算法的时空分析等都包括在内。 程序所能达到的功能 1图书采编入库(用B树对书号建立索引) 2清除库存 3图书借阅 4图书归还 5图书预约 6列出某著者全部著作名 7列出某种书的状态(包括图书基本信息和该书借者名单、 预约者名单) 8每次插入或删除一个关键字后以凹入表显示B树的状态 9把一次会话过程中的全部人机对话记录入一个日志文件中 10在程序主界面显示当前系统时间 一、 需求分析 1. 书号和借阅证号、库存量、出版年份用整型表示;书名用20位字符型数组,著者和借阅者姓名用30位字符型数组表示;图书价格用浮点型表示。图书入库时输入图书的书号、书名、著者、总量等完整信息,清除库存时输入图书书号,借阅和归还时输入书号和借阅者证号,姓名等信息,并记录系统时间为借书日期。 2. 借书和归还时显示图书的信息。插入、删除后用凹入表显示以书号建立的B树状态。查看图书状态,以表格显示图书的基本信息,借阅者名单和预约者名单。 ……………… 课程设计清单: base.h //全程常量、全局变量和公共函数等 btree.h //B树类型单元 library.h //书库类型单元 main.cpp //主程序 bookiofo.dat //图书信息文件 borrower.dat //借书者姓名文件 bespeaker.dat //预约者姓名文件 main.exe //编译得到的可执行文件 数据结构课程设计实验报告-图书管理.doc
好的,设计一个十佳歌手投票网站,需要考虑以下几个方面: 1. 用户管理:需要实现用户注册和登录功能,可以使用 ASP.NET Identity 进行身份验证和授权。 2. 数据库设计:需要设计数据库来存储用户信息、投票信息、歌手信息等,可以使用 SQL Server 或者 MySQL。 3. 界面设计:需要设计用户界面,包括主页、投票页面、歌手详情页面等。 4. 投票逻辑:需要实现投票逻辑,包括投票限制、投票统计、防止作弊等。 5. 安全性:需要考虑安全性问题,比如防止 SQL 注入、XSS 攻击等。 以下是一些实现思路: 1. 用户管理:使用 ASP.NET Identity 进行身份验证和授权。用户可以注册账号并登录,登录后可以投票、查看投票结果等。 2. 数据库设计:可以设计 3 个表,分别是 Users、Singers 和 Votes。Users 表存储用户信息,包括用户名、密码、邮箱等;Singers 表存储歌手信息,包括歌手姓名、照片等;Votes 表存储投票信息,包括用户 ID、歌手 ID、投票时间等。 3. 界面设计:可以设计一个主页,展示所有参选歌手的照片和姓名,点击进入歌手详情页面,展示歌手的详细信息和投票按钮。投票页面展示所有参选歌手的照片和姓名,用户可以选择投票或取消投票;投票成功后显示投票结果。可以使用 Bootstrap 或者其他 CSS 框架美化界面。 4. 投票逻辑:每个用户每天只能投一次票,可以通过在 Votes 表中增加一个日期字段来实现。为了防止作弊,可以在服务器端增加判断逻辑,比如限制同一 IP 地址只能投一次票。 5. 安全性:可以使用参数化查询来防止 SQL 注入,使用 AntiXSS 库来防止 XSS 攻击。在服务器端增加判断逻辑来防止作弊。 以上是设计十佳歌手投票网站的一些思路和实现方法,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值