新鲜出炉的源码,仅供参考:
#include
void ShowSingerData();
void AddNewSingeData();
#define USER_LEN 16
#define SOCRE_LEN 10
#define MAX_SINGER 10
struct s_Singer
{
float avgScore ; // 歌手平均分
int score[SOCRE_LEN] ; // 歌手分数记录
int num; // 参赛编号
char name[ USER_LEN ] ; // 歌手名字
struct s_Singer* pNext ;
struct s_Singer* pPrev ;
};
static int g_CurSingerNum ; // 当前歌手编号
static struct s_Singer g_Singers[MAX_SINGER]; // 参赛的歌手
static struct s_Singer* g_SingerList; // 比赛后的歌手排名表
void ShowCmd()
{
char cmd = '\0';
while(true)
{
printf("welcom The Singing Contest\n");
printf("\t'a'-add new singer information\n");
printf("\t's'-show The Singing Contest List\n");
printf("\t'q'-exit!\n");
fflush(stdin);
if( (cmd=getchar())!=EOF)
{
if( cmd == 'q' )
{
break;
}
switch (cmd)
{
case 'a': AddNewSingeData();break;
case 's': ShowSingerData(); break;
}
}
}
}
void ShowSingerData()
{
printf("num\tavg\tname\n");
static struct s_Singer* t ;
t = g_SingerList;
while( t != NULL )
{
printf( "%d\t%0.2f\t%s\n",t->num,t->avgScore,t->name );
t=t->pNext;
}
}
void AddSinger( struct s_Singer *pSinger )
{
if( g_SingerList != NULL )
{
struct s_Singer* t =g_SingerList;
while( t!=NULL && t->pNext )
{
if( t->avgScore < pSinger->avgScore )
{
break;
}
t = t->pNext;
}
if( t != g_SingerList && t->pNext!=NULL )
{
pSinger->pPrev = t->pPrev;
pSinger->pNext = t;
t->pPrev->pNext = pSinger;
t->pPrev = pSinger;
}
else
{
if( t == g_SingerList )
{
if( g_SingerList->avgScore < pSinger->avgScore )
{
pSinger->pNext = t;
t->pPrev = pSinger;
g_SingerList = pSinger;
}
else
{
g_SingerList->pNext = pSinger;
pSinger->pPrev = g_SingerList;
}
}
else
{
if( t->avgScore>pSinger->avgScore)
{
t->pNext=pSinger;
pSinger->pPrev = t;
pSinger->pNext = NULL;
}
}
}
}
else
{
g_SingerList = pSinger;
return;
}
}
void DealLowHigh(struct s_Singer *pSinger)
{
int l=0,low=pSinger->score[0];
int h=0,hight=pSinger->score[0];
for( int i=0;i{
if( pSinger->score[i]{
low = pSinger->score[i];
l=i;
}
if( pSinger->score[i]>hight )
{
hight = pSinger->score[i];
h=i;
}
}
pSinger->score[l] = 0 ;
pSinger->score[h] = 0 ;
}
void CacluateAvg( struct s_Singer *pSinger )
{
int sum = 0;
for( int i=0;i{
sum+=pSinger->score[i];
}
pSinger->avgScore = 1.0F*sum/(SOCRE_LEN-2);
}
void AddNewSingeData()
{
if( g_CurSingerNum>=MAX_SINGER )
{
printf("sorry! the singing contest has overed!\n");
return;
}
printf("Plz,enter the singer's information\n");
struct s_Singer* pSinger = &g_Singers[g_CurSingerNum];
pSinger->num = ++g_CurSingerNum;
fflush(stdin);
if( scanf_s("%s %d %d %d %d %d %d %d %d %d %d",
pSinger->name,
USER_LEN,
&pSinger->score[0],
&pSinger->score[1],
&pSinger->score[2],
&pSinger->score[3],
&pSinger->score[4],
&pSinger->score[5],
&pSinger->score[6],
&pSinger->score[7],
&pSinger->score[8],
&pSinger->score[9]) != EOF )
{
DealLowHigh( pSinger );
CacluateAvg( pSinger );
AddSinger( pSinger );
}
}
int main(int argc, char* argv[])
{
ShowCmd();
return 0;
}
运行结果
给你一个复杂版本作参考,我在code blocks上运行,正常输入没有问题
#include
#include
#define true 1
#define false 0
#define bool int //定义布尔型数据类型(鉴于有些编译器不支持最新的C99标准)
#define N_size 30
#define S_size 10
#define P_size 10 //分别指定姓名的最大字符数,得分数目,选手个数
struct Player
{
long int number;
char name[N_size];
float scores[S_size];
float total;
}player[P_size]; //定义所需的结构体类型
int main()
{
void initialize(struct Player *p); //初始化数据的函数
bool input(struct Player *q); //输入数据的函数
void calculate(struct Player *r); //计算得分及排序的函数
bool inquire(struct Player *t); //查询函数
int index,state; //定义菜单索引及状态量(操作成功与否)
char c; //用于响应用户的字符
struct Player *p=player; //定义结构体指针
initialize(p);//初始化
do
{
printf(" ------------------------------------------------\n");
printf(" 1--------输入选手编号,姓名,得分(input)\n");
printf(" 2--------计算选手最后得分并排序(calculate)\n");
printf(" 3--------查询(按编号,姓名)(inquire1)\n");
printf(" ------------------------------------------------\n");//输出菜单内容
scanf("%d",&index);//接收菜单选择
switch(index)//执行相关操作
{
case 1:state=input(p);
if(state) printf("输入成功!\n\n");
else printf("输入失败!!!\n\n");
break;
case 2:calculate(p);
break;
case 3:state=inquire(p);
if(state) printf("查询成功!\n\n");
else printf("查询失败!!!\n\n");
break;
default:printf("错误选择!请重新选择\n\n");
}
printf("是否要继续('y' or 'Y' to continue;'n' or 'N' to quit)?\n\n");
fflush(stdin);//清理缓冲区
scanf("%c",&c);
}while(c!='n'&&c!='N');
printf("\n\nBye bye!\n\n");//结束
return 0;
}
void initialize(struct Player *p)//初始化函数,将相关数据置为0
{
int i=0,j=0;
for(i=0;i{
p[i].number=i+1;
strcpy(p[i].name,"no name");
p[i].total=0.0;
for(j=0;jp[i].scores[j]=0.0;
}
}
bool input(struct Player *q)//输入数据的函数
{
int i=0,j=0;
for(i=0;i{
printf("\n请输入第%d名选手的编号:_____\b\b\b\b\b",i+1);
scanf("%ld",&q[i].number);
printf("\n请输入该选手的姓名:_____\b\b\b\b\b");
scanf("%s",q[i].name);
printf("\n请输入该选手的得分:\n");
for(j=0;j{
printf("[%d]",j+1);
scanf("%f",&q[i].scores[j]);
}
}
if(i==P_size) return true;//接收成功与否
else return false;
}
void calculate(struct Player *r)//计算及排序函数
{
int i=0,j=0,temp;
float sum=0.0,temp1,temp2;
for(i=0;i{
sum=0.0;
for(j=0;jsum+=r[i].scores[j];
r[i].total=sum;
} //先求总分
for(i=0;i{
temp1=r[i].scores[0];
temp2=r[i].scores[0];
for(j=1;j{
if(temp1temp1=r[i].scores[j];
if(temp2>r[i].scores[j])
temp2=r[i].scores[j];
}
r[i].total=r[i].total-temp1-temp2;//去掉最高分及最低分
}
for(i=0;i{
temp=i;
for(j=i+1;jif(r[i].total temp2=r[i].total;
r[i].total=r[temp].total;
r[temp].total=temp2;//选择排序法 排序
}
printf("\n计算及排序完成,可按3查询\n\n");
}
bool inquire(struct Player *t)
{
char ch;
int i=0,j=0,flag=0;
fflush(stdin);//清理缓冲区
printf("\n若按编号查询请输入'n';若按姓名查询请输入'N':_____\b\b\b\b");
scanf("%c",&ch);
if(ch=='n') //.......................按编号查找
{
long int num;
printf("\n请输入要查找的编号:____\b\b\b\b");
scanf("%ld",&num);
for(i=0;i{
if(num==t[i].number)
{printf("\n编号 姓名 最后得分 排名\n");
printf("No.%ld %s %.2f %d\n",t[i].number,t[i].name,t[i].total,i+1);
printf("其中十个得分分别为:");
for(j=0;jprintf("%.2f ",t[i].scores[j]);
printf("\n\n");
flag=1;
break;
}
}
}
else if(ch=='N')//.....................按姓名查找
{
char na[N_size];
printf("\n请输入要查找的姓名:____\b\b\b\b");
scanf("%s",na);
printf("编号 姓名 最后得分 排名\n");
for(i=0;i{
if(strcmp(na,t[i].name)==0)
{printf("%ld %s %.2f %d \n",t[i].number,t[i].name,t[i].total,i+1);
printf("其中十个得分分别为:");
for(j=0;jprintf("%.2f ",t[i].scores[j]);
printf("\n\n");
flag=1;
break;
}
}
}
if(flag==1) return true;//查询成功与否
else return false;
}
#include
#include
struct player
{
char number[10];
char name[10];
float score[10];
float scores;
int ranking;
}players[10];
int main()
{
int i,j;
void function1();
void function2();
void function3();
for(j=0;j<3;j++)
{
printf("请输入数字1~3:\n");
scanf("%d",&i);
switch(i)
{
case 1:function1();break;
case 2:function2();break;
case 3:function3();break;
}
}
return 0;
}
void function1()
{
printf("输入每个选手的相关信息:参赛编号,姓名和十个得分\n");
int i,j,k;
for(i=0;i<10;i++)
{
printf("请输入选手%d的编号\n",i+1);
scanf("%s",players[i].number);
printf("请输入选手%d的姓名\n",i+1);
scanf("%s",players[i].name);
printf("请输入选手%d的十个得分\n",i+1);
for(j=0;j<10;j++)
{
printf("得分%d:",j+1);
scanf("%f",&players[i].score[j]);
}
}
}
void function2()
{
int i,j;
for(i=0;i<10;i++)
{
float max,min,sum=0;
max=players[i].score[0];
min=players[i].score[0];
for(j=0;j<10;j++)
{
if(players[i].score[j]>=max)
max=players[i].score[j];
if(players[i].score[j]<=min)
min=players[i].score[j];
sum=sum+players[i].score[j];
}
players[i].scores=(sum-max-min)/8;
}
float a[10],t;
for(i=0;i<10;i++)
a[i]=players[i].scores;
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if(a[i]{
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(players[i].scores==a[j])
players[i].ranking=j+1;
printf("排名 编号 姓名 得分\n");
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(players[j].ranking==i+1)
printf("%d\t%s\t%s\t%f\t\n",players[j].ranking,players[j].number,players[j].name,players[j].scores);
}
void function3()
{
char c[10];
int i;
printf("请输入参赛选手的编号或姓名:\n");
scanf("%s",c);
for(i=0;i<10;i++)
{
if(strcmp(players[i].name,c)==0||strcmp(players[i].number,c)==0)
{
printf("排名 编号 姓名 得分\n");
printf("%d\t%s\t%s\t%f\t\n",players[i].ranking,players[i].number,players[i].name,players[i].scores);
}
}
}
/*这题太 变态了!*/