各位大师,劳烦您帮我分析一下这个题,真心没有头绪啊!
各位大师,劳烦您帮我分析一下这个题,真心没有头绪啊!青年歌手参加歌曲大奖赛计分系统(N个选手,M个评委)
分别用子函数实现输入、计算平均分(去掉一个最高分和一个最低分),排序(成绩由高到低),输出(前三名)
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define N 9
#define M 7
double grade[M] = {0};
struct singer {
int sn;
double ave;
};
typedef struct singer SG, *PSG;
SG sg[N];
PSG psg = sg;
/*初始化结构体数组*/
void init(void){
int i;
for(i = 0; i < N; i++) {
sg[i].sn = i + 1;
sg[i].ave = 0.0;
}
}
/*随机打分*/
void rate(void){
int i = 0;
srand((unsigned int)time(NULL));
for(; i < M; i++){
grade[i] = 1 + (10.0 * rand() / (RAND_MAX + 1.0));
Sleep(100+i);
}
}
/*去除最高分最低分*/
void cut(void){
double max = 0, min;
int i = 0;
for(; i < M; i++){
if(grade[i] > max) {
max = grade[i];
}
}
for(min = max, i = 0; i < M; i++) {
if(grade[i] < min) {
min = grade[i];
}
}
for(i = 0; i < M; i++){
if(grade[i] == max) {
grade[i] = 0;
break;
}
}
for(i = 0; i < M; i++){
if(grade[i] == min) {
grade[i] = 0;
break;
}
}
}
/*求平均分*/
double calcAve(void){
int i;
double sum = 0;
for(i = 0; i < M; i++) {
sum += grade[i];
}
return (sum / M);
}
/*交换结构体数组元素值*/
void swap(PSG p, PSG q){
int tsn;
double tave;
tsn = p->sn;
p->sn = q->sn;
q->sn = tsn;
tave = p->ave;
p->ave = q->ave;
q->ave = tave;
}
/*对平均分排序并交换位置*/
void sort(void){
int i, j;
for(i = 0; i < N -1; i++) {
for(j = i; j < N; j++) {
if(sg[i].ave < sg[j].ave) {
swap(sg + i, sg + j);
}
}
}
}
/*打印输出排序好的选手序号与成绩*/
void display(void){
int i;
for(i = 0; i < N; i++) {
printf("名次: %d\t选手序号: %d\t平均得分: %.2f\n",
i + 1, sg[i].sn, sg[i].ave);
}
}
int main(void){
int i;
init();
for(i = 0; i < N; i++) {
rate();
cut();
sg[i].ave = calcAve();
}
sort();
display();
return 0;
}
