歌手比赛系统课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机学院信息管理与信息系统专业
《程序设计综合课程设计》报告
(2010/2011 学年第一学期)
学生姓名:
学生班级: 1
学生学号:
指导教师:
2011 年 1 月 7 日
目录Ⅰ
第一章课程设计的目的和要求 ........................... 错误! 未指定书签。

1.1 课程设计的目的 .............................. 错误! 未指定书签。

1.2 课程设计的目标 .............................. 错误! 未指定书签。

1.3 课程设计要求 ................................ 错误! 未指定书签。

第二章课程设计任务内容 ................................ 错误! 未指定书签。

2.1 课程设计题目 (3)
2.2 背景 ....................................... 错误! 未指定书签。

2.3 功能需求 .................................... 错误! 不决义书签。

2.4 系统模块图 (4)
第三章详尽设计说明 .................................... 错误! 未指定书签。

3.1 主函数的流程图 ............................. 错误! 未指定书签。

3.2 输入歌手数据 ............................... 错误! 未指定书签。

3.3 查问歌手数据 ............................... 错误! 未指定书签。

3.4 编码与调试 (8)
第四章软件使用说明及运转结果 .......................... 错误! 未指定书签。

4.1 使用说明 .................................... 错误! 未指定书签。

4.2 运转结果 ................................... 错误! 未指定书签。

第五章课程设计心得与领会 .............................. 错误! 未指定书签。

附录 1:参照文件 ....................................... 错误! 未指定书签。

附录 2:程序清单 ....................................... 错误! 未指定书签。

歌手竞赛系统
第一章课程设计的目的和要求
1.1 课程设计的目的
C++语言课程设计的主要目的是培育学生综合运用 C++程序设计课程所学到的知
识,编写 C++程序解决实质问题的能力,以及谨慎的工作态度和优秀的程序设计习惯。

经过课程设计的训练,学生应当能够认识程序设计的基本开发过程,掌握编写、
调试和测试 C++语言程序的基本技巧,充足理解构造化程序设计的基本方法。

C++语言程序设计的主要任务时要修业生依据软件开发过程的基本规范,运用结
构化程序设计的方法,依据课程设计的题目要求,剖析、设计、编写、调试和测试
C++语言程序及编写设计报告。

本次课程设计是经过设计一个较为简单的“歌手竞赛系统” , 进一步熟习 C++中
有关各样知识的运用与掌握。

认识系统开发的需求剖析、模块剖析、程序流程图、编
码测试、模块组装与整体调试的全过程,加深对 C++的理解与 Visual C++环境的使用;逐渐熟习程序设计的方法,并养成优秀的编程习惯,进一步培育完美的 C++编程设计
思想,为此后进行软件编程、数据库管理等深入学习打下一个坚固基础
1.2 课程设计的目标
本课程设计的目标:
1. 稳固和加深学生对 C++语言课程的基本知识的理解和掌握;
2. 掌握 C++语言编程和程序调试的基本技术;
3. 掌握利用 C++语言进行软件设计的方法;
4. 提升书写程序设计说明文档的能力;
5. 提升运用 C++语言解决实质问题的能力。

1.3 课程设计要求
基本要求:
1. 题目:设计一个“歌手竞赛系统”软件;
2. 认识该系统软件开发的有关背景;
3. 参照有关书本学习课程设计的基本知识;
4. 清楚所开发系统软件的各个有关功能,以便顺利开发系统软件;
5. 对系统功能模块进行剖析,写出设计说明文档;
6. 设计达成的软件要便于操作和使用;
7. 对自己所设计的程序进行调试,其实不停完美;
8. 在设计过程中娴熟掌握软件编程的有关知识;
9. 详尽领会并记录有关过程,并将心得领会写在课程设计报告中;
10. 设计达成后提交课程设计报告。

第二章课程设计任务内容
2.1 课程设计题目
歌手竞赛系统。

