请设计一个比赛奖励系统,某小学庆祝六一儿童节举办歌咏比赛,参赛小选手可以通过排名查看自己的名次和成绩。该比赛奖项设置如下:一等奖二等奖三等奖优秀奖个数分别为参赛人数的10% 20% 30% 40%,例如参赛人数为50,则一等奖二等奖三等奖优秀奖获奖人数分别为50 15 20比赛结束后,参赛小选手想及时查看自己获得的奖项。请你通过编程重新显示,排行榜不但能够看到所有参赛选手名次准考证号和成绩还可以看到所获奖的信息
可以先定义一个结构用于存储选手的信息,然后在一个循环中用产生奖项和成绩随机数来模拟比赛过程,再用一个双层for循环来排序结构数组产生排行榜信息,最后用一个循环来显示查询排行榜和单个选手的比赛结果,代码如下:
参考链接:
C程序生成一定范围内的随机数_cumtb2002的博客-CSDN博客
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FirstPrizeNum 5
#define SecondPrizeNum 10
#define ThirdPrizeNum 15
#define GoodPrizeNum 20
struct player{
int pid; // 准考证号
int score; //成绩
int prize; //奖项等级
};
int main(void){
int all=50;
struct player ps [50];
int firstNum=0,secondNum=0,thirdNum=0,goodNum=0;
char priceNames[4][10]={"一等奖","二等奖","三等奖","优秀奖"};
// https://blog.csdn.net/cumtb2002/article/details/107798906
// 用随机数产生对应的奖项和分数,模拟比赛过程
srand((unsigned )time(NULL));
int i,j,num=0,tprice,score;
int getPrice=0;
// FILE *fp =fopen("oriresult.txt","w");
for(i=0;i<all;){
tprice=rand()%4; // [0,3] 产生一个奖的等级
getPrice=0;
if(tprice==0&&firstNum<FirstPrizeNum) { //90-100为一等奖
getPrice=1;
score=rand()%11+90;
ps[i].prize=0;
firstNum++;
}else if(tprice==1&&secondNum<SecondPrizeNum){//80-89为二等奖
getPrice=1;
score=rand()%10+80;
ps[i].prize=1;
secondNum++;
}else if(tprice==2&&thirdNum<ThirdPrizeNum){//70-79为三等奖
getPrice=1;
score=rand()%10+70;
ps[i].prize=2;
thirdNum++;
}else if(tprice==3&&goodNum<GoodPrizeNum){//60-69为优秀奖
getPrice=1;
score=rand()%10+60;
ps[i].prize=3;
goodNum++;
}
ps[i].pid=i+1;
ps[i].score=score;
if(getPrice==1){ // 如果成功产生了一个成绩,则开始计数产生下一个成绩
// fprintf(fp,"准考证号:%d,成绩:%d,奖项:%s\n\n",ps[i].pid,ps[i].score,priceNames[ps[i].prize]);
i++;
}
}
// fclose(fp);
// 排序结构数组,产生排行榜信息
int ts,tpr,tpi;
for(i=0;i<all-1;i++){
for(j=i+1;j<all;j++){
if(ps[i].score<ps[j].score){
tpi=ps[i].pid;
ps[i].pid=ps[j].pid;
ps[j].pid = tpi;
ts=ps[i].score;
ps[i].score=ps[j].score;
ps[j].score = ts;
tpr=ps[i].prize;
ps[i].prize=ps[j].prize;
ps[j].prize = tpr;
}
}
}
// 查询和显示比赛信息
int choice ;
printf("请输入选项(1、显示排行榜;2、查询个人信息;3、退出):");
scanf("%d",&choice);
while(choice!=3){
if(choice==1) { // 显示排行榜
// FILE *fp =fopen("result.txt","w");
for(i=0;i<all;i++){
printf("准考证号:%d,成绩:%d,奖项:%s\n",ps[i].pid,ps[i].score,priceNames[ps[i].prize]);
// fprintf(fp,"准考证号:%d,成绩:%d,奖项:%s\n\n",ps[i].pid,ps[i].score,priceNames[ps[i].prize]);
}
// fclose(fp);
}else if(choice==2){ //查询单个选手的成绩
int id;
printf("请输入准考证号:");
scanf("%d",&id);
for(i=0;i<all;i++){
if(ps[i].pid==id){
printf("准考证号:%d,成绩:%d,奖项:%s\n",ps[i].pid,ps[i].score,priceNames[ps[i].prize]);
break;
}
}
}
printf("请输入选项(1、显示排行榜;2、查询个人信息;3、退出):");
scanf("%d",&choice);
}
return 0;
}