歌手比赛系统课程设计报
告
Written by Peter at 2021 in January
计算机学院信息管理与信息系统专业
《程序设计综合课程设计》报告
(2010/2011学年第一学期)
学生姓名:
学生班级: 1
学生学号:
指导教师:
2011年1月7日
目录Ⅰ
3
...............................................................4
...............................................................8
歌手比赛系统
第一章课程设计的目的和要求
1.1课程设计的目的
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.对系统功能模块进行分析,写出设计说明文档;
8.在设计过程中熟练掌握软件编程的相关知识;
9.详细体会并记录相关过程,并将心得体会写在课程设计报告中;
10.设计完成后提交课程设计报告。
第二章课程设计任务内容2.1课程设计题目
歌手比赛系统。
2.2背景
时下,无论是社会上某些场合还是校园内,经常举行一些歌手演唱比赛,一
般不会再像以前那样用笔记录比赛的情况,歌手比赛系统由此产生。它几乎包含了一切应有的功能,歌手信息的输入,评委打分,成绩排序等功能应有尽有,省去了很多麻烦的环节,完全可以满足一次歌手比赛的需求。开发此系统只为方便一般的歌手比赛。
2.3功能需求
用C++实现歌手比赛系统。该系统主要有以下功能:
1、 系统以菜单方式工作;
2、 歌手数据录入功能(歌手数据用文件保存)--输入;
3、 歌手成绩(评委打分)录入功能—
输入:按输入选手的顺序对其分别打分,输入每个评委的评分,对一个 选手打完分之后,显示其总分和平均分;
手的姓名、编号、总分和平均分;
6、 歌手成绩查询功能—算法;
按编号查询:输入编号,如果存在,输出选手的数据,不存在, 输出“信息不存在”。
按姓名查询:输入选手姓名,存在,则输出选手数据,不存在,则输出“信息不存在”;
7、
追加选手数据(包括歌手姓名和编号):如果添加的选手已经存在, 则不能插入,不存在,则输出“成功插入”。
8、
写入数据文件:将输入的信息进行保存,保存到自己所写的文件中。
2.4系统模块图
以下是歌手管理系统的模块图:
歌手管理系统
创 | 评 | 成 | 数 | 追 | 写 | 退 |
建 委 绩 据 加 入 出
歌 打 数 系
息 据 件
图2-1系统模块图
第三章详细设计说明
3.1主函数的流程图
开始
输入选手
数据
成绩输入
是否继 | Y |
续输入
N
成绩排序
结束
图3-1主函数流程图
3.2输入歌手数据
输入函数:刷新此前的显示界面,然后输入在执行上步操作后的显示界面Singer*create() 包含的参数有:选手姓名stringname;编号longnum。
开始
输入歌手编号、姓
名
该信息是否 | Y | 添加错误 |
存在
添加到文件
结束
图3-2输入函数流程图
3.3查询歌手数据
查询函数:刷新此前的显示界面,然后查询在执行上步操作后的显示界面按姓名查询:voidinquire(); 参数:姓名 stringname
按编号查询:voidinquire()。参数:编号longnum
开始
输入歌手编号或姓
名
是否存在N
Y
据
显示所查询歌手数
图3-3 查询函数流程图
3.4编码与调试
此程序包含六个函数:main();Singer*create();void print();Singer *insert(); voidsave();void menu();voidgrade();void rank();
void welcome();voidinquire(); Singer*import();
其中:
main()为主函数,可输出开机界面;
voidmenu()功能选择界面,按提示可提供相关服务;
Singer*create()创建歌手信息表,输入选手相关数据;
voidprint()输出函数,输出选手的相关数据;
Singer*insert()插入函数,插入新的选手的数据;
voidsave()写入数据文件的函数,将选手的数据保存到文件夹中;voidgrade()评委打分函数,输入评委所打的分数;
voidrank()成绩排序函数,对选手按平均分进行排序,并输出最终结果;voidwelcome()该函数的作用是清空屏幕;
Singer*import()文件导入函数,从某文件把选手信息导入系统。
第四章软件使用说明及运行结果
4.1使用说明
该程序可以实现对选手有关信息查找的功能,安装VisualC++6.0英文版后,在工具栏“file”中单击“new”选项,单击“files”菜单,选择“C++
Source
“build”工具栏,选择“build[歌手比赛系统.cpp1]”,待程序无误后,开始执行程序。
根据数据结构、函数功能和主要的流程图,进行录入源代码操作。
在编码时,注意代码的书写规范,包括命名惯例、注释、分隔和缩进等,这样使程序层析清晰,增强可读性和可维护性。
编码操作完成后,先静态检查一下有没有语法错误,然后进行编译,更深一步检查语法错误。待编译通过时,运行程序,观察是否能够正常运行,如果有问题,再去修改源程序,直至达到了预期的效果。
4.2 运行结果
1、初始界面,提供功能选择,输入相应数字或字母。
图4-1程序截图一
2、选择1,输入选手信息,包括姓名和编号(编号必须是阿拉伯数字)。
图4-2程序截图二
3、评委打分界面,会依次提醒输入每个评委所打的分数(分数必须是0到100之内的数),输入完毕,显示选手的总分和平均分,也就是最终得分。
图4-3程序截图三
4、成绩排序界面,输入选择“4”,输出排序的结果,显示有选手的编号、姓名、总分和平均分,排序是按平均分。
图4-4程序截图四
5、下面是查询界面,可按姓名或者编号查询,输出选手信息。
图4-6程序截图六
7、写入数据文件,保存信息到自己建立的文件内。
图4-7 程序截图七
第五章课程设计心得与体会
课程设计刚开始的时候,我真的感觉到无从下手。因为已经过去一个学期了,期间又没有怎么看书,大一的时候学的c++,不过基本上已经忘光了,而且那时候学的不深,如果单单写一个比较的小的程序还可以,大程序基本写不了。当老师把题目发给我们之后,刚开始是一筹莫展,不过短时间内就 已经觉醒,重新对题目分析了一遍,了解了一下要用到哪方面的知识,然后
着手去看书,重新熟悉一下以前的知识。然后去图书馆借了一些关于数据结构和c++的书。看过那些书之后,信心增加了不少,对接下来的程序编译有很大帮助。
通过这三周的课程设计,我独立完成了一个较大的C++语言程序的设计,并认真完成了课程设计报告。
回忆这三周的时间,我收获很大。首先,我熟练地运用了所学的知识编写程序,并成功的完成,感觉成就感很强,这大大激发了我编程的兴趣;其次,在设计的过程中遇到了一些困难,我会认真的去思考,或者充分利用网络资源来寻求帮助,提高获取信息的能力。课程设计期间,我有向老师和同学寻求帮助,在交流中共同进步。最后,我了解了软件开发的大体过程及各个步骤,这对将来的学习和工作是很有帮助的。
一个过程,虽然程序的规模并不大,但能够让我们尽早地认识软件开发的重要性和必要性,为将来的就业打下坚实的基础。
经过两个星期的上机实践学习,使我对C++语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己编程粗心大意,经常出错,通过学习也有所改进;再有对C++语言的一些标准函数不太了解,还有对函数调用的正确使用不够熟悉,以及对C++语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。这次的课程设让我认识到很多C ++的内在要素:
1.程序设计语言是程序设计的工具。这是我通过两周课程设计深深体会的一点,并且发现如果想有效的进行程序设计,正确地应用程序设计语言表达算法,必须准确的运用程序设计语言,掌握其语法知识。
2.学习程序设计必须重视时间环节,多读程序,多编写程序,多上机实践。这次的课程设计就使得课堂教学、式样和实践之间的关系更为紧密。对我的学习有着很深远的影响。
3.我发现作为一个程序设计人员,需要掌握面向过程的程序设计,也要掌握面向对象的程序设计。从前,人们通过C++语言学习面向过程的程序设计,再通过C++学习面向对象的程序设计。其实C++并不是纯粹的面向对象的语言,它是一种混合语言。学习C++既可以编写面向过程的程序,也可以编写面向对象的程序。这一点是我通过可课程设计所的实践发现的。
,将难以真正的运用,编出来的程序错误百出。
附录1:参考文献
[1]谭浩强编着:C++程序设计,北京:清华大学出版社,2004
[2]杨秀金编着:数据结构(c++版),北京:人民邮电出版社,2009.4[3]湛为芳编着:C++程序设计技术习题解答和实验指导,北京:清华大学出版社,2009.10
[4] 伍俊良编着:Visual
C++6.0课程设计与系统开发案例.北京:清华大学出版社,2002.11
[5]、(美)戴特尔(Deitel,H.M.)等编着,张引等译:C++大学基础教程(第五版),北京:电子工业出版社,2006.6
附录2:程序清单
以下是歌手比赛系统的源代码:
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
#defineNULL 0
int n=0; //链表节点数
{
string name;
long num;
int sum;
intmark[10];
float average;
Singer *next;
}; |
|
Singer *create();
//打印信息
voidprint(Singer *pt);
//插入节点
Singer*insert(Singer *head,Singer *sin);
//保存到文件
voidsave(Singer *head,char filename[]);
//菜单
voidmenu();
//评委打分
voidgrade(Singer *head,int mark[]);
//欢迎
voidwelcome();
//按姓名查询
voidinquire(Singer *head,string name);
//按编号查询
voidinquire(Singer *head,long num);
//从文件导入
Singer *import(char filename[],Singer *head); int main()
{
Singer *head=NULL;
Singer newsin;
string name;
void grade(Singer *);
ifstream infile;
charfilename[20];
long num;
char choose;
boolquit=false;
char c;
{
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");
{
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;
system("pause");
break;
case '6':
cout<<"请输入姓名:"<<endl;
cin>>name;
inquire(head,name);
system("pause");
break; |
|
cout<<"请输入编号:"<<endl;
cin>>num;
inquire(head,num);
system("pause");
break;
case '8':
cout<<"请输入新增选手的姓名、编号:"<<endl;
cin>>newsin.name;
cin>>newsin.num;
head=insert(head,&newsin);
system("pause");
cout<<"请输入文件名:";
cin>>filename;
save(head,filename);
system("pause");
break;
case 'c':
system("cls");
welcome(); |
|
case 'q':
quit=true;
break;
default:
cout<<"输入错误!"<<endl;
}
if (quit)
break;
}
//退出时提示保存
cout<<"您想保存这些信息吗(Y/N)";
{
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)<<"3.评委打分"
<<setw(20)<<"4.成绩排序"<<endl
<<setw(20)<<"5.打印所有的信息"
<<setw(20)<<"6.按姓名查询"<<endl
<<setw(20)<<"7.按编号查询"
<<setw(20)<<"8.追加选手数据"<<endl
<<setw(20)<<"k.保存信息表到文件"
<<setw(20)<<"c.清空屏幕"<<endl <<setw(20)<<"q.退出"<<endl<<endl
<<"输入您的选择:";
}
//创建链表
Singer*create()
{
bool error=false;
formExist=true;
Singer *p1,*p2,*head;
head=NULL;
p1=head;
while(true)
p1=new Singer;
cout<<"请输入选手的姓名:(输0结束)";
cin>>p1->name;
if (p1->name=="0")
break;
cout<<"编号:";
cin>>p1->num;
n++; |
|
{
head=p1;
p1->next=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
}
}
cout<<"输入结束!"<<endl;
} //输出信息
voidprint(Singer *head)
{
Singer *p=head;
if(p!=NULL)
{
cout<<setw(15)<<"姓名"<<setw(10)<<"编号"<<endl;
do |
|
cout<<setw(15)<<p->name<<setw(10)<<p->num<<endl;
p=p->next;
}while(p!=NULL);
cout<<"合计选手"<<n<<"人。"<<endl;
}
else
cout<<"没有信息!"<<endl;
}
//评委打分
voidgrade(Singer *head)
{
if (p!=NULL)
{
do
{
int i, max, min;
int sum=0;
max= -1;
min =101 ; |
|
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];
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");
}
//按平均分排序数出函数
voidrank(Singer *&head)
{
/////////////////冒泡法排序/////////////////////////////
//p = head;
int cc;
Singer *p,*q,*tail,*h;
if(!head)
return;
tail=NULL;
//h =head;
while(h->next!=tail)
{
p=h;
q=p->next;
while(q->next!=tail)
{
//swap
if (p->next->average <q->next->average)
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
p=p->next;
}
else{
//next step
q=q->next;
p=p->next;
}
//since we use singlelink
tail=q;
}
/*
do//求出选手的的人数
{
p = p->next;
n++;
}while(p->next != NULL);
Singer *temp = head->next;
Singer *prev = head;
for(i=0; i<n-1; i++)
{
if(head->average< temp->average)
{
prev->next =temp->next;
temp->next = head;
head =temp;
}
}
{
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;
p1->next = p2;
p2 = p2->next;
}//if
p1 = p1->next;
p2 = p2->next;
}//for
}//for
*/
/////////////////////输出排序后数据////////////////////////////////
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;
else
{
while(p1->next!=NULL)
{
if (p0->num==p1->num)
{
cout<<"编号为"<<p0-
>num<<"的选手已存在!"<<endl;
return head;
}
p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
n++;
}
cout<<"成功插入信息!"<<endl;
return head;
}
//保存到文件
{ 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;
}while(p!=NULL);
outfile.close();
cout<<"保存成功!保存到"<<filename<<endl;
}
}
//按姓名查询
voidinquire(Singer *head,string name)
{ | bool flag=true; |
|
|
Singer *p=head;
int total=0;
if (p==NULL)
{
cout<<"信息为空!"<<endl;
return;
}
do
{
if(p->name==name)
{
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;
}
//按编号查询
voidinquire(Singer *head,long num)
{
bool flag=true;
Singer *p=head;
if (p==NULL)
return;
}
do
{
if(p->num==num)
{
if(flag)
{ |
|
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) {
ifstreaminfile;
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;
p1=p;
n++;
}
infile.close();
cout<<"导入成功!"<<endl;
return head;
}