您的位置:首页 > 其它

选美比赛

2013-10-15 09:42 162 查看
//=======================================================
//在选美大奖赛的半决胜赛现场,有一批选手参加比赛,比赛的规则是最
//后得分越高,名次越低。当半决决赛结束时,要在现场按照选手的出场
//顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,
//名次连续编号,不用考虑同名次的选手人数。
//=======================================================
//--------------头文件----------------
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>

//--------------宏定义----------------
#define L sizeof(struct player)

//--------------结构体----------------
struct player
{
int id;						//序号
int order;					//名次
char name[30];				//姓名
int score;					//分数
struct player * next;
};

//--------------菜  单----------------
int menu()
{
int a;
printf("\n\n\n                            欢迎进入选美成绩管理系统! \n\n\n");
printf("                         **************MENU************\n");
printf("                                1、选手信息录入\n");
printf("                                2、选手信息查询\n");
printf("                                3、输出比赛结果\n");
printf("                                4、退        出\n");
printf("                         ******************************\n");
do
{
printf("请输入1-4中的一个选项:");
scanf("%d",&a);
}while(a>4||a<1);

return(a);
}

/*-----------------------------------1-子菜单函数---------------------------*/
int menu1()
{
int a;
printf("                         ************MENU**********\n");
printf("                            (1)、按姓名查询\n");
printf("                            (2)、按序号查询\n");
printf("                            (3)、按名次查询\n");
printf("                            (4)、返回上一菜单\n");
printf("                         **************************\n");
do
{
printf("请输入1-4中的一个选项:");
scanf("%d",&a);
}while(a>4||a<1);

return(a);
}

//----------------------建立结点-----------------------
struct player * creatone( struct player * p,int i )
{
p = (struct player *)malloc(L);							/*为新结点分配空间*/
//malloc()是指开辟内存

printf("%d号选手姓名: ",++i);							/*输入信息*/
scanf("%s",p->name);

if( strcmp( p->name,"end" )==0 )						/*判断是否停止输入*/
//strcmp是比较后面参数中两个字符串的大小,判断是否相等
p = NULL;                                           //NULL是指空指针
else
{
printf("最后得分: ");
scanf("%d",&p->score);

p->id = i;
p->order = 0;
p->next = NULL;
printf("\n");
}
return p;
}

//--------------------------建立链表-------------------------------
struct player * insert( struct player * head,struct player * p )
{
struct player * q;

q = head;

while ( q->next!=NULL )
q = q->next;

q->next = p;

return head;
}

//--------------排序函数----------------
struct player * sorts( struct player * head,int n )
{
struct player * min;
struct player * p;
int count = 0;
int order = 1;
min = head->next;
p = min->next;
while ( count<n )
{
while ( p!=NULL )
{
if( min->score>p->score && p->order==0 )
min = p;
p = p->next;
}
min->order = order;
count++;
p = min->next;

while ( p!=NULL )
{
if ( min->score==p->score )
{
p->order = order;
count++;
}
p = p->next;
}
order++;

min = head->next;
if ( min->order!=0 )
min = min->next;
p = min->next;
}
return head;
}

//-----------------按名字查找-----------------
void searchname( struct player * head )
{
struct player * q;
char name[30];

q = head->next;

printf ( "请输入要查询的选手的姓名:" );
scanf ( "%s",name );
while ( q!=NULL && strcmp(q->name,name)!=0 )
q = q->next;
if ( q==NULL )
printf ("没有此人的信息!\n\n");
else
printf ("\n%d号选手%s\n 名    次:第%d名\n 最后得分:%d分\n\n\n",q->id,q->name,q->order,q->score);

}
//-----------------按序号查找-----------------
void searchid( struct player * head )
{
struct player * q;
int id = 0;

q = head->next;

printf ( "请输入要查询的选手的序号:" );
scanf ( "%d",&id );
while ( q!=NULL && q->id!=id )
q = q->next;
if ( q==NULL )
printf ("没有此人的信息!\n\n");
else
printf ("\n%d号选手%s\n 名    次:第%d名\n 最后得分:%d分\n\n\n",q->id,q->name,q->order,q->score);

}
//-----------------按名次查找-----------------
void searchorder( struct player * head )
{
struct player * q;
int order = 0;
int n = 0;

q = head->next;

printf ( "请输入要查询的选手的名次:" );
scanf ( "%d",&order );
while ( q!=NULL )
{
if ( q->order==order )
{
printf ("\n%d号选手%s\n 名    次:第%d名\n 最后得分:%d分\n",q->id,q->name,q->order,q->score);
n = 1;
}
q = q->next;
}

if ( n==0 )
printf ("没有此人的信息!\n\n");
}
//--------------输出比赛结果----------------
void print( struct player * head,int n )
{
struct player * p;
int count = 0;
int i = 1;
while ( count<n )
{
p = head->next;
printf("\n\n第%d名:\n",i);
while ( p!=NULL )
{
if (p->order==i)
{
printf ("\n%d号选手%s 最后得分:%d分",p->id,p->name,p->score);
count++;
}
p = p->next;
}
i++;
}
}

/*----------------------------------保存文件-----------------------------*/
void save(struct player *head)
{
FILE *fp;  //定义后指针变量fp是指向FILE类型结构体的指针,
//可以使他指向某个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件
struct player *p;
p = head->next;
if((fp = fopen("beauty.dat","wb"))==NULL)
//fopen是函数--FILE * fopen(const char * path,const char * mode)用来打开文件
//"beauty.dat"是文件名,"wb"是打开或建立一个二进制文件、只允许写数据
{
printf("Can't open the file\n");
exit(0);   //exit()是指退出,传入的参数是程序退出时的状态码,0表示正常退出
}
while(p!=NULL)
{
fwrite(p,L,1,fp);  //函数原型:fwrite(buffer,size,count,fp)
//buffer是一个指针,对fwrite来说是要输出数据的地址
//size是要写入的字节数,count是要进行写入size字节的数据项的个数
//fp是目标文件指针
p = p->next;
}
fclose(fp);  //关闭fp指向的文件句柄,防止句柄泄露
}

//--------------主函数----------------
int main()
{
int system (const char *);
system ("color 2e");
//首先这是一个控制台程序。
//包含 #include<stdilib.h>头文件。
//system("color 02");是表示黑背景绿色字.
//颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
//0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 A = 淡绿色
//3 = 湖蓝色 B = 淡浅绿色
//4 = 红色 C = 淡红色
//5 = 紫色 D = 淡紫色
//6 = 黄色 E = 淡黄色
//7 = 白色 F = 亮白色

struct player * head;
struct player * p;
int choice;
int i = 0;

head = (struct player *)malloc(L);
head->next = NULL;

while(1)                                  /*主菜单*/
{
choice = menu();
switch(choice)
{
case 1:
printf("请依次输入要录入的选手信息,在姓名栏输入end结束:\n\n");
while(1)
{
p = creatone( p,i );//录入姓名和得分
if ( p==NULL )
break;
i++;
head = insert( head,p );//将姓名得分链接
}
sorts( head,i );   //排序
save( head );      //保存
break;
case 2:
do
{
choice = menu1();
switch (choice)
{
case 1:
searchname( head );
break;
case 2:
searchid( head );
break;
case 3:
searchorder( head );
break;
case 4:
break;
}
}while( choice!=4 );
break;
case 3:
print( head,i );
break;
case 4:
exit(0);						 /*安全退出操作系统*/
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: