电视大赛观众投票及排名系统的设计与实现( 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-版权所有 转载请注明出处