本设计涉及到对数据的输入、增加、删除、修改、查询、排序以及文件存取的具体应用。还有函数指针、类的应用、多文件结构等知识。可移植性强、界面美观、初具小型系统雏形,是一份值得借鉴与学习的课程设计。
基于有一些阅读者想与笔者有交流与合作,贴一下本人的微信:UNIQKrisTien,添加请说明来意(如CSDN)。如果觉得做得还不错的话,考虑到笔者暂时还不能用爱发电,整个项目打包(源码、设计文档)+ 任意一处源码答疑可联系微信,35R即可。感谢你对笔者的支持!CSDN上确实不方便发送,谢谢配合:)
编译器: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" #includeusing namespace std; void menu(Singer singers[], Judge judges[], int* n, int* m,int *judge_num,bool *system_key) { int choice; cout << " ******************************************************nn"; cout << " * 歌手比赛管理系统 *n n"; cout << " ******************************************************nn"; 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 ,其他问题也欢迎私信交流或在评论区留言,感谢看到此处~
最后,觉得做得还不错的话请点赞、收藏、转发支持一下吧~,要是点一点关注那就更好了!



