选美比赛管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
一、课程设计题目:选美比赛管理
二、课程设计工作自2007年7月9日起至2006年7月16日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具有如下功能:
一批选手参加比赛,比赛的规则是最后得分越高,名次越低。
当半决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。
例如:
选手序号: 1,2,3,4,5,6,7
选手得分: 5,3,4,7,3,5,6
输出名次为: 3,1,2,5,1,3,4
编写程序完成半决赛的评分排名工作,并按以上格式将结果输出到屏幕及文件beauty.dat
四、课程设计要求:
程序质量:
●贯彻结构化程序设计思想。
●用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
●用户界面中的菜单至少应包括“信息录入”、“查询”、“排名”、“退
出”4项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●目录
●课程设计任务书
●需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:________ 学生签名:________
目录
一、需求分析 (1)
二、程序流程图 (2)
三、核心技术的实现说明及相应程序段 (7)
四、个人总结 (8)
五、参考文献 (9)
六、源程序 (9)
一、需求分析
经过对程序设计题目的分析可知,此问题用链表来完成。
建立结构体player,来存储选手信息,包括选手序号、姓名、分数、名次以及指向下一结点的指针next。
按序号从小到大建立链表,依次将各结点赋初值,名次先初始化为0。
将此链表按分数进行排序,为每个结点的名次赋值,保存。
输出结果。
整个程序的设计实现大致分为3大模块,第一大模块为选手信息录入模块,其中包括录入信息、排序、保存等;第二大模块为查询选手信息模块,其中包括按姓名查询、按序号查询、按名次查询;第三大模块为输出比赛结果模块。
程序中用到的函数:主菜单函数menu()、建立结点函数creatone ()、建立链表函数inseart()、排出名次函数sorts ()、保存函数save()、子菜单函menu1()、按姓名查询函数searchname()、按序号查询函数searchid()、按名次查询函数searchorder()、输出比赛结果函数print()。
其实现的功能具体如下:
1、建立结点函数creatone():录入选手信息(姓名、分数)建立选手结点,即创建人物。
2、建立链表函数inseart():将各个结点按序号链接在一起,构建一个链表。
3、排出名次函数sorts():对链表中分数进行排序,分数越少名次越高。
将得到的名次赋给各个结点中的order。
4、保存函数save():对输出到屏幕的选手信息按指定路径加以保存。
5、按姓名查询函数searchname():输入姓名,到链表中去比对,成功则输出此人信息,否则输出无此人信息。
按序号、名次查询结构与此相同。
6、输出比赛结果函数print():按名次输出各个选手的信息。
二、程序流程图
总体结构图
程序运行情况:主菜单
录入选手信息:
查询子菜单:
名次查询:
输出比赛结果:
三、核心技术的实现说明及相应程序段
本程序采用链表结构,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,排出名次函数sorts()是程序中最为核心的部分,下面对此函数加以说明。
此函数的目标是对选手链表按分数进行排名,为结构体中的order项赋值。
具体的程序说明如下:
//--------------排序函数----------------
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;
}
四、个人总结
在设计此程序时由于已经1年没复习C语言知识了忘记了好多语句,所以我又把《C程序设计》阅读了几边把忘记的知识补充上,这使我的C语言基础知识更牢靠了。
这次C程序的设计不同于以前,其要求更高了,我设计了一个小程序就用了5天的时间,现在知道了做程序员是很辛苦的。
此次我设计的程序通过了测试,基本能达到课程设计要求,本人知识有限程序可能还有不合理之处望老师批评指正。
五、参考文献
1 谭浩强 C程序设计北京:清华大学出版社,2005
2 谭浩强 C程序设计题解与上机指导北京:清华大学出版社,2005
六、源程序
//======================================================= //在选美大奖赛的半决胜赛现场,有一批选手参加比赛,比赛的规则是最//后得分越高,名次越低。
当半决决赛结束时,要在现场按照选手的出场//顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,//名次连续编号,不用考虑同名次的选手人数。
//======================================================= //--------------头文件----------------
#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); /*为新结点分配空间*/
printf("%d号选手姓名:",++i); /*输入信息*/
scanf("%s",p->name);
if( strcmp( p->name,"end" )==0 ) /*判断是否停止输入*/
p = 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;
struct player *p;
p = head->next;
if((fp = fopen("beauty.dat","wb"))==NULL)
{
printf("Can't open the file\n");
exit(0);
}
while(p!=NULL)
{
fwrite(p,L,1,fp);
p = p->next;
}
fclose(fp);
}
//--------------主函数----------------
int main()
{
int system (const char *);
system ("color 2e");
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;
}
18。