选美比赛
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; }
相关文章推荐
- 1014: 选美比赛
- 2017-04-04 水题信心 03选美比赛
- 数学趣题——选美比赛
- 杉山恭子,2008年"日本美女"选美比赛结果揭晓(组图)
- 用双向循环链表解决数据结构中的选美比赛问题。
- c语言趣题之“选美比赛”
- 2017-04-04 在校训练T3 选美比赛 contest
- Paxos—以选美比赛为例PPT
- 问题 O: 选美比赛
- 网路通信中的选美比赛,看看国外的电话费为什么那么便宜"Beauty Contest"
- (C语言)选美比赛
- hdu1285 确定比赛名次(拓扑排序)
- OpenMPI学习笔记(五)之乒乓球比赛模拟(一)
- cv/dl/cl领域的实验室官网/牛人主页/技术论坛/比赛数据库/好玩的东西
- 大学生可以参加的计算机比赛
- 2016.7.14比赛总结
- 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 确定比赛的名次
- CSU-ACM2016暑假集训比赛4
- HDU Problem 1285 确定比赛名次【拓扑排序】
- 确定比赛名次(优先队列)