歌手评分系统

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*****************************************************************************
创建链表
李佳音
******************************************************************************/
#include
#include
typedef struct Singer
{
char name[20];
int number; //编号
float score[9]; //打分(九名评委)
float average; //平均分
struct Singer *next;//指向下一个元素的指针
struct Singer *count;
}SINGER;

SINGER* CreateLink(int number)
{
SINGER *head,*tail,*NewNode;


int n;
head=tail=NewNode=(SINGER *)malloc(sizeof(SINGER));

for(n=0;n{
NewNode=(SINGER *)malloc(sizeof(SINGER));
tail->next=NewNode;

tail=NewNode;


}
NewNode->next=NULL;
head->count=number;

return head; //返回头指针
}

/******************************************************************************
输入数据函数InputData()
赵烯彤
******************************************************************************/
void InputData(SINGER *s)
{
FILE *fp;
int n; //评委打分循环用
int m; //记第m名选手用
SINGER *h=s->next; //定义新的头指针,以免原头指针移动
m=1;
fp=fopen("singerOriginal.dat","wb");
while(1)
{
if(h==NULL)
{ //只有链表结束时才结束本函数
return;
}
printf("请输入第%d个选手的信息:\n",m);
printf("请输入姓名:");
scanf("%s",h->name);
printf("请输入编号:");
scanf("%d",&(h->number));
getchar();
printf("请输入成绩:\n");
for(n=0;n<9;n++)
{
printf("请输入第%d个评委的打分:",n+1);
scanf("%f",&(h->score[n]));
}
printf("******************************************************************************\n");
printf("******************************************************************************\n");
h=h->next; //移动指针
m++;
fwrite(s,sizeof(SINGER),1,fp);
}
fclose(fp);
}

/******************************************************************************
计算函数CalculateData()
李京潼
******************************************************************************/
void CalculateData(SINGER *s)
{

int n; //循环用
float min; //记录最小值
float max; //记录最大值
SINGER *h=s->next; //定义新的头指针,以免原头指针移动
while(1)
{
if(h==NULL)
{ //只有链表结束时才结束本函数
return;
}
max=h->score[0]; //初始化max
min=max; //初始化min
h->average=0; //初始化average
for(n=0;n<9;n++)
{ //求出最大值,最小值
if(h->score[n]>max)
{
max=h->score[n];
}
if(h->score[n]{
min=h->score[n];
}
}
for(n=0;n<9;n++)
{ //计算总分
(h->average)+=(h->score[n]);
}
h->average=(float)((h->average-max-min)/7.0); //计算平均分
h=h->next;
}
}
/***************************************************************

***************
排序函数SortData()
王江宁
******************************************************************************/
void SortData(SINGER *s,int number)
{
SINGER *head,*tail; //定义头尾节点指针
SINGER *p,*p1,*p2,*p3; //定义四个指针,其中p为寻找尾节点用,p1,p2,p3为排序用
int n; //循环用
tail=(SINGER *)malloc(sizeof(SINGER)); //尾尾节点分配空间
head=s; //为head赋值
p=s->next; //初始化p
while(p->next!=NULL)
{ //p找尾节点
p=p->next;
}
p->next=tail; //找到后尾节点的next存tail
tail->next=NULL; //tail中的next存空,防止出错
for(n=0;n{ //循环number-1次,排序
p3=head; //为p3初始化到头节点
p1=p3->next; //为p1初始化到头节点的下一个
p2=p1->next; //为p2初始化到p1的下一个
while(p2!=tail)
{ //p2未到底后
if((p1->average)<(p2->average))
{ //交换
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2;
p2=p1->next;
}
else
{
p3=p1;
p1=p2;
p2=p2->next;
}
}
}
p=s->next;
while(p->next!=tail)
{ //将p重新定义到尾
p=p->next;
}
p->next=NULL; //next存空,防出错
}
/******************************************************************************
输出数据源函数OutputSource()
陈琦
******************************************************************************/
void OutputSource(SINGER *s)
{
SINGER *h=s->next; //定义新的头指针,以免原头指针移动
int n; //循环用
printf("下面输出原始成绩:\n");
printf("选手编号 姓名 评委打分\n");
while(1)
{
if(h==NULL)
{
return;
}
printf(" %d %s ",h->number,h->name);
for(n=0;n<9;n++)
{
printf("%.3f ",h->score[n]);
}
printf("\n");
h=h->next; //移动指针
}
}
/******************************************************************************
输出最终数据OutputFinal()
陈琦
******************************************************************************/void OutputFinal(SINGER *s)
{
FILE *fp;
SINGER *h=s->next; //定义新的头指针,以免原头指针移动
int n=1; //排名用
printf("下面输出最终成绩:\n");
printf("名次 选手编号 姓名 得分 \n");
fopen("singerFinal.dat","wb");
while(1)
{
if(h==NULL)
{
return;
}
printf(" %d %d %s %.3f",n,h->number,h->name,h->average);
n++;
printf("\n");
h=h->next;
}
fclose(fp);

}
/******************************************************************************
删除数据Delete()
赵烯彤
******************************************************************************/
SINGER* Delete(SINGER *s)
{
int SN; //删除用
SINGER *p1=NULL; //存空
SINGER *p2=NULL; //存空
p1=s->next;
printf("请输入您想删除的歌手的编号");
scanf("%d",&SN); //读入想删除的编号
while(SN

!=p1->number&&p1->next!=NULL)
{ //p1中的number不为SN
p2=p1; //移动
p1=p1->next; //移动
}
if(p1->number==SN)
{
if(p1==s->next)
{ //当要改数据为头节点时
s=p1; //更新头节点
p1=NULL; //防止误操作
}
else
{
p2->next=p1->next;
free(p1);
}
return s;
}
else
{
printf("无此名歌手!\n");

}
return s; //返回头指针
}
/******************************************************************************
插入数据insert()
石洁
******************************************************************************/
void insert(SINGER *head,SINGER *p){
SINGER *s = (SINGER*)malloc(sizeof(SINGER));
for(s=head;s->next!=NULL;){
s=s->next;
}
s->next=p;
p->next=NULL;
}
/******************************************************************************
主函数main()
石洁
******************************************************************************/
int main(void)
{
SINGER *head; //头指针
int SingerNumber; //学生人数
int instruct;//输入指令用
int n;
printf("******************************************************************************\n");
printf("******************************************************************************\n");
printf("歌手评分系统\n");
printf("\n\n");
printf("下面开始创建歌手信息\n");
printf("请输入歌手人数:");
scanf("%d",&SingerNumber);
head=CreateLink(SingerNumber); //调用创建链表函数
printf("下面请输入歌手信息\n");
InputData(head); //调用输入函数
OutputSource(head); //调用输出源数据函数
printf("******************************************************************************\n");
printf("******************************************************************************\n");
printf("请输入操作指令:\n");
while(1)
{
printf("插入个人信息请按:“1”\n");
printf("删除个人信息请按:“2”\n");
printf("计算成绩请按: “3”\n");
printf("计算排名请按: “4”\n");
printf("输出最终成绩请按:“5”\n");
printf("退出请按: “6”\n");
printf("请输入操作指令:");
scanf("%d",&instruct); //录入指令
if(instruct==1) //指令1
{
SINGER * p = (SINGER*)malloc(sizeof(SINGER));
printf("请输入要插入的歌手的信息");
printf("请输入姓名:");
scanf("%s",p->name);
printf("请输入编号:");
scanf("%d",&(p->number));
getchar();
insert(head,p); //调用插入函数
SingerNumber++;
printf("请输入成绩:\n");
for(n=0;n<9;n++)
{
printf("请输入第%d个评委的打分:",n+1);
scanf("%f",&(p->score[n]));
}
printf("插入完成!请继续操作:\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
else if(instruct==2

) //指令2
{
head=Delete(head); //调用删除函数
printf("删除完成!请继续操作:\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
else if(instruct==3) //指令3
{
CalculateData(head); //调用计算平均分函数
printf("计算完成!请继续操作:\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
else if(instruct==4) //指令4
{
SortData(head,SingerNumber); //调用排序函数
printf("排序完成!请继续操作:\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
else if(instruct==5) //指令5
{
OutputFinal(head); //调用输出最终结果函数
printf("输出完成!请继续操作:\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
else if(instruct==6) //指令6
{ //按“6”退出程序
break;
}
else
{ //报错,重新输入
printf("输入有误,请重新输入!\n");
printf("***********************************************************\n");
printf("***********************************************************\n");
}
}
return;
}

相关文档
最新文档