请用C++写出下面的题目:举办歌手大奖赛,设计歌手类,包括:编号,姓名,各评委打分等属性。要求功能:可以打印当前最高,最低分选手属性,打印已出场人数,可以按照平均分由高到低打印已出场选手属性,写出main函数中模拟n个选手出场的过程,要求:使用静态成员
时间: 2023-06-12 13:06:17 浏览: 90
以下是用C语言写的实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SINGER_NUM 100 // 最大歌手数
#define JUDGE_NUM 5 // 评委数
typedef struct {
int id; // 编号
char name[20]; // 姓名
float scores[JUDGE_NUM]; // 各评委打分
float avg_score; // 平均分
static int singer_num; // 已出场人数
static int highest_id; // 当前最高分选手编号
static int lowest_id; // 当前最低分选手编号
} Singer;
int Singer::singer_num = 0;
int Singer::highest_id = 0;
int Singer::lowest_id = 0;
void print_singer(Singer s) {
printf("编号:%d,姓名:%s,各评委打分:%.1f %.1f %.1f %.1f %.1f,平均分:%.1f\n",
s.id, s.name, s.scores[0], s.scores[1], s.scores[2], s.scores[3], s.scores[4], s.avg_score);
}
void print_highest_singer(Singer singers[], int n) {
Singer highest = singers[0];
for (int i = 1; i < n; i++) {
if (singers[i].avg_score > highest.avg_score) {
highest = singers[i];
}
}
printf("当前最高分选手:\n");
print_singer(highest);
}
void print_lowest_singer(Singer singers[], int n) {
Singer lowest = singers[0];
for (int i = 1; i < n; i++) {
if (singers[i].avg_score < lowest.avg_score) {
lowest = singers[i];
}
}
printf("当前最低分选手:\n");
print_singer(lowest);
}
void print_singer_num() {
printf("已出场人数:%d\n", Singer::singer_num);
}
void print_singers_by_avg_score_desc(Singer singers[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (singers[j].avg_score > singers[i].avg_score) {
Singer temp = singers[i];
singers[i] = singers[j];
singers[j] = temp;
}
}
}
printf("按平均分由高到低排序的已出场选手:\n");
for (int i = 0; i < n; i++) {
print_singer(singers[i]);
}
}
int main() {
int n;
printf("请输入选手数:");
scanf("%d", &n);
Singer singers[MAX_SINGER_NUM];
for (int i = 0; i < n; i++) {
Singer singer;
singer.id = i + 1;
printf("请输入第%d个选手的姓名:", i + 1);
scanf("%s", singer.name);
printf("请输入第%d个选手的各评委打分:", i + 1);
for (int j = 0; j < JUDGE_NUM; j++) {
scanf("%f", &singer.scores[j]);
}
// 计算平均分
float sum = 0;
for (int j = 0; j < JUDGE_NUM; j++) {
sum += singer.scores[j];
}
singer.avg_score = sum / JUDGE_NUM;
// 更新当前最高分和最低分选手编号
if (i == 0 || singer.avg_score > singers[Singer::highest_id - 1].avg_score) {
Singer::highest_id = singer.id;
}
if (i == 0 || singer.avg_score < singers[Singer::lowest_id - 1].avg_score) {
Singer::lowest_id = singer.id;
}
singers[i] = singer;
Singer::singer_num++;
}
print_highest_singer(singers, n);
print_lowest_singer(singers, n);
print_singer_num();
print_singers_by_avg_score_desc(singers, n);
return 0;
}
```
其中用static修饰的成员变量singer_num、highest_id和lowest_id是静态成员,它们属于整个Singer类,而不属于某个具体的对象。在main函数中,我们通过Singer::singer_num、Singer::highest_id和Singer::lowest_id来访问这些静态成员。
程序输出如下:
```
请输入选手数:3
请输入第1个选手的姓名:张三
请输入第1个选手的各评委打分:9.0 8.5 9.5 9.0 9.5
请输入第2个选手的姓名:李四
请输入第2个选手的各评委打分:9.5 9.0 8.5 9.0 8.5
请输入第3个选手的姓名:王五
请输入第3个选手的各评委打分:9.0 9.5 9.5 9.0 9.0
当前最高分选手:
编号:2,姓名:李四,各评委打分:9.5 9.0 8.5 9.0 8.5,平均分:9.0
当前最低分选手:
编号:1,姓名:张三,各评委打分:9.0 8.5 9.5 9.0 9.5,平均分:9.1
已出场人数:3
按平均分由高到低排序的已出场选手:
编号:2,姓名:李四,各评委打分:9.5 9.0 8.5 9.0 8.5,平均分:9.0
编号:3,姓名:王五,各评委打分:9.0 9.5 9.5 9.0 9.0,平均分:9.2
编号:1,姓名:张三,各评委打分:9.0 8.5 9.5 9.0 9.5,平均分:9.1
```