歌手比赛评分系统程序设计

  • 格式:docx
  • 大小:1.06 MB
  • 文档页数:32

计通学院

课程设计报告

课程名称___高级程序设计语言 __

题目名称___歌唱比赛评分系统_ __

学生学院_ 计通学院_ __ __

专业班级_ 软件181 _

学 号

学生姓名

指导教师_____ __ ____

2019年1月7号 目录

1. 设计目的与要求…………………………………………3

1.1 题目与设计要求……………………………………3

1.2 本程序涉及的知识点………………………………3

2.功能设计………………………………………………3

2.1总体设计……………………………………………3

2.2详细设计……………………………………………4

3. 程序实现……………………………………………27

3.1程序实现时应考虑的问题…………………………27

3.2 XX模块核心代码…………………………………27

4.测试分析……………………………………………32

4.1 测试结果及分析…………………………………32

5. 总结…………………………………………………35

参考文献………………………………………………35

1. 设计目的与要求

1.1题目与设计要求

题目:歌手比赛评分系统

设计要求:有十个选手参加歌唱比赛,十个裁判对每个选手的演唱进行打分,去掉一个最高分,去掉一个最低分,剩下分数的平均值作为每位选手最后的成绩。

功能要求:

(1)采用结构体定义每个选手的参赛编号,姓名以及十个裁判打出的分数;

(2)从键盘输入每个选手的相关信息:参赛编号,姓名和十个得分;

(3)计算每位选手的最后得分,并按分数由高到低排序;

(4)查询功能:输入参赛选手的编号或姓名,便可输出该选手的得分以及排名;

以上功能采用菜单操作方式,即从键盘输入1到3这三个数,分别完成以上(2)到(4)的功能。

1.2本程序设计的知识点

结构体、数组、指针、文件操作。

2.功能设计

2.1总体设计

○1选手信息浏览,○2选手信息录入,○3选手信息保存,○4选手成绩查询,○5选手信息修改,○6选手信息删除,○7选手数据:编号、姓名、成绩、平均成绩。

2.2详细设计

○1浏览选手数据browse()

分析:实际为链表的遍历,将头节点的指针给予临时节点p1,用while语句实现链表的遍历。

void browse()

{

SONGER_MESSAGE *p1;

if(head==NULL&&tail==NULL)

{

printf("\n--------当前信息记录为空--------\n");

}

else

{

printf("\n-----------你要浏览的选手信息如下---------\n");

printf("--------|--------\n");

printf(" 编号 | 姓名 \n"); p1=head; while(p1!=NULL)

{

printf("--------|--------\n");

printf("%-9d%-6s\n",p1->num,p1->name);

p1=p1->next;

}

printf("--------|--------\n");

}

}

○2查询选手成绩search()

分析:提供详细成绩查询,排名查询的函数调用。其中各功能均采用菜单选择的方式。

void search()

{

int c;

printf("\n请选择查询内容:\n");

printf("1.选手详细成绩查询 2.选手排名查询\n请输入您的选择:"); scanf("%d",&c);

switch(c)

{

case1:

system("cls");

print();

break;

case2:

system("cls");

rank();

break;

}

}

○3查询选手信息print()

分析:实际为输出链表中的某个节点,输出某个选手的编号与姓名较为好实现,输出10位评委成绩则用的for语句来实现。

void print()

{

SONGER_MESSAGE *p1=(SONGER_MESSAGE *)malloc(LEN);

int check=0,i;

long seeknum;

printf("\n请输入要查找的选手编号:");

scanf("%d",&seeknum);

if(head==NULL&&tail==NULL )

{

printf("\n对不起,当前记录为空!\n");

}

else

{

p1=head;

printf("\n-----------你要找的选手的成绩如下---------\n");//在这里找到了要查找的选手成绩

printf("------|------|-----|----|----|----|----|----|----|----|----|----|----|----------|--------\n");

printf(" 编号 | 姓名 | 成绩| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均成绩\n");

printf("------|------|-----|----|----|----|----|----|----|----|----|----|----|----------|--------\n");

while(p1 != NULL)

{

if(p1->num==seeknum)

{

printf("%-7d%-6s",p1->num,p1->name);

printf(" ");

for(i=0;i

{

printf("%.1f",p1->grades[i]);

}

printf("%-6.2lf\n",p1->ave);

check=1;

getchar();

return;

}

else

{

p1=p1->next;

}

}

}

if(head!=NULL&&check==0)

{

printf("\n对不起,你查看的选手成绩不存在!\n");

} getchar();

}

○4选手信息录入creat()

分析:录入信息表现为创建链表节点并给节点的元素赋值,然后对评委的分数进行排序(链表的排序),排序选择冒泡排序法,最后去掉一个最高分去掉一个最低分。

void creat()

{

int i,j;

float t;

char c='y'; while(c=='y’||c=='Y')

{

SONGER_MESSAGE *p1=(SONGER_MESSAGE *)malloc(LEN);

printf("\n请输入要录入的选手信息:\n");

printf("\n选手编号:");

scanf("%d",&p1->num);

printf("\n选手姓名:");

scanf("%s",p1->name);

printf("\n请输入10位评委点评成绩:");

p1->ave =0;

for(i=0;i

{

scanf("%f",&(p1->grades[i])); //runtime error//

p1->ave+=p1->grades[i];

}

for(i=0; i

//冒泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个//

for(j=0;j

if(p1->grades[j]>p1->grades[j+1])

{

t=p1->grades[j];

p1->grades[j]=p1->grades[j+1];

p1->grades[j+1]=t;

}

p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;

//去掉一个最高分,去掉一个这一低分,得出最后的平均分//

p1->next=NULL;

if(p1==NULL)

{

printf("\n内存分配失败\n");

n=n-1;

}

if(head==NULL&&tail==NULL) //当前没有结点,创建第一个结点//

{

head=p1;

head->next=NULL;

tail=head;

printf("\n------选手信息录入成功------\n");

}

Else //如果当前还有节点则插入到尾部//

{

tail->next=p1;

tail=p1;