【问题详述】
某地举办“我喜爱的歌手”现场比赛,比赛评选程序为该赛事提供名次统计和查询。比赛共有N(N=30)位参赛者,按照演出顺序依次编号为整数1~N。评委共有C(C=10)人,每位评委按照100分制给参赛选手打分;比赛现场有座位S(S=500)个,每个座位配有一个投票器,选手演出时,观众喜欢这位歌手可以按下投票器投票,若不喜欢就不投票。在每位选手演出过程的有效投票时间内,每个投票器最多只记录一次投票。
全部评委给参赛选手的评分,按歌手的出场顺序,存储在文件F1.txt中,该文件对应于每一位选手有10个分数;现场观众投票数按歌手的出场顺序,依次存储在文件F2.txt中,该文件对应于每一位选手只有该选手的得票数。
参赛者的比赛成绩=评委给分×0.4+观众评分×0.6
其中,评委给分=(去掉一个最高分,去掉一个最低分,其余分数的平均值),观众评分=(现场观众投票数÷观众总数)×100。
【程序要求】
(1)根据评委评分和观众投票数,完成 对选手得分的计算和排名,生成一个排名后的选手文件Singer..txt。
(2)提供一个菜单,为用户提供以下功能选项:
①查询歌手(以编号或者姓名表示)的排名;
②查询前十名选手的编号、姓名和得分;
③输入编号或者姓名,查询最终的得分、评委给分和现场观众投票数。
望采纳!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
//关闭文件
fclose(fp);
}
//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}
//关闭文件
fclose(fp);
}
//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}
//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
好像有点复杂,坐等大神来解答!!!!
#include<stdio.h>
#include<stdlib.h>
struct singer/*定义结构体*/
{
int num;
char name[10];
float score[20];
float aver;
float sum;
int ord;
}singer[100];
void singer_information(int b)
/*输入选手信息*/
{
int i;
for(i=1;i<=b;i++)
{
printf("请输入选手编号:");
scanf("%d",&singer[i].num);
printf("请输入选手姓名:");
scanf("%s",&singer[i].name);
}
}
int singer_score(int b)
{
int j,c;
float a[50];
for(j=1;j<=b;j++)
{
printf("\n请输入评委1对歌手%d的打分",j);
scanf("%f",&singer[j].score[1]);
printf("请输入评委2对歌手%d的打分",j);
scanf("%f",&singer[j].score[2]);
printf("请输入评委3对歌手%d的打分",j);
scanf("%f",&singer[j].score[3]);
printf("请输入评委4对歌手%d的打分",j);
scanf("%f",&singer[j].score[4]);
printf("请输入评委5对歌手%d的打分",j);
scanf("%f",&singer[j].score[5]);
printf("请输入评委6对歌手%d的打分",j);
scanf("%f",&singer[j].score[6]);
printf("请输入评委7对歌手%d的打分",j);
scanf("%f",&singer[j].score[7]);
printf("请输入评委8对歌手%d的打分",j);
scanf("%f",&singer[j].score[8]);
printf("请输入评委9对歌手%d的打分",j);
scanf("%f",&singer[j].score[9]);
printf("请输入评委10对歌手%d的打分",j);
scanf("%f",&singer[j].score[10]);
a[j]=singer[j].score[1]+singer[j].score[2]+singer[j].score[3]+singer[j].score[4]+singer[j].score[5]+singer[j].score[6]+singer[j].score[7]+singer[j].score[8]+singer[j].score[9]+singer[j].score[10];
singer[j].sum=a[j];
}
}
int singer_grade(int b)/* 歌手总成绩 */
{
int a,c;
float n[50],max,min;
for(a=1;a<=b;a++)
{
max=singer[a].score[1];
min=singer[a].score[1];
for(c=1;c<=10;c++)
{
if(max<singer[a].score[c]) max=singer[a].score[c];
if(min>singer[a].score[c]) min=singer[a].score[c];
}
n[a]=(singer[a].sum-max-min)/8.0;
singer[a].aver=n[a];
}
}
int order(int b)/*成绩排序*/
{
int j,t,i;
for(i=1;i<=b;i++)
{
for(j=1,t=1;j<=b;j++)
{
if(singer[i].aver<singer[j].aver)
{
t=t+1;
}
}
singer[i].ord=t;
}
for(i=1;i<=b;i++)
{
for(j=1;j<=b;j++)
{
if(i==singer[j].ord)
printf("%s是第%d 得分为%15.2f\n",singer[j].name,i,singer[j].aver);
}
printf("\n\n\n");
}
}
int search(int c)/*数据查询*/
{
printf("所查选手的数据:编号%d 姓名%s 平均成绩%f 总成绩%f\n",singer[c].num,singer[c].name,singer[c].aver,singer[c].score[c]);
}
int addition(int i)/*数据追加*/
{
printf("请输入选手编号及姓名:");
scanf("%d,%s/n",&singer[i+1].num,&singer[i+1].name);
printf("请输入评委1对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[1]);
printf("请输入评委2对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[2]);
printf("请输入评委3对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[3]);
printf("请输入评委4对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[4]);
printf("请输入评委5对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[5]);
printf("请输入评委6对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[6]);
printf("请输入评委7对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[7]);
printf("请输入评委8对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[8]);
printf("请输入评委9对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[9]);
printf("请输入评委10对歌手%d的打分",i+1);
scanf("%d",&singer[i+1].score[10]);
}
main()
{
int a,b,c,i,n=1;
FILE *fp;
fp = fopen("歌手.txt","wt+");
printf(" 歌手比赛系统 \n");
printf("*********************\n");
printf("* 1)输入选手数据 *\n");
printf("* 2)评委打分 *\n");
printf("* 3)成绩排序 *\n");
printf("* 4)数据查询 *\n");
printf("* 5)追加学生数据 *\n");
printf("* 6)写入数据文件 *\n");
printf("* 7)退出系统 *\n");
printf("*********************\n");
while(n)
{
printf("你想进行的操作: ");
scanf("%d",&a);
printf("\n\n");
switch(a)
{
case 1:
printf("你想进行的操作:输入选手数据\n ");
printf("请输入选手个数");
scanf("%d",&b);
singer_information(b);
printf("----------------------\n");
break;
case 2:
printf("你想进行的操作:评委打分\n ");
singer_score(b);
printf("-----------------------\n");
break;
case 3:
printf("你想进行的操作:成绩排序(按平均分)\n ");
singer_grade(b);
order(b);
printf("-------------------------\n");
break;
case 4:
printf("你想进行的操作:数据查询\n ");
printf("请输入要查询选手编号:");
scanf("%d",&c);
printf("所查选手的数据:编号%d 姓名%s 平均成绩%f 总成绩%f\n",singer[c].num,singer[c].name,singer[c].aver,singer[c].sum);
printf("--------------------------\n");
break;
case 5:
printf("你想进行的操作:追加学生数据\n ");
addition(b);
printf("---------------------------\n");
break;
case 6:
printf("你想进行的操作:写入数据文件\n ");
printf("将数据写入文件中:\n");
for (i = 0 ; i <=b ; i++)
{
fprintf(fp,"%d ",singer[i].num);
fprintf(fp,"%s ",singer[i].name);
fprintf(fp,"%d\n",singer[i].aver);
}
break;
case 7: exit(0);
default :printf("输入错误请重新输入!\n");
}
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
//歌手信息结构体
typedef struct Singer {
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
} Singer;
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
int main() {
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
//菜单循环
while(1) {
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice) {
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
//菜单功能选项
void menu() {
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
//读取评委评分
void read_scores(Singer *singers) {
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL) {
printf("打开文件失败\n");
exit(1);
}
//读取评委评分
for(int i = 0; i < N; i++) {
for(int j = 0; j < C; j++) {
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
//关闭文件
fclose(fp);
}
//读取观众投票数
void read_votes(Singer *singers) {
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL) {
printf("打开文件失败\n");
exit(1);
}
//读取观众投票数
for(int i = 0; i < N; i++) {
fscanf(fp, "%d", &singers[i].votes);
}
//关闭文件
fclose(fp);
}
//计算总分
void calculate_total_score(Singer *singers) {
for(int i = 0; i < N; i++) {
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++) {
sum += singers[i].scores[j];
if(singers[i].scores[j] > max) {
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min) {
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
//排序
void sort(Singer *singers) {
//冒泡排序
for(int i = 0; i < N - 1; i++) {
for(int j = 0; j < N - 1 - i; j++) {
if(singers[j].total_score < singers[j+1].total_score) {
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
//更新排名
for(int i = 0; i < N; i++) {
singers[i].num = i + 1;
}
}
//查询歌手排名
void search_rank(Singer *singers) {
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++) {
if(singers[i].num == num) {
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
//查询歌手信息
void search_info(Singer *singers) {
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++) {
if(singers[i].num == num) {
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++) {
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
//输出前十名歌手信息
void print_top3(Singer *singers) {
printf("前十名歌手信息:\n");
for(int i = 0; i < 10; i++) {
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++) {
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
//输出所有歌手信息
void print_all(Singer *singers) {
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++) {
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++) {
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
评分系统和投票系统采用函数随机方式进行(因为手动逐个输入太麻烦了),可适当修改。
仅供参考,希望对你有帮助
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define C 10
#define N 30
#define S 500
void selSort(int *arr, int n);
typedef struct singer
{
int num /*选手编号*/;
char name[30] /*姓名*/;
int judges_score[C] /*评委打分*/;
int audience_score[500] /*观众投票计1不投票计0*/;
float score /*选手得分*/;
int total /*得票数*/;
} sing;
FILE *out1 = NULL;
FILE *out2 = NULL;
//手动输入太麻烦,自定义随机投票函数
//观众投票函数 随机返回 0或1
int myrand1(void)
{
static int i = 0;
srand(time(NULL) + i++);
return rand() % 2 == 0 ? 0 : 1;
}
//裁判评分函数,随机评分
int myrand2(void)
{
static int i = 0;
srand(time(NULL) + i++);
return rand() % 51 + 50;
}
//开始投票,评分
#if 1
void init(sing *p, int i, FILE *out1, FILE *out2)
{
//出场顺序等于编号
p->num = i + 1;
//初始化投票数
p->total = 0;
//用"?号选手"作为选手的姓名
sprintf(p->name, "%d号选手", i + 1);
//评委打分
for (int j = 0; j < C; j++)
{
p->judges_score[j] = myrand2();
}
//评委原始打分输出到文件F1.txt
for (int i = 0; i < C; i++)
{
if (i == C - 1)
fprintf(out1, "%d", p->judges_score[i]);
else
fprintf(out1, "%d ", p->judges_score[i]);
}
fputs("\n", out1);
//观众投票
for (int k = 0; k < S; k++)
{
p->audience_score[k] = myrand1();
if (p->audience_score[k])
p->total += 1 /*观众投票数类加*/;
}
//选手总票数输出到文件F2.txt
fprintf(out2, "%d", p->total);
fputs("\n", out2);
//评委打分排序
selSort(&(p->judges_score[0]), C);
//求评委打分的平均分
float sum = 0.0, avg = 0.0;
for (int k = 1; k < C - 1; k++)
{
sum += p->judges_score[k];
}
avg = 1.0 * sum / (C - 2);
//求得选手得分
p->score = avg * 0.4 + (p->total / S) * 100 * 0.6;
}
#endif
//排序
void selSort(int *arr, int n)
{
int i, j, small, tmp;
for (i = 0; i < n - 1; i++)
{
small = i;
for (j = i + 1; j < n; j++)
{
if (arr[j] < arr[small])
small = j;
}
if (small != i)
{
tmp = arr[i];
arr[i] = arr[small];
arr[small] = tmp;
}
}
}
//结构体排序
void selSort2(sing *arr, int n)
{
int i, j, small;
sing tmp;
for (i = 0; i < n - 1; i++)
{
small = i;
for (j = i + 1; j < n; j++)
{
if (arr[j].score < arr[small].score)
small = j;
}
if (small != i)
{
tmp = arr[i];
arr[i] = arr[small];
arr[small] = tmp;
}
}
}
//查询歌手排名,下标+1即是名次
void fun1(sing *p)
{
int n;
puts("输入歌手编号:");
scanf("%d", &n);
for (int i = 0; i < N; i++)
{
if (p[i].num == n)
{
printf("%d号歌手排名:%d\n", n, 30 - i);
return;
}
}
printf("未找到%d号歌手!\n", n);
}
//查询前十名歌手 编号 姓名 总分
void fun2(sing *p)
{
printf("%02d%15s%8.1f\n", p->num, p->name, p->score);
return;
}
//查询某选手得分情况
int fun3(sing *p)
{
return p->num;
}
void menu()
{
printf("+++++++++++++++++++++++++++++++++++\n");
printf(" 1->查选手排名\n");
printf(" 2->查前十名选手信息\n");
printf(" 3->查某个选手得分情况\n");
printf(" 0->退出系统\n");
printf("\n 请选择对应的功能序号\n");
printf("+++++++++++++++++++++++++++++++++++\n");
}
int main(int argc, char *argv[])
{
int n, tmp;
sing singer[N];
out1 = fopen("F1.txt", "w");
out2 = fopen("F2.txt", "w");
//开始模拟投票评分
for (int i = 0; i < N; i++)
init(&singer[i], i, out1, out2);
fclose(out1);
fclose(out2);
//结构体数组排序
selSort2(singer, N);
//输出文件Singer.txt
FILE *outp = fopen("Singer.txt", "w");
for (int i = N - 1; i >= 0; i--)
{
fprintf(outp, "%s 得票数:%d 评委分:%.1f\n", singer[i].name, singer[i].total, singer[i].score);
}
fclose(outp);
while (1)
{
menu();
scanf("%d", &n);
switch (n)
{
case 0:
exit(0);
case 1:
fun1(singer);
break;
case 2:
printf("编号 姓名 分数\n");
for (int i = N - 1; i > N - 11; i--)
{
fun2(singer + i);
}
break;
case 3:
puts("输入选手编号:");
scanf("%d", &tmp);
for (int i = 0; i < N; i++)
{
if (tmp == fun3(singer + i))
{
printf("%s 得票数:%2d 评分:%.1f\n", singer[i].name, singer[i].total, singer[i].score);
}
}
break;
default:
break;
}
getchar();
getchar();
system("cls");
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
//关闭文件
fclose(fp);
}
//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}
//关闭文件
fclose(fp);
}
//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}
//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
借用前方大佬的代码,帮助修改错误,望采纳
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
//关闭文件
fclose(fp);
}
//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}
//关闭文件
fclose(fp);
}
//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}
//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
看起来还是挺麻烦的,这个我下班了晚上给你写啊。
大佬们 挺专业的 我膜拜观望