选美比赛

//=======================================================
//在选美大奖赛的半决胜赛现场,有一批选手参加比赛,比赛的规则是最
//后得分越高,名次越低。当半决决赛结束时,要在现场按照选手的出场
//顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,
//名次连续编号,不用考虑同名次的选手人数。
//=======================================================
//--------------头文件----------------
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值