2.2 背景
时下,不论是社会上某些场合仍是校园内,常常举行一些歌手演唱竞赛,一般不会再像以前那样用笔录录竞赛的状况,歌手竞赛系统由此产生。

它几乎包含了全部应有的功能,歌手信息的输入,评委打分,成绩排序等功能无奇不有,省去了好多麻烦的环节,完整能够知足一次歌手竞赛的需求。

开发此系统只为方便一般的歌手竞赛。

2.3 功能需求
用 C++实现歌手竞赛系统。

该系统主要有以下功能:
1、系统以菜单方式工作;
2、歌手数据录入功能(歌手数据用文件保留) -- 输入;
3、歌手成绩(评委打分)录入功能—输入:按输当选手的次序对其分别打
分,输入每个评委的评分,对一个选手打完分以后,显示其总分和均匀分;
4、计算总成绩和均匀成绩(去掉一个最高分和一个最低分);
5、歌手成绩排序(按均匀分):对选手按均匀分进行排序,输出选手的姓名、
编号、总分和均匀分;
6、歌手成绩查问功能—算法;
按编号查问:输入编号,假如存在,输出选手的数据,不存在,输出“信息不存在”。

按姓名查问:输当选手姓名,存在,则输出选手数据,不存在,则输出“信息不存在”;
7、追加选手数据(包含歌手姓名和编号):假如增添的选手已经存在,则
不可以插入,不存在,则输出“成功插入”。

8、写入数据文件:将输入的信息进行保留,保留到自己所写的文件中。

2.4 系统模块图
以下是歌手管理系统的模块图:
歌手比赛系统课程设计报告
歌手管理系统
创评成数追写退
建委绩据加入出
歌打排查选数系
手分序询手据统
信数文
息据件
图 2-1 系统模块图
第三章详尽设计说明3.1 主函数的流程图
开始
输入选手
成绩输入
能否继
Y
续输入
N
成绩排序
查问选手数追加选手数
结束
图 3-1 主函数流程图
3.2 输入歌手数据
输入函数:刷新此前的显示界面,而后输入在履行上步操作后的显示界面Singer *create() 包含的参数有:选手姓名 string name; 编号 long num 。

开始
输入歌手编号、姓名
Y
该信息能否
增添错误
N
增添到文件
结束
图 3-2 输入函数流程图
3.3 查问歌手数据
查问函数:刷新此前的显示界面,而后查问在履行上步操作后的显示界面
按姓名查问: void inquire(); 参数:姓名 string name
按编号查问: void inquire() 。

参数:编号 long num
开始
输入歌手编号或姓

N
能否存在
Y
显示所查问歌手数
结束
图 3-3 查问函数流程图
3.4 编码与调试
此程序包含六个函数:main() ;Singer *create() ;void print() ;Singer *insert() ;void save() ;void menu() ;void grade();void rank(); void welcome() ;void inquire() ; Singer *import() ;
此中:
main() 为主函数,可输出开机界面;
void menu() 功能选择界面,按提示可供给有关服务;
Singer *create() 创立歌手信息表,输当选手有关数据;
void print() 输出函数,输出选手的有关数据;
Singer *insert() 插入函数,插入新的选手的数据;
void save() 写入数据文件的函数,将选手的数据保留到文件夹中;
void grade() 评委打分函数,输入评委所打的分数;
void rank() 成绩排序函数,对选手按均匀分进行排序,并输出最后结果;
void welcome() 该函数的作用是清空屏幕;
Singer *import() 文件导入函数,从某文件把选手信息导入系统。

第四章软件使用说明及运转结果
4.1 使用说明
该程序能够实现对选手有关信息查找的功能,安装 VisualC++6.0 英文版后,在
工具栏“file ”中单击“new”选项,单击“ files ”菜单,选择“ C++Source file ”
输入文件名“歌手竞赛系统”。

开始输入程序,程序输入达成,单击“build ”工具栏,选择“build[ 歌手竞赛系统 .cpp1] ”, 待程序无误后,开始履行程序。

