【C++课程设计项目】歌手评分系统(代码量1500行含设计文档)

【C++课程设计项目】歌手评分系统(代码量1500行含设计文档),第1张

本设计涉及到对数据的输入、增加、删除、修改、查询、排序以及文件存取的具体应用。还有函数指针、类的应用、多文件结构等知识。可移植性强、界面美观、初具小型系统雏形,是一份值得借鉴与学习的课程设计。

基于有一些阅读者想与笔者有交流与合作,贴一下本人的微信:UNIQKrisTien,添加请说明来意(如CSDN)。如果觉得做得还不错的话,考虑到笔者暂时还不能用爱发电,整个项目打包(源码、设计文档)+ 任意一处源码答疑可联系微信,20R即可。感谢你对笔者的支持!CSDN上确实不方便发送,谢谢配合:)

另外笔者还有另一个开发项目:Python结合机器学习的基于天气预报数据的数据分析与可视化课程设计项目,欢迎感兴趣的朋友交流学习~

编译器:VisualStudio 2019 / Dev C++皆可

系统 : 歌手比赛评分系统

设计要求:
设计一个有十个选手参加歌唱比赛,十个裁判对每个选手的演唱进行打分,去掉一个最高分和最低分,剩下分数的平均值作为每位选手最后的成绩。要求设计一个能对比赛数据进行输入、增加、删除、修改、排序、查询、保存、展示的选手评分系统。

要求完成的主要任务:
1)采用结构体定义每个选手的参赛编号,姓名以及十个裁判打出的分数;
2)从键盘输入每个选手的相关信息:参赛编号,姓名和十个得分;
3)计算每位选手的最后得分,并按分数由高到低排序;
4)查询功能:输入参赛选手的编号或姓名,便可输出该选手的得分以及排名。

创新点:
(1)运用多种查询方法,精确查找、二分法查询、模糊查询就是典型的应用,对不同数据做到可查可改可删。
(2)运用多种排序方法,冒泡排序、选择排序、直接插入排序、希尔排序对成绩数据,或者成绩+编号的多属性环境下进行排序,运用数学中带分数的思想,解决了多属性排序的问题。

优点:
(1)简洁美观,方便使用。
多次从用户使用角度出发,不断优化迭代程序,将功能选择权交给用户。

(2)功能多样,不呆板。
排序、查询功能是核心功能,因此对这两处的设计尤为看重,排序功能多种排序方法实现,且分为单属性和多属性排序,还可升降序查看。查询功能做到不同数据类型也能查,能查单个数据,也能查询多条数据。

(3)使用类方法,面向对象编程。

模块设计结构图

主要数据结构

(一)、Singer类
/*歌手信息*/
class Singer
{
private:
	int Number;			//选手编号
	char  *name;		   //选手姓名
	float prescores[10];//选手初始10个成绩数据
	float maxscore;		//选手最高分
	float minscore;		//选手最低分
	float totalscore;	   //选手总分(10)
	float evenscore;	   //选手(8)
	float averagescore;	//选手平均分
public:
	friend class Judge;				//judge和singer互为友元类
	
	Singer(float presc[], int Num, const char *nam,			//构造函数
		float maxsc,float minsc,float totalsc,float evensc,float averagesc);
	~Singer();													//析构函数

	/*类的成员函数*/
	float GetMax(float a[], int len);							//最大值
	float GetMin(float b[], int len);							//最小值
	float sum(float c[], int len);								//求和

	/*友元函数*/
	friend void menu(Singer singers[], Judge judges[], int* n, int* m,int *judge_num,bool *system_key);				//菜单函数
	friend void ContestantInfo(Singer singers[], Judge judges[], int* n, int* m);	//选手个人信息输入函数
	friend void ContestantRankings(Singer singers[], int n);	//选手排名
	friend bool QueryInfo(Singer singers[], int n);			//查询选手信息
	friend void InsertInfo(Singer singers[], Judge judges[], int* n, int* m,int judge_num);		//插入选手数据
	friend void SaveInfo(Singer singers[], int n);					//保存函数
	friend void JudgeScores(Singer singers[], Judge judges[], int* n, int* m,int judge_num);		//裁判打分函数
	friend bool ModifyInfo(Singer singers[], int n,int judge_num);	//修改函数
	friend void DelInfo(Singer singers[], int* n);				      //删除函数
	friend void DisplayInfo(Singer singers[], int n);			      //信息展示函数

