电视大赛观众投票及排名系统设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
课程设计名称:综合程序课程设计
课程设计题目:电视大赛观众投票及排名系统
学院名称:信息工程学院
专业:电子信息工程班级:
学号:姓名:
评分:教师:
20 14 年 2 月 20 日
电子信息工程专业课程设计任务书
20 13 -20 14 学年第 2 学期第 1 周- 2 周
题目电视大赛观众投票及排名系统
内容及要求
在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。
现在要求采用编写一程序模拟实现上述系统的功能
进度安排
周一、布置任务,查阅资料
周二、模块程序的分别设计
周三、对整个程序进行调试
周四、对程序代码进行优化
周五、设计结果的检查及报告的撰写
学生姓名:
指导时间第一周指导地点:综合楼506 室任务下达2014年 2 月 17 日任务完成2014 年 2 月 21 日
考核方式 1.评阅□ 2.答辩□ 3.实际操作□ 4.其它□指导教师系(部)主任
注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份
备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。
电视大赛观众投票及排名系统是一个运用在各种电视节目中用来进行投票的一种较为智能的系统。
该系统用途广泛例如进行选手的投票和选手的观众的支持数量统计以及各种竞赛节目都能发挥作用。
本次设计的采用的是以C语言以及数据结构的知识在visual C++ 6.0的环境下进行编程。
通过模块化的方法将投票、排序、文档输出保存等功能进行一一实现。
最终程序能够较好的实现选手信息输入、投票、排序、结果保存输出txt文件等功能。
关键词: C语言;数据结构;投票及排名系统;编译
第一章设计内容及要求 (3)
第二章程序设计方案 (4)
第三章程序具体分析与设计
3.1 基本思路 (5)
3.2 程序分析及其设计 (6)
3.3关键程序设计与分析 (7)
3.4程序预计实现结果 (8)
第四章方案的调试及测试结果与分析
4.1 调试过程中遇到的问题及解决方案 (9)
4.2 调试结果与分析 (9)
第五章课程设计分析总结与心得体会 (12)
附录 (13)
参考文献 (17)
第一章设计内容及要求
在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。
现在要求编写一程序模拟实现上述系统的功能
在该课程设计中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存放选手信息的顺序表。
将选手的编号和姓名依此存入顺序表单元中,观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志。
投票结束后进行排序,在此采用希尔排序,然后为每个选手计算名次,得票相同的名次也相同。
最终输出排名结果,并将结果保存到文件中。
第二章程序设计方案
2.1总体设计思路
本程序分为四个模块:
1.主程序模块:实现对函数的调用;
2.顺序表模块:实现对选手信息的存储;
3.投票模块:实现观众对选手的投票;
4.排序模块:实现对选手成绩的排序。
它们之间的关系为:主程序模块
顺序表模块
投票模块
排序模块
2.2详细设计方案
本程序分为五个模块
a、主程序模块:实现对函数的调用;
b、顺序表模块:实现选手信息存储;
c、投票模块:实现观众对选手的投票;
d、排序模块:实现对选手成绩的排序;
e、文件保存模块:实现对选手成绩的保存;
第三章程序具体分析及设计
3.1 基本思路
将输入的信息储存在顺序链表中,然后观众投票后对其累加票数,最后利用希尔排序对选手的得票进行从高到低地排序,显示名次的先后(包含并列名次),并对最终结果进行保存到文件。
3.2 程序分析及其设计
分析:为了实现上述程序功能,需要定义顺序表的抽象数据类型如下
1、存储类型的定义
参赛选手信息存储类型的定义:
typedef struct node //结构体定义,命名一个新的类型名代表结构体类型
{
char name[9]; // 选手姓名
int num; //选手编号
int score; // 选手得分
int tax; //选手名次
}ElemType; //新的类型名
2、函数的定义
1. 函数Menu, 用于进行菜单的显示和选号:void Meun()
2.函数Init_sq,为选手个数分配动态:void Init_sq(SeqList *L,int n)
3.函数Init,用于完成选手信息的输入:void Init(SeqList *L)
4. Vote函数用以实现投票的功能:void Vote(SeqList *L)
5.希尔排序:void Shellsort(SeqList *L)
6. Rank函数,用以计算选手名次:void Rank(SeqList *L)
7.Display函数,用以输出最终结果:void Display(SeqList *L)
8.Save函数,实现文件的生成:void Save(SeqList *L)
3.3 关键程序设计与分析(希尔排序)
本次程序设计的关键部分在于对选手投票结果的排序,对投票排序模块的代码分析如下:
本次程序设计采用希尔排序,取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
所有距离为dl的倍数的记录放在同一个组中。
先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
例如以关键字{20,95,33,21,55,44,61,91}为例:第一趟排序为:20, 44, 33, 21, 55, 95, 61, 91
第二趟排序为:20, 21, 33, 44, 55, 91, 61, 95
第三趟排序为:20, 21, 33, 44, 55, 61, 91, 95
其算法为:
void Shellsort(SeqList *L)
{
int i,j;
int increment=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);
}
void Rank(SeqList *L) /* 计算选手名次 */
{
int i;
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");
}
3.4程序预计实现结果
本程序在c++6.0中运行:
1.输入的形式和输入值的范围:由于本程序主要运用于观众投票以及选手信息的输入,所以输入的形式是数字及字符,范围不限;
2.输出的形式:根据观众投票情况输出排名情况
3.程序实现的功能:实现观众投票以及选手得分情况的排名
4.测试数据:
a.输入选手的个数以及每个选手的信息输入“4”“a s d f”
b.根据菜单输入选号“2”输出“1号a得分是0,排名是0;2号s 得分是0,排名是0;3号d得分是0,排名是0;4号f得分是0,排名是0;”
c.给选手投票,输入“1 2 3 3 3 3 4 3 2 2 1 0”。
d. 根据菜单输入选号“4”,输出排序结果及名次。
e.根据菜单驶入选号“5”,保存输出文件
f.根据菜单选号“6”,退出程序。
第四章方案的调试及测试结果与分析
4.1 调试过程
1、在刚开始编程的时候经常会碰到一些低级编写错误例如漏分号大括号不匹配等经过仔细修改已能正常运行;
2、本程序的模块划分简单而合理,在操作方面比较容易,运用顺序表来存储选手信息;
3、在程序完成后但由于输入选手姓名后不能根据名字长短自动判断自动判断对齐编号列表,后来经过老师指导并请教同学优化代码,在输入名字后按下TAB键就能自动对齐编号列表,程序更加人性化。
4、本实验程序设计中,将程序分为五个模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。
4.2 调试结果与分析
(1)输入选手信息界面
(2)投票界面
(3)排序界面
(4)排序结果页面
(5)保存到文件
(6)保留到文件的界面:
经编译完成,此次设计程序已完成选手信息输入、投票、排序及保存到文件等功能
第五章课程设计分析总结与心得体会
此次实习为期一周,时间虽然不多但是我学到了很多,也知道了很多的不足。
通过老师的精心指导带领下,我不仅获得了很多新知识,还好好复习了一下以前学的知识。
作为一个电子专业的学生,C语言是一门必须要熟练掌握的重要语言。
在这之前,我们已经对C语言这门课程学习了一个学期,对其有了一定的了解,但是更多的还是停留在学习了解的范围,对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。
C语言课堂上许多关于C语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。
然而要使用C语言这个工具解决实际问题,又必须掌握它。
通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握C语言的语法规定。
对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,更加巩固了学过的知识,而且在设计的时候学要系统的知识,也是一个较大的挑战,某一方面知识的欠缺都将影响到整个程序的设计。
我所编的虽然只是一个小程序,但是每一步的编的过程,让我懂得很多。
重温一下C语言,因为过了计算机二级,因而编程比较容易懂,但是通过练习,发现理论与实际的差距。
编程从一开始全部编到一个main函数中到,最后逐个分块,到添加功能,到最后的进行代码的优化,使程序的可用性和智能性都有进一步的提高,一点一点的进步让我很欣喜,对编程的兴趣也更加浓厚。
此次实习,不仅了有关c语言的知识,还掌握了一些现实中编程的一些小技巧,实际的编程能力也得到了历练,本次课程设计是很好的一次锻炼机会!
附录程序源代码
#include <stdio.h>
#include <stdlib.h> //动态存储分配函数头文件
#define LIST_INIT_SIZE 3 //#define指令,指定用一个符号名称代表常量#define LIST_INCREMENT 3
typedef struct node //结构体定义,命名一个新的类型名代表结构体类型{
char name[9]; // 选手姓名
int num; //选手编号
int score; // 选手得分
int tax; //选手名次
}ElemType; //新的类型名
typedef struct
{
ElemType *data; //定义结构体指针变量data,指向此结构体类型数据
int len;
int listsize;
}SeqList; //新的类型名
void Init_sq(SeqList *L,int n) //定义函数Init_sq,为选手个数分配动态内存
{
L->data=(ElemType*)malloc(n*sizeof(ElemType)); //用malloc函数分配动态内存
if(!L->data)
exit(1); //存储分配失败
L->len = n; //空表长度为0
L->listsize = n; //初始存储容量
}
void Init(SeqList *L) //定义函数Init,用于完成选手信息的输入
{
ElemType *newbase; //定义结构体指针变量指向ElemType结构体类型数据 int i,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)*s izeof(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;
}
}
void Vote(SeqList *L) //定义Vote函数用以实现投票的功能
{
int i,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循环实现为某号选手投票使其得分增加
}
void Shellsort(SeqList *L) //希尔排序
{
int i,j;
int increment=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);
}
/* 计算选手名次 */
void Rank(SeqList *L) // Rank函数,用以计算选手名次
{
int i;
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");
}
void Display(SeqList *L) //定义Display函数,用以输出最终结果
{
int i;
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->dat a[i].score,L->data[i].tax);
printf("\n");
}
void Save(SeqList *L) //定义Save函数,实现文件的生成
{
FILE *fp; //定义一个指向文件的指针变量fp
int i;
char filename[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");
}
void Meun() //Meun函数,生成系统主界面
{
printf("************电视大赛观众投票及排名系统*************\n"); printf("**** 1、输入选手信息(姓名、编号) ****\n"); printf("**** 2、开始投票 ****\n"); printf("**** 3、排序 ****\n"); printf("**** 4、查看结果 ****\n");
printf("**** 5、保存到文件 ****\n"); printf("**** 6、退出 ****\n"); printf("***************************************************\n"); }
void main() //主函数
{
int sel;
SeqList L;
SeqList P;
while(1)
{
Meun();
printf("\n 请输入您要选择的操作序号,按回车键确认:");
scanf("%d",&sel);
while(sel<1||sel>6)
{
printf("输入有误,请重新输入:");
scanf("%d",&sel);
}
switch(sel)
{
case 1:Init(&L);break;
case 2:Vote(&L);break;
case 3:Shellsort(&L); Rank(&L);break;
case 4:Display(&L);break;
case 5:Save(&L);break;
case 6: printf("谢谢使用,再见!\n"); exit(0);
}
}
}
参考文献
[1].谭浩强.C程序设计(第4版).清华大学出版社, 2010.6
[2].严蔚敏吴伟民. 数据结构(C语言版).清华大学出版社, 2012。