依据数据构造、函数功能和主要的流程图,进行录入源代码操作。

在编码时,注意代码的书写规范,包含命名老例、说明、分开和缩进等,这样使程序
层析清楚,加强可读性和可保护性。

编码操作达成后,先静态检查一下有没有语法错误,而后进行编译,更深一步检
查语法错误。

待编译经过时,运转程序,察看能否能够正常运转,假如有问题,再去
改正源程序,直至达到了预期的成效。

4.2 运转结果
1、初始界面,供给功能选择,输入相应数字或字母。

图 4-1 程序截图一
2、选择 1,输当选手信息,包含姓名和编号(编号一定是阿拉伯数字)。

图 4-2 程序截图二
3、评委打分界面,会挨次提示输入每个评委所打的分数(分数一定是 0 到 100 以内
的数),输入完成,显示选手的总分和均匀分,也就是最后得分。

图 4-3 程序截图三
4、成绩排序界面,输当选择“ 4”,输出排序的结果,显示有选手的编号、姓名、总
分和均匀分,排序是按均匀分。

图 4-4 程序截图四
5、下边是查问界面,可按姓名或许编号查问,输出选手信息。

图 4-5 程序截图五
6、追加选手数据,输入新增选手的姓名和编号。

图 4-6 程序截图六
7、写入数据文件,保留信息到自己成立的文件内。

图 4-7 程序截图七
第五章课程设计心得与领会
课程设计刚开始的时候,我真的感觉到无从下手。

由于已经过去一个学期了,期间又没有怎么看书,大一的时候学的 c++,可是基本上已经忘光了,并且那时候学的
不深,假如单单写一个比较的小的程序还能够,大程序基本写不了。

当老师把题目发给我们以后,刚开始是束手无策,可是短时间内就已经觉悟,从头对题目剖析了一遍,认识了一下要用到哪方面的知识,而后着手去看书,从头熟习一下以前的知识。

而后去图书室借了一些对于数据构造和 c++的书。

看过那些书以后,信心增添了许多,对
接下来的程序编译有很大帮助。

经过这三周的课程设计,我独立达成了一个较大的 C++语言程序的设计,并仔细
达成了课程设计报告。

回想这三周的时间,我收获很大。

第一,我娴熟地运用了所学的知识编写程序,
并成功的达成,感觉成就感很强,这大大激发了我编程的兴趣;其次,在设计的过程
中碰到了一些困难,我会仔细的去思虑,或许充足利用网络资源来追求帮助,提升获守信息的能力。

课程设计时期,我有向老师和同学追求帮助,在沟通中共同进步。

最后,我认识了软件开发的大概过程及各个步骤,这对未来的学习和工作是很有帮助的。

对于信管专业的大学生来说,累积实战经验是一项极其重要的内容,很可能成为未来就业的叩门砖。

而程序设计综合课程设计就是累积实战经验的一个过程,固然程序的规模其实不大,但能够让我们尽早地认识软件开发的重要性和必需性,为未来的就业打下坚固的基础。

经过两个礼拜的上机实践学习,使我对 C++语言有了更进一步的认识和认识,要
想学好它要重在实践,要经过不停的上机操作才能更好地学习它,经过实践,我也发现我的好多不足之处,第一是自己编程马马虎虎,常常犯错,经过学习也有所改良;
再有对 C++语言的一些标准函数不太认识,还有对函数调用的正确使用不够熟习,以
及对 C++语言中常常出现的错误也不认识,经过实践,使我在这几个方面的认识有所
提升。

此次的课程设让我认识到好多 C++的内在因素:
1. 程序设计语言是程序设计的工具。

这是我经过两周课程设计深深领会的一点,并且发现假如想有效的进行程序设计,正确地应用程序设计语言表达算法,一定正确的运用程序设计语言,掌握其语法知识。

2. 学习程序设计一定重视时间环节,多读程序,多编写程序,多上机实践。


