是关于歌手评分系统的!
9个评委,10个选手
主函数下面要求有4个函数调用
包括:
1 输入评委分数
2 计算平均分(要求去掉一个最高分和一个最低分)
3 排序
4 输出结果
结果显示的时候要求有
1 名次
2 选手序号或姓名
3 最后得分
运用指针 数组 和结构体
上面的是要求.
#include <stdio.h>
struct singer
{
int num;
// char name[10];
float score;
}singers[10];
//记录评委分
float scores[9];
void inputscores(int i)
{
printf("请给第%d位选手打分\n",i+1);
//读入九个分数,自己改改
scanf("%f",scores)
}
void jisuan(int i)
{
//找出最大,最小分
int j=0;
float s1=scores[0],s2=scores[0],temp=0;
while(j<9)
{
if(scores[j]>s1)s1=scores[j];
if(scores[j]<s2)s2=scores[j];
}
j=0;
while(j<9){temp+=scores[j];}
temp=temp-2*s1-2*s2;
singers[i].num=i;
singers[i].score=temp/7;
}
void paixu()
{//用最简单的排序
struct singer temp;
int i,j;
while(i<10)
{j=i;
while(j<10){
if(singers[i].score<singers[j].score){temp=singers[i];singers[i]=singers[j];singers[j]=temp;}
j++;
}
i++;
}
}
void outputresult()
{int i=0;
while(i<10){printf("%d\n%d\n%f"),i+1,singers[i].num,singers[i].score}
}
void main()
{
int i=0;
while(i<10)
{
inputscores(i);
jisuan(i);
}
paixu();
outputresult();
}
大家看哪写错了,告诉小弟!谢谢!
----------------解决方案--------------------------------------------------------
我还做不出来
----------------解决方案--------------------------------------------------------
弄了一个,应该能实现所有功能,用了一个晚上和一个下午弄的呀,大家给点意见!
/************************************************************************/
#include <stdio.h>
#include<string.h>
/*选手结构体*/
struct singer{
char name[8]; /*选手姓名*/
int score[9]; /*选手成绩*/
int flag; /*选手名次*/
int ave; /*选手平均分*/
} singers[10];
int *point[10]; /*指针,用来帮助排序*/
/*评委结构体*/
struct pingwei{
char name[8]; /*评委姓名*/
} pingweis[9];
/*指针*/
void input() /*数据录入函数*/
{
int i,j;
char temp[8];
/*录入评委姓名*/
printf("请输入九位评委的名字:");
for(i=0;i<9;i++)
{
printf("\n第%d位评委:",i+1);
scanf("%s",pingweis[i].name);
}
/*录入选手姓名*/
printf("请输入十位选手的名字:");
for(i=0;i<10;i++)
{
printf("\n第%d位选手:",i+1);
scanf("%s",singers[i].name);
singers[i].flag=i;
}
/*录入分数*/
for(i=0;i<10;i++)
{
printf("请输入九位评委对%s选手的打分:",singers[i].name);
for(j=0;j<9;j++)
{
printf("\n%s评委:",pingweis[j].name);
scanf("%d",&singers[i].score[j]);
}
}
}
/*求平均值函数*/
void average()
{
int i,j,max=0,min=0,sum=0;
for(i=0;i<10;i++)
{
max=min=singers[i].score[0];
/*找出最大、最小、总分值*/
for(j=0;j<9;j++)
{
sum=sum+singers[i].score[j];
if(singers[i].score[j]>max) max=singers[i].score[j];
if(singers[i].score[j]<min) min=singers[i].score[j];
}
singers[i].ave=(sum-max-min)/3;
point[i]=&singers[i].ave; /*指针指向每个选手的平均分*/
max=0;min=0;sum=0;
}
}
/*排序函数*/
void paixu()
{
int i,j;
int *temp;
/*利用指针帮助排序*/
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(singers[j].ave>*point[i])
{
temp=point[i];
point[i]=point[j];
point[j]=temp;
}
}
}
/*根据排好的序给出每个学生的名次,平均分相同的名次相同*/
for(i=9;i>=0;i--)
{
for(j=0;j<10;j++)
{
if(*point[i]==singers[j].ave) singers[j].flag=i;
}
}
}
/*输出数据*/
void output()
{
int i,j;
printf("\n*************************\n");
printf("名次 姓名 分数\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(singers[j].flag==i)
{
printf("%d %s %d\n",i,singers[j].name,singers[j].ave);
}
}
}
printf("\n*************************\n");
}
main()
{
input();
average();
paixu();
output();
}
----------------解决方案--------------------------------------------------------