各位大师,劳烦您帮我分析一下这个题,真心没有头绪啊!
各位大师,劳烦您帮我分析一下这个题,真心没有头绪啊!青年歌手参加歌曲大奖赛计分系统(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; }