次的课程设计就使得讲堂教课、式样和实践之间的关系更加密切。

对我的学习有着很深远的影响。

3. 我发现作为一个程序设计人员,需要掌握面向过程的程序设计,也要掌握面
向对象的程序设计。

以前,人们经过 C++语言学习面向过程的程序设计,再经过 C++
学习面向对象的程序设计。

其实 C++其实不是纯粹的面向对象的语言,它是一种混淆语言。

学习 C++既能够编写面向过程的程序,也能够编写面向对象的程序。

这一点是我
经过可课程设计所的实践发现的。

4. 深切的感觉到了 C++语法的复杂,内容的众多。

发现假如对它缺少系统的了
解,将难以真实的运用,编出来的程序错误百出。

附录 1:参照文件
[1] 谭浩强编著: C++程序设计,北京:清华大学第一版社, 2004
[2] 杨秀金编著:数据构造( c++版),北京:人民邮电第一版社,
[3] 湛为芳编著: C++程序设计技术习题解答和实验指导,北京:清华大学第一版社,
[4] 伍俊良编著 :Visual C++6.0 课程设计与系统开发事例 . 北京:清华大学第一版社,
[5] 、(美)戴特尔( Deitel,H.M. )等编著,张引等译: C++大学基础教程(第五版),北京:电子工业第一版社,
附录 2:程序清单
以下是歌手竞赛系统的源代码:
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
#define NULL 0
int n=0; // 链表节点数
bool formExist=false; // 原有链表能否存在
struct Singer
{
string name;
long num;
int sum;
int mark[10];
float average;
Singer *next;
};
// 创立链表
Singer *create();
// 打印信息
void print(Singer *pt);
// 插入节点
Singer *insert(Singer *head,Singer *sin); // 保留到文件
void save(Singer *head,char filename[]); // 菜单
void menu();
// 评委打分
void grade(Singer *head,int mark[]);
// 成绩排序
void rank(Singer *&head);
// 欢迎
void welcome();
// 按姓名查问
void inquire(Singer *head,string name); // 按编号查问
void inquire(Singer *head,long num);
// 从文件导入
Singer *import(char filename[],Singer *head); int main()
{
Singer *head=NULL;
Singer newsin;
string name;
void grade(Singer *);
ifstream infile;
char filename[20];
long num;
char choose;
bool quit=false;
char c;
welcome();
while(true)
{
menu();
cin>>choose;
switch(choose)
{
case '1':
if (formExist)
{
cout<<" 您要创立新的链表,原有链表将丢掉,能否持续?(Y/N)";
cin>>c;
if (!(c=='y'||c=='Y'))
continue;
else
{
n=0;
head=create();
system("pause");
break;
}
}else
{
head=create();
system("pause");
break;
}
case '2':
cout<<" 请输入文件名: ";
cin>>filename;
head=import(filename,head);
system("pause");
break;
case '3':
grade(head);
system("pause");
break;
case '4':
cout<<" 成绩排序结果为: "<<endl;
rank(head);
system("pause");
break;
case '5':
print(head);
system("pause");
break;
case '6':
cout<<" 请输入姓名: "<<endl;
cin>>name;
inquire(head,name);
system("pause");
break;
case '7':
cout<<" 请输入编号: "<<endl;
cin>>num;
inquire(head,num);
system("pause");
break;
case '8':
cout<<" 请输入新增选手的姓名、编号: "<<endl;
cin>>;
cin>>newsin.num;
head=insert(head,&newsin);
system("pause");
break;
case 'k':
cout<<" 请输入文件名: ";
cin>>filename;
save(head,filename);
system("pause");
break;
case 'c':
system("cls");
welcome();
歌手比赛系统课程设计报告
break;
case 'q':
quit=true;
break;
default:
cout<<" 输入错误 !"<<endl;
}
if (quit)
break;
}
// 退出时提示保留
cout<<" 您想保留这些信息吗 ? (Y/N)";
cin>>c;
if (c=='y' || c=='Y')
{
cout<<" 请输入文件名: ";
cin>>filename;
save(head,filename);
}
return 0;
}
// 欢迎界面
void welcome()
{
cout<<"***************************************"<<endl <<" 欢迎使用歌手竞赛管理系统! "<<endl
<<"制作人: 黄光明时间:2010-12-29"<<endl
<<"***************************************"<<endl<<endl; }
// 菜单
void menu()
{
cout<<setiosflags(ios::left);
cout<<"\n\n 您要做什么 ?"<<endl
<<setw(20)<<"1. 创立选手信息表 "
<<setw(20)<<"2. 从文件导入信息表 "<<endl
<<setw(20)<<"3. 评委打分 "
<<setw(20)<<"4. 成绩排序 "<<endl
<<setw(20)<<"5. 打印全部的信息 "
<<setw(20)<<"6. 按姓名查问 "<<endl
<<setw(20)<<"7. 按编号查问 "
<<setw(20)<<"8. 追加选手数据 "<<endl
<<setw(20)<<"k. 保留信息表到文件 "
<<setw(20)<<"q. 退出"<<endl<<endl
<<"输入您的选择 :";
}
// 创立链表
Singer *create()
{
bool error=false;
formExist=true;
Singer *p1,*p2,*head;
head=NULL;
p1=head;
while(true)
{
p2=p1;
p1=new Singer;
cout<<" 请输当选手的姓名 :( 输 0 结束)";
cin>>p1->name;
if (p1->name=="0")
break;
cout<<" 编号:";
cin>>p1->num;
if (n==1)
{
head=p1;
p1->next=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
}
}
cout<<" 输入结束! "<<endl;
return head;
}
// 输出信息
void print(Singer *head)
{
Singer *p=head;
if(p!=NULL)
{
cout<<setw(15)<<" 姓名"<<setw(10)<<" 编号"<<endl;
{
cout<<setw(15)<<p->name<<setw(10)<<p->num<<endl;
p=p->next;
}while(p!=NULL);
cout<<" 共计选手 "<<n<<" 人。

"<<endl;
}
else
cout<<" 没有信息! "<<endl;
}
// 评委打分
void grade(Singer *head)
{
Singer *p;
p=head;
if (p!=NULL)
{
do
{
int i, max, min;
int sum=0;
max = -1;
cout <<" 请输入 "<<p->num<<" 号选手"<<p->name<<"的得分 \n\n";
for (i=0; i<10; i++)
{
cout <<" 第"<<i+1<<" 个评委的评分 :";
cin>>p->mark[i];
if(p->mark[i]>max)
max=p->mark[i];
if(p->mark[i]<min)
min=p->mark[i];
sum+=p->mark[i];
}
p->sum=sum;
p->average = (p->sum-max-min)/8.0;
cout<<" 总分"<<p->sum<<" 均匀分 :"<<p->average<< endl;
p = p->next;
}while(p!= NULL);
}
else
cout<<"\n 全部选手的评分输入完成 .\n";
system("pause");
}
void rank(Singer *&head)
{
///////////////// 冒泡法排序 ///////////////////////////// //p = head;
int cc;
Singer *p,*q,*tail,*h;
if(!head)
return;
tail=NULL;
h = new Singer;
h->next = head;
//h = head;
while(h->next!=tail)
{
p=h;
q=p->next;
while(q->next!=tail)
{
//swap
if (p->next->average < q->next->average)
{
q->next=q->next->next;
p->next->next=q;
p=p->next;
}
else{
//next step
q=q->next;
p=p->next;
}
}
//tail is the element bubble out //since we use single link
tail=q;
}
/*
do// 求出选手的的人数
{
p = p->next;
n++;
}while(p->next != NULL);
Singer *temp = head->next;
for(i=0; i<n-1; i++)
{
if(head->average < temp->average)
{
prev->next = temp->next;
temp->next = head;
head = temp;
}
}
/*
for(i=1; i<n; i++)// 冒泡法排序
{
p1 = head;
p2 = head->next->next;
for(j=0; j<n-i; j++)
{
if(p1->next[i].average <= p2->average)// 知足条件互换数据地点
{
p1->next->next = p2->next;
p2->next = p1->next;
p2 = p2->next;
}//if
p1 = p1->next;
p2 = p2->next;
}//for
}//for
*/
///////////////////// 输出排序后数据
////////////////////////////////
head = p->next;
p = h->next;
cout <<setw(10)<<" 编号 "<<setw(10)<<" 姓名 "<<setw(10)<<" 总分"<<setw(15)<<" 均匀分 "<<endl;
do
{
cout <<setw(10)<<p->num<<
setw(10)<<p->name<<setw(10)<<p->sum<<setw(15)<<p->average<<endl;
p = p->next;
}while(p != NULL);
system("pause");
}
Singer *insert(Singer *head,Singer *sin)
{
Singer *p0,*p1;
p1=head;
p0=sin;
if (head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while(p1->next!=NULL)
{
if (p0->num==p1->num)
{
cout<<" 编号为"<<p0->num<<"的选手已存在 !"<<endl;
return head;
}
p1=p1->next;
}
p0->next=NULL;
n++;
}
cout<<" 成功插入信息 !"<<endl;
return head;
}
// 保留到文件
void save(Singer *head,char filename[])
{
Singer *p=head;
bool flag=false;
if (head==NULL)
{
cout<<" 没有能够保留的信息 !"<<endl;
return;
}
else
{
fstream outfile(filename,ios::out);
if (!outfile)
{
cout<<" 翻开数据文件犯错 !"<<endl;
return;
}
do
{
if(flag)
outfile<<endl;
outfile<<p->name<<"\t"<<p->num<<'\t'<<p->mark;
flag=true;
p=p->next;
}while(p!=NULL);
outfile.close();
cout<<" 保留成功 ! 保留到 "<<filename<<endl;
}
}
// 按姓名查问
void inquire(Singer *head,string name)
{
bool flag=true;
Singer *p=head;
int total=0;
if (p==NULL)
{
cout<<" 信息为空 !"<<endl;
return;
}
do
{
if(p->name==name)
{
if (flag)
{
cout<<" 姓名为"<<name<<"的选手有: "<<endl;
cout<<setw(15)<<" 姓名 "<<setw(10)<<" 编号 "<<setw(7)<<" 成绩"<<endl;
flag=false;
}
cout<<setw(15)<<p->name<<setw(10)<<p->num<<setw(7)<<p->average<< endl;
total++;
}
p=p->next;
}while(p!=NULL);
cout<<" 已查问到 "<<total<<" 条记录。

"<<endl;
}
// 按编号查问
void inquire(Singer *head,long num)
{
bool flag=true;
Singer *p=head;
if (p==NULL)
{
cout<<" 信息为空 !"<<endl;
return;
}
do
{
if(p->num==num)
{
if (flag)
{
cout<<" 编号是"<<num<<"的选手是: "<<endl;
cout<<setw(15)<<" 姓名"<<setw(7)<<" 成绩"<<endl;
flag=false;
}
cout<<setw(15)<<p->name<<setw(7)<<p->average<<endl;
return;
}
p=p->next;
}while(p!=NULL);
cout<<" 查无这人 !"<<endl;
}
// 从文件导入
Singer *import(char filename[],Singer *head) {
ifstream infile;
infile.open(filename,ios::in);
if(!infile)
{
cout<<" 翻开文件失败 !"<<endl;
return head;
}
head=NULL;
n=0;
Singer *p1;
Singer *p;
while(!infile.eof())
{
p=new Singer;
if(n>=1)
p1->next=p;
infile>>p->name>>p->num;
p->next=NULL;
if (n==0)
head=p;
p1=p;
n++;
}
infile.close();
cout<<" 导入成功! "<<endl;
return head;
}。

相关文档
最新文档