数据结构电视大赛投票系统

电视大赛观众投票及排名系统的设计与实现( 8学时)
问题描述:在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。要求编写算法模拟实现上述系统的功能。
1.基本要求
(1)首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来分配存放选手信息的顺序表;
(2)将选手的编号和姓名依此存入顺序表中;
(3)观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志;
(4)投票结束后进行排序,在此采用各种排序算法,然后为每个选手计算名次,得票相同的名次也相同;
2.重点、难点
重点:
(1)参赛选手数据结构的设计;
(2)排序算法的设计;
难点:各种排序算法的性能分析与比较
3.作业及课外学习要求:
按照题意要求独立进行设计,设计结束后要按要求写出课程设计报告。
本知识点的讲授和学习,可以支撑“毕业要求4研究”中的“指标点4.1能够运用科学的研究方法对复杂软件工程问题进行需求分析研究;指标点4.2熟悉复杂软件系统的开发和应用环境,研究制定合理的软件设计与开发方案。指标点4.3能够对原型验证方法进行研究与分析,合理验证软件系统”的指标达成度进行评估。使学生在解决具体问题的过程中,能够灵活熟练地选择合适的数据结构及设计有效的算法,从而加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
代码:

#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include"xy_setting.h"

using namespace std;

int number=0,n=0,flag=0;
void msgbox()
{
    printf("===============================\n");
    printf("= 参赛人数:%d                 =\n",number);
    printf("= 有效投票数:%d               =\n",n);
    printf("= 基本操作:                  =\n");
    if(flag==0)
        printf("= 开始投票:----S             =\n");
    else
        printf("= 已投票,是否补投----Y       =\n");
    printf("= 投票情况(编号排序)----A    =\n");
    printf("= Ranking ----R               =\n");
    printf("= 退出系统 ----E              =\n");
    printf("===============================\n");
}
class player
{
public:
    int num;
    char name[30];
    int score;
    int ranking;
};

class ope
{
public:
    void init(player *a,int number);
    void output_info(player *a,int number);
    void outcome(player *a,int number);
    void voting(player *a,int number);
    void shell_insert(player *a,int n,int dk);
    void shell_sort(player *a,int n,int t);
    void sort_outcome(player *a,int number);
};

void ope::shell_insert(player *a,int n,int dk)
{
    for(int i=dk+1;i<=n;i++)
    {
        int j;
        if(a[i].score>a[i-dk].score)
        {
            strcpy(a[0].name,a[i].name);
            a[0].score=a[i].score;
            a[0].num=a[i].num;
            for(j=i-dk;j&&a[j].score<a[0].score;j-=dk)
            {
                strcpy(a[j+dk].name,a[j].name);
                a[j+dk].score=a[j].score;
                a[j+dk].num=a[j].num;
            }
            strcpy(a[j+dk].name,a[0].name);
            a[j+dk].score=a[0].score;
            a[j+dk].num=a[0].num;
        }
    }
}
void ope::shell_sort(player *a,int n,int t)
{
    int i;
    for(;t>=1;t/=2)
    {
        ope::shell_insert(a,n,t);
        for(i=1;i<=n;i++)
            a[i].ranking=i;
        for(i=1;i<n;i++)
            if(a[i+1].score==a[i].score)
                a[i+1].ranking=a[i].ranking;
    }
}
void ope::output_info(player *a,int number)
{
    cout<<"\n输出选手信息:\n编号  姓名\n";
    for(int i=1;i<=number;i++)
    {
        printf(" %d    %s\n",a[i].num,a[i].name);
    }
}
void ope::init(player *a,int number)
{
    int i=1;
    cur_sys();
    cout<<endl<<"输入选手姓名:"<<endl;
    while(i<=number)
    {
        cin>>a[i].name;
        a[i].num=i;
        a[i].score=a[i].ranking=0;
        i++;
    }
    ope::output_info(a,number);
    cout<<endl<<"初始化成功!!!"<<endl;
}

void ope::outcome(player *a,int number)
{
    cout<<"输出选手得票情况(未排序):\n";
    for(int i=1;i<=number;i++)
    {
        printf("选手00%d得票数为%d;\n",a[i].num,a[i].score);
    }
}

void ope::sort_outcome(player *a,int number)
{
    cout<<"\n排名:已排序"<<endl;
    ope::shell_sort(a,number,number);
    for(int i=1;i<=number;i++)
    {
        {
        printf("第%d名为00%d号选手%s,得票数为%d;\n",
               a[i].ranking,a[i].num,a[i].name,a[i].score);
        }
    }
}
void ope::voting(player *a,int number)
{
    if(flag==0)
        cout<<"\n输入选手编号进行投票,按0结束。\n";
    else
        cout<<"\n补投开始:输入选手编号,按0结束。\n";
    flag=1;
    int vote;
    while(scanf("%d",&vote)&&vote)
    {
        if(vote>0&&vote<=number)
        {
            a[vote].score++;
            n++;
            cur_sys();
            cout<<"请继续,按0结束"<<endl;
        }
        else if(vote==0)break;
        else
        {
            cur_sys();
            cout<<"请继续,按0结束"<<endl;
            continue;
        }
    }
    cout<<"投票成功!"<<endl;
}

int main()
{
    char a;
    player *p=NULL;
    ope dol;
    msgbox();
    cout<<"未初始化无法操作\n请输入总人数:";
    while(cin>>number)
    {
        if(number>0)
            break;
        else cout<<"输入错误,重新输入"<<endl;
    }
    p=(player *)malloc(sizeof(player)*number);
    dol.init(p,number);
    system("pause");
    cur_sys();
    cout<<"输入操作\n-";
    while(cin>>a)
    {
        switch(a)
        {
            case 'A':dol.outcome(p,number);cur_sys2();cout<<"输入操作\n-";break;
            case 'S':dol.voting(p,number);cur_sys2();cout<<"输入操作\n-";break;
            case 'Y':dol.voting(p,number);cur_sys2();cout<<"输入操作\n-";break;
            case 'R':dol.sort_outcome(p,number);cur_sys2();cout<<"输入操作\n:";break;
            case 'E':exit(0);break;
            default: continue;
        }
    }
    cout<<"谢谢使用!!!";
}

这里写图片描述
更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

  • 8
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值