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

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

联系方式:

基于有一些阅读者想与笔者有进一步交流,贴一下本人的微信:StarsForMoon,添加请说明来意(如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.cpp源代码:

#pragma
#include<iostream>
#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 <iostream>
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.h源代码:

#pragma once
#define _CRT_SECURE_NO_WARNINGS//fopen函数不安全
#include<string>//字符串比较
#include<iomanip>//格式控制
#include<fstream>//文件输入输出流
#include<stdlib.h>

/*裁判信息*/
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分,希望能对大家的课程设计参考有所帮助。

进一步了解欢迎添加微信:StarsForMoon ,当然如有问题也欢迎私信交流或在评论区留言,感谢看到此处~

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

  • 11
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目介绍】 C语言课程设计-基于c语言实现的歌唱比赛评分系统源码+详细代码注释.zip C语言课程设计-基于c语言实现的歌唱比赛评分系统源码+详细代码注释.zip C语言课程设计-基于c语言实现的歌唱比赛评分系统源码+详细代码注释.zip 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 题目: 有十个选手参加歌唱比赛十个裁判每个选手演唱进行打分,去掉一个最高分,去掉一个最低分,剩下分数的平均值作为每位选手最后的成绩。 要求: (1)采用结构体定义每个选手的参赛编号,姓名以及十个裁判打出的分数; (2)从键盘输入每个选手的相关信息:参赛编号,姓名和十个得分; (3)计算每位选手的最后得分,并按分数由高到低排序; (4)查询功能:输入参赛选手的名次、编号或姓名(三个条件都能实现),便可输出该选手的得分以及排名; 以上功能采用菜单操作方式;设计程序中要求用到结构体、文件读写等相关知识内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值