	/*友元函数子函数*/
	friend int binaryFindNo(Singer singers[], int n, int score);	//二分查找函数
	friend void RankView(Singer singers[], int n);			//排序查看函数
	friend void ObverseOrder(Singer singers[], int n);		//正序输出
	friend void ReverseOrder(Singer singers[], int n);		//逆序输出
	friend void BubbleSort(Singer singers[], int n);			//冒泡排序
	friend void SelectSort(Singer singers[], int n);			//选择排序
	friend void ShellSort(Singer singers[], int n);				//希尔排序
	friend void InsertSort(Singer singers[], int n);			//插入排序
};
(二)、Judge类
/*裁判信息*/
class Judge
{
public:
	int JudgeNo;				//评委编号
	float score;				//评委评分
	friend class Singer;		//judge和singer互为友元类
	~Judge();					//析构函数
};

一、主要文件结构

说明:

① func.cpp:用于存放实现所有功能的函数(如菜单实现、各种增删改查保存展示功能的函数实现、数据输入与保存、数据展示)。

② main.py:负责启动系统,调用函数执行相应功能与终止系统,它是程序运行入口。

③ singer.h:函数的声明,类的声明。相当于是func.cpp的蓝图。

二、具体文件细节(部分)

(1)main.py源代码:

#pragma
#include
#include "singer.h"
using namespace std;

/*主函数调用的入口*/
int main()
{
	/*系统的总开关*/
	bool system_key = 1;//避免直接使用exit(0)

	/*一些最基本的底层信息*/
	int n = 10;//总选手人数,默认为10人
	int m = 0;//增加的人数
	int judge_num = 10;	//裁判数量
	Judge judges[10];	//十个裁判默认生成
	
	/*十个默认选手的十个成绩*/
	float scr_1[10] = { 10,10,10,10,10,10,10,10,10,10 };
	float scr_2[10] = { 10,10,10,10,10,10,10,10,10,10 };
	float scr_3[10] = { 10,8,10,10,10,10,10,7,10,10 };
	float scr_4[10] = { 10,8,10,5,10,5,10,7,10,10 };
	float scr_5[10] = { 10,8,10,5,10,5,10,7,10,10 };
	float scr_6[10] = { 9,8,9,5,9,5,9,7,9,9 };
	float scr_7[10] = { 1,2,3,4,5,6,7,8,9,10 };
	float scr_8[10] = { 0,1,1,1,1,1,1,1,1,1 };
	float scr_9[10] = { 2,3,3,4,1,4,5,1,2,2 };
	float scr_10[10] = { 1,3,7,0,10,3,6,7,4,5 };

	/*默认对象初始化*/
	Singer singers[10] =
	{

		{scr_1,1001,(char*)"张三",10,10,100,80,10},
		{scr_2,1003,(char*)"王五",10,10,100,80,10},
		{scr_3,1004,(char*)"李四",10,7,95,78,9.75},
		{scr_4,1002,(char*)"赵六",10,5,85,70,8.75},
		{scr_5,1005,(char*)"孙一",10,5,85,70,8.75},
		{scr_6,1006,(char*)"钱七",9,5,79,64,8.00},
		{scr_7,1007,(char*)"Tom",10,1,55,44,5.50},
		{scr_8,1008,(char*)"Biden",1,0,9,8,1.00},
		{scr_9,1009,(char*)"Trump",5,1,27,21,2.625},
		{scr_10,1010,(char*)"Moss",10,0,46,36,4.50}
	};
	
	/*函数入口,所有功能的集成*/
	while (system_key)
	{
		menu(singers, judges,&n,&m,&judge_num,&system_key);
	}
	return 0;
}

(2)func.cpp源代码(部分):

#pragma once
#include "singer.h"
#include 
using namespace std;

/*菜单函数*/
void menu(Singer singers[], Judge judges[], int* n, int* m,int *judge_num,bool *system_key)
{
	int choice;
	cout << "  ******************************************************\n\n";
	cout << "  *                歌手比赛管理系统                    *\n \n";
	cout << "  ******************************************************\n\n";
	cout << "  *********************系统功能菜单*********************       \n";
	cout << "     ---------------------------------------------   \n";
	cout << "     *********************************************     \n";
	cout << "     * 0.系统帮助及说明  * *  1.输入选手信息   *     \n";
	cout << "     *********************************************     \n";
	cout << "     * 2.输入评委打分    * *  3.选手成绩排序   *     \n";
	cout << "     *********************************************     \n";
	cout << "     * 4.查询选手数据    * *  5.追加选手数据   *     \n";
	cout << "     *********************************************     \n";
	cout << "     * 6.保存选手数据    * *  7.删除选手信息   *     \n";
	cout << "     *********************************************     \n";
	cout << "     * 8.显示选手信息    * *  9.修改选手信息*     \n";
	cout << "     *********************************************     \n";
	cout << "     * 10.退出系统       *     \n";
	cout << "     ---------------------------------------------     \n";
	cout << "请选择菜单编号:";
	cin >> choice;
	switch (choice)//switch多分支用于功能选择
	{
	case 0:
	{
		SystemHelp();
		break;
	}

	case 1:
	{
		ContestantInfo(singers, judges, n, m);
		break;
	}

	case 2:
	{
		JudgeScores(singers, judges, n, m,*judge_num);
		break;
	}
	case 3:
	{
		ContestantRankings(singers, *n);
		break;
	}

	case 4:
	{
		QueryInfo(singers, *n);
		break;
	}

	case 5:
	{
		InsertInfo(singers, judges, n, m,*judge_num);
		break;
	}

	case 6:
	{
		SaveInfo(singers, *n);
		break;
	}
	case 7:
	{
		DelInfo(singers, n);
		break;
	}
	case 8:
	{
		DisplayInfo(singers, *n);
		break;
	}
	case 9:
	{
		ModifyInfo(singers, *n,*judge_num);
		break;
	}
	case 10:
	{
		*system_key = 0;
		cout << "即将退出程序!\n";
		break;
		//exit(0);	//终止整个程序运行
	}
	default:
	{
		cout << "请在0-10之间选择\n";//增加使用友好性
	}
	}
}

