电视大赛观众投票及排名系统排序应用算法与数据结构报告模版.docx
《电视大赛观众投票及排名系统排序应用算法与数据结构报告模版.docx》由会员分享,可在线阅读,更多相关《电视大赛观众投票及排名系统排序应用算法与数据结构报告模版.docx(10页珍藏版)》请在冰豆网上搜索。
电视大赛观众投票及排名系统排序应用算法与数据结构报告模版
算法与数据结构课程设计
实
验
报
告
学号:
姓名:
专业:
班级:
一、课程设计目的
《算法与数据结构》是计算机相关专业的一门专业基础课程,通过课程学习,在课程设计环节应达到以下能力:
1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2.提高程序设计和调试能力。
学生通过上机训练,验证自己设计算法的正确性,学会有效利用基本调试方法,迅速找出程序代码中的错误并修改。
3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5.查阅文献资料的自学能力。
二、课程设计题目及要求
在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。
现在要求编写一程序模拟实现上述系统的功能。
三、需求分析
在本例中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存放选手信息的顺序表。
将选手的编号和姓名依此存入顺序表单元中,观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志。
投票结束后进行排序,在此采用希尔排序,然后为每个选手计算名次,得票相同的名次也相同。
四、总体设计
本程序分为四个模块:
1.主程序模块:
实现对函数的调用;
2.顺序表模块:
实现对选手信息的存储;
3.投票模块:
实现观众对选手的投票;
4.排序模块:
实现对选手成绩的排序。
它们之间的关系为:
主程序模块
顺序表模块
投票模块
排序模块
五、详细设计与实现
本程序分为五个模块
a、主程序模块:
实现对函数的调用;
b、顺序表模块:
实现选手信息存储;
c、投票模块 :
实现观众对选手的投票;
d、排序模块:
实现对选手成绩的排序;
e、文件保存模块:
实现对选手成绩的保存;
(1)分析:
为了实现上述程序功能,需要定义顺序表的抽象数据类型如下
1、存储类型的定义
参赛选手信息存储类型的定义:
typedefstructnode//结构体定义,命名一个新的类型名代表结构体类型
{
charname[9];//选手姓名
intnum;//选手编号
intscore;//选手得分
inttax;//选手名次
}ElemType;//新的类型名
2、函数的定义
1.函数Menu,用于进行菜单的显示和选号:
voidMeun()
2.函数Init_sq,为选手个数分配动态:
voidInit_sq(SeqList*L,intn)
3.函数Init,用于完成选手信息的输入:
voidInit(SeqList*L)
4.Vote函数用以实现投票的功能:
voidVote(SeqList*L)
5.希尔排序:
voidShellsort(SeqList*L)
6.Rank函数,用以计算选手名次:
voidRank(SeqList*L)
7.Display函数,用以输出最终结果:
voidDisplay(SeqList*L)
8.Save函数,实现文件的生成:
voidSave(SeqList*L)
(1)输入选手信息界面
(2)投票界面
(3)排序界面
(4)排序结果页面
(5)保留到文件的界面
经编译完成,此次设计程序已完成选手信息输入、投票、排序及保存到文件等功能
总结
电视大赛观众投票及排名系统是一个运用在各种电视节目中用来进行投票的一种较为智能的系统。
该系统用途广泛例如进行选手的投票和选手的观众的支持数量统计以及各种竞赛节目都能发挥作用。
本次设计的采用的是以C语言以及数据结构的知识在visualC++6.0的环境下进行编程。
通过模块化的方法将投票、排序、文档输出保存等功能进行一一实现。
最终程序能够较好的实现选手信息输入、投票、排序、结果保存输出txt文件等功能。
源代码:
#include
#include//动态存储分配函数头文件
#defineLIST_INIT_SIZE3//#define指令,指定用一个符号名称代表常量
#defineLIST_INCREMENT3
typedefstructnode//结构体定义,命名一个新的类型名代表结构体类型
{
charname[9];//选手姓名
intnum;//选手编号
intscore;//选手得分
inttax;//选手名次
}ElemType;//新的类型名
typedefstruct
{
ElemType*data;//定义结构体指针变量data,指向此结构体类型数据
intlen;
intlistsize;
}SeqList;//新的类型名
voidInit_sq(SeqList*L,intn)//定义函数Init_sq,为选手个数分配动态内存
{
L->data=(ElemType*)malloc(n*sizeof(ElemType));//用malloc函数分配动态内存
if(!
L->data)
exit
(1);//存储分配失败
L->len=n;//空表长度为0
L->listsize=n;//初始存储容量
}
voidInit(SeqList*L)//定义函数Init,用于完成选手信息的输入
{
ElemType*newbase;//定义结构体指针变量指向ElemType结构体类型数据
inti,n;
printf("请输入选手个数:
");
scanf("%d",&n);
Init_sq(L,n);
printf("请输入选手姓名和编号\n");
printf("姓名\t编号\t\n");
if(L->len>=L->listsize)
{
newbase=(ElemType*)realloc(L->data,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));//用ralloc函数重新分配动态空间
if(!
newbase)
exit
(1);//分配失败
L->data=newbase;
L->listsize+=LIST_INCREMENT;
}
for(i=1;i<=L->len;i++)//for循环输入选手信息
{
scanf("%s%d",L->data[i].name,&L->data[i].num);
L->data[i].score=L->data[i].tax=0;
}
}
voidVote(SeqList*L)//定义Vote函数用以实现投票的功能
{
inti,num;
printf("请输入您要为几号选手投票:
(0结束)\n");
do
{
scanf("%d",&num);
if(num<0||num>L->len)
{
printf("你输入的编号错误请重新输入(1--%d)\n",L->len);
continue;
}
else
for(i=1;i<=L->len;i++)
if(L->data[i].num==num)
L->data[i].score+=1;
}while(num!
=0);//for循环实现为某号选手投票使其得分增加
}
voidShellsort(SeqList*L)//希尔排序
{
inti,j;
intincrement=L->len;
do
{
increment=increment/3+1;//增量序列
for(i=increment+1;i<=L->len;i++)
{
if(L->data[i].score>L->data[i-increment].score)//需将L->r[i]插入有序增量子表
{
L->data[0]=L->data[i];//暂存在L->r[0]
for(j=i-increment;j>0&&L->data[0].score>L->data[j].score;j-=increment)
L->data[j+increment]=L->data[j];//记录后移,查找插入位置
L->data[j+increment]=L->data[0];//插入
}
}
}while(increment>1);
}
/*计算选手名次*/
voidRank(SeqList*L)//Rank函数,用以计算选手名次
{
inti;
L->data[1].tax=1;
for(i=2;i<=L->len;i++)
if(L->data[i-1].score==L->data[i].score)
L->data[i].tax=L->data[i-1].tax;
else
L->data[i].tax=L->data[i-1].tax+1;
printf("正在计算选手名次请稍后\n排序成功\n");
}
voidDisplay(SeqList*L)//定义Display函数,用以输出最终结果
{
inti;
printf("姓名\t编号\t票数\t名次\t\n");
for(i=1;i<=L->len;i++)
printf("%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax);
printf("\n");
}
voidSave(SeqList*L)//定义Save函数,实现文件的生成
{
FILE*fp;//定义一个指向文件的指针变量fp
inti;
charfilename[20];
printf("请输入目标文件名:
\n");
scanf("%s",filename);
fp=fopen(filename,"w");//建立新文件将fopen函数的返回值赋给指针
//变量fp,fp指向了名为filename的文件
fprintf(fp,"姓名\t编号\t票数\t名次\n");
for(i=1;i<=L->len;i++)
fprintf(fp,"%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax);
fclose(fp);
printf("数据已成功保存!
\n");
}
voidMeun()//Meun函数,生成系统主界面
{
printf("************电视大赛观众投票及排名系统*************\n");
printf("****1、输入选手信息(姓名、编号)****\n");
printf("****2、开始投票****\n");
printf("****3、排序****\n");
printf("****4、查看结果****\n");
printf("****5、保存到文件****\n");
printf("****6、退出****\n");
printf("***************************************************\n");
}
voidmain()//主函数
{
intsel;
SeqListL;
SeqListP;
while
(1)
{
Meun();
printf("\n请输入您要选择的操作序号,按回车键确认:
");
scanf("%d",&sel);
while(sel<1||sel>6)
{
printf("输入有误,请重新输入:
");
scanf("%d",&sel);
}
switch(sel)
{
case1:
Init(&L);break;
case2:
Vote(&L);break;
case3:
Shellsort(&L);Rank(&L);break;
case4:
Display(&L);break;
case5:
Save(&L);break;
case6:
printf("谢谢使用,再见!
\n");exit(0);
}
}
}