菜单展示:

func.cpp中各种实现功能的函数一览:

一些核心功能的展示

(1)排序功能展示

(2)查询功能展示

(3)显示功能展示

(3)Singer.cpp源代码:

#pragma once
#define _CRT_SECURE_NO_WARNINGS//fopen函数不安全
#include//字符串比较
#include//格式控制
#include//文件输入输出流
#include

/*裁判信息*/
class Judge
{
public:
	int JudgeNo;				//评委编号
	float score;				//评委评分
	friend class Singer;		//judge和singer互为友元类
	~Judge();					//析构函数
};

/*歌手信息*/
class Singer
{
private:
	int Number;			//选手编号
	char  *name;		//选手姓名
	float prescores[10];//选手初始10个成绩数据
	float maxscore;		//选手最高分
	float minscore;		//选手最低分
	float totalscore;	//选手总分(10)
	float evenscore;	//选手(8)
	float averagescore;	//选手平均分
public:
	friend class Judge;														//judge和singer互为友元类
	
	Singer(float presc[], int Num, const char *nam,							//构造函数
		float maxsc,float minsc,float totalsc,float evensc,float averagesc);
	~Singer();																//析构函数

	/*类的成员函数*/
	float GetMax(float a[], int len);										//最大值
	float GetMin(float b[], int len);										//最小值
	float sum(float c[], int len);											//求和

	/*友元函数*/
	friend void menu(Singer singers[], Judge judges[], int* n, int* m,int *judge_num,bool *system_key);				//菜单函数
	friend void ContestantInfo(Singer singers[], Judge judges[], int* n, int* m);	//选手个人信息输入函数
	friend void ContestantRankings(Singer singers[], int n);						//选手排名
	friend bool QueryInfo(Singer singers[], int n);									//查询选手信息
	friend void InsertInfo(Singer singers[], Judge judges[], int* n, int* m,int judge_num);		//插入选手数据
	friend void SaveInfo(Singer singers[], int n);									//保存函数
	friend void JudgeScores(Singer singers[], Judge judges[], int* n, int* m,int judge_num);		//裁判打分函数
	friend bool ModifyInfo(Singer singers[], int n,int judge_num);								//修改函数
	friend void DelInfo(Singer singers[], int* n);									//删除函数
	friend void DisplayInfo(Singer singers[], int n);								//信息展示函数

	/*友元函数子函数*/
	friend int binaryFindNo(Singer singers[], int n, int score);					//二分查找函数
	friend void RankView(Singer singers[], int n);									//排序查看函数
	friend void ObverseOrder(Singer singers[], int n);								//正序输出
	friend void ReverseOrder(Singer singers[], int n);								//逆序输出
	friend void BubbleSort(Singer singers[], int n);								//冒泡排序
	friend void SelectSort(Singer singers[], int n);								//选择排序
	friend void ShellSort(Singer singers[], int n);									//希尔排序
	friend void InsertSort(Singer singers[], int n);								//插入排序
};

/*系统帮助函数*/
void SystemHelp();

其他的更多内容(比如数据输入、保存、修改等比较易于实现)就不在这里展示了,这个系统非常完善,笔者这里有清晰的注释与设计文档,且技术水平自认为还是可以的。当时这份课程设计是专业排名第二的分数,有96分。如有购买需求,请直接添加微信:UNIQKrisTien ,其他问题也欢迎私信交流或在评论区留言,感谢看到此处~

最后,觉得做得还不错的话请点赞、收藏、转发支持一下吧~,要是点一点关注那就更好了!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1354106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存