数据结构课设----运动会分数统计系统(C++版)

2023-12-14 20:59

本文主要是介绍数据结构课设----运动会分数统计系统(C++版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.1② 运动会分数统计
【问题描述】
  参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5;3,2。写一个统计程序产生各种成绩单和得分报表。
【基本要求】
  产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。
【测试数据】
  对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。
【实现提示】
  可以假设n≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
【选作内容】
允许用户指定某项目采取其他名次取法。

废话不多说,直接上代码!(欢迎私信和评论!)

#include<math.h>
#include<process.h>
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;#define N 20 //学校最大数目
#define M 30 //男子项目最大数
#define W 20 //女子项目最大数//存放项目信息的结构体
typedef struct
{int inum;//项目编号int top;//取名次的数目int range[5];//名次int mark[5];//分数
}itemnode;//存放学校信息的结构体
typedef struct
{int snum;//学校编号int score;//学校总分int mscore;//男子总分int wscore;//女子总分itemnode t[M + W];//项目数组
}snode;
snode a[N];//定义一个学校数组//菜单函数
void menu(int n, int m, int w)
{//n代表学校数,m代表男子数,w代表女子数int c;void input(int n, int m, int w);//输入功能void output(int n, int m, int w);//输出功能void sortput(int n, int m, int w);//排序输出void search(int n, int m, int w);//查询功能cout<<"\t\t\t欢迎使用\t\t\t\t\t"<<endl;cout<<"运动会分数统计系统"<<endl;cout << endl;cout<<"1.信息输入"<<endl;cout<<"2.统计输出" << endl;cout <<"3.排序输出" << endl;cout<<"4.信息查询"<<endl;cout<<"5.退出系统"<<endl;cout << endl;cout<<"======================================================="<<endl;cout << endl;cout<<"请输入您想要实现的功能(0--4):"<<endl;cin >> c;switch (c) {case 1:input(n, m, w);break;case 2:output(n, m, w);break;case 3:sortput(n, m, w);break;case 4:search(n, m, w);break;case 5:cout<<"感谢使用,祝您天天开心!!"<<endl;exit(0);//正常退出default:cout<<"您输入有误,请重新输入!";menu(n, m, w);}
}//将信息写入文件中
void savetofile()
{FILE* fp;//定义一个文件指针int i;if (NULL == (fp = fopen("file.txt", "w"))) {cout<<"打开文件失败!"<<endl;return;}for (i = 0; i < N; i++) {if ('\0' != a[i].snum)if (fwrite(&a[i], sizeof(snode), 1, fp) != 1) {cout << "存入信息失败!" << endl;return;}}fclose(fp);//关闭文件
}//将信息从文件里取出
void readfromfile()
{int i;FILE* fp;if ((fp = fopen("file.txt", "rb")) == NULL) {cout<<"文件打开失败!"<<endl;return;}for (i = 0; i < N; i++) {fread(&a[i], sizeof(snode), 1, fp);}fclose(fp);
}//信息输入功能
void input(int n, int m, int w)
{int i, j, s, k, q = 1;for (i = 0; i < n; i++) {cout<<"请输入学校的编号:"<<endl;cin >> a[i].snum;for (j = 0; j < m + w; j++) {//总的项目的输入cout << "请输入项目编号:";cin>> a[i].t[j].inum;/*cout << "请输入该项目取前3还是前5(输入3或5):";cin >> a[i].t[j].top;*/if (a[i].t[j].inum % 2 == 0) {cout<<"编号为偶数取前三" << endl;cout << "获得的名次的个数(1--5):";}else if (a[i].t[j].inum % 2 == 1) {cout <<"编号为奇数的项目取前五"<<endl;cout << "获得的名次的个数(1--5):";}else {cout << "输入有误!程序退出....";return;}cin >> k;//输入获得名次的个数for (s = 0; s < k; s++) {//if (3 == a[i].t[j].top) {if(a[i].t[j].inum % 2 == 0){cout<<"请输入获得的名次(1--3):";}else {cout<<"请输入获得的名次(1--5):";}cin >> a[i].t[j].range[s];//输入所获得的名次的信息}cout << endl;}}for (i = 0; i < n; i++) {//初始化分数a[i].score = 0;//学校总分a[i].mscore = 0;//男子总分a[i].wscore = 0;//女子总分}for (i = 0; i < n; i++) {for (j = 0; j < m + w; j++) {cout << "项目" << j + 1 << "取得是前3还是前5(输入3或5) :";cin >> a[i].t[j].top;for (s = 0; s < 5; s++) {if (a[i].t[j].top == 3) {switch (a[i].t[j].range[s]) {case 0:a[i].t[j].mark[s] = 0;break;case 1:a[i].t[j].mark[s] = 5;break;case 2:a[i].t[j].mark[s] = 3;break;case 3:a[i].t[j].mark[s] = 2;break;}}else if (a[i].t[j].top == 5) {switch (a[i].t[j].range[s]) {case 0:a[i].t[j].mark[s] = 0;break;case 1:a[i].t[j].mark[s] = 7;break;case 2:a[i].t[j].mark[s] = 5;break;case 3:a[i].t[j].mark[s] = 3;break;case 4:a[i].t[j].mark[s] = 2;break;case 5:a[i].t[j].mark[s] = 1;break;}}/*else {cout << "信息输入错误!程序退出" << endl;cout << endl;exit(0);}*/a[i].score = a[i].score + a[i].t[j].mark[s];//学校总分if (j < m) {a[i].mscore = a[i].mscore + a[i].t[j].mark[s];}else {//女子总分a[i].wscore = a[i].wscore + a[i].t[j].mark[s];}}}}cout<<"输入完毕!(返回菜单请输入1):";cin >> q;cout << endl;if (q != 1) {cout<<"不能再添加信息了!";}cout << endl;savetofile();//保存文件menu(n, m, w);
}#if(1)
void output(int n, int m, int w)                                /*2.统计输出*/
{readfromfile();int i, j, s, q = 0;for (i = 0; i < n; i++)  /*显示结果*/{cout << "学校编号:" << a[i].snum << endl;cout << "学校总分:" << a[i].score << endl;cout << "男子总分" << a[i].mscore <<"  " << "女子总分" << a[i].wscore << endl;for (j = 0; j < m + w; j++){// cout<<"项目编号:%d  所取名次数量:%d\n", a[i].t[j].inum, a[i].t[j].top;cout << "项目编号:" << a[i].t[j].inum <<"  " << "所取名次取前:" << a[i].t[j].top<<"名"<< endl;for (s = 0; s < 5; s++){if (a[i].t[j].range[s] != 0)cout<<"名次:"<< a[i].t[j].range[s] <<"  " << "分数:"<< a[i].t[j].mark[s]<<"  "<<endl;}}cout << endl;}cout<<"\n";cout<<"统计完毕!返回?  1是 2否";    /*返回菜单*/cin >> q;cout << endl;if (q != 1)cout<<"统计已经结束!";cout << endl;menu(n, m, w);
}
#endif//排序输出
void sortput(int n, int m, int w)//n为学校数,m为男子数,w为女子数
{readfromfile();int c, i, j, k, q = 0;int temp[N]={};cout << "\t**************排序输出系统**************" << endl;cout << endl;cout << "\t\t****1.按学校编号输出****" << endl;cout<<"\t\t****2.按学校总分输出****"<<endl;cout<<"\t\t****3.按男子总分输出****"<<endl;cout<<"\t\t****4.按女子总分输出****"<<endl;cout<<"======================================================="<<endl;cout << endl;do {cout<<"请选择您想实现的功能的编号(1--4):";cin >> c;switch (c) {case 1:for (i = 0; i < n; i++) {temp[i] = i;}//用的是冒泡排序输出for (i = 0; i < n; i++) {for (j = i + 1; j < n; j++) {if (a[temp[i]].snum > a[j].snum) {k = temp[i];temp[i] = temp[j];temp[j] = k;}}}for (i = 0; i < n; i++) {//cout<<"学校标号:%d  学校总分:%d  男子总分:%d   女子总分:%d\n", a[temp[i]].snum, a[temp[i]].score, a[temp[i]].mscore, a[temp[i]].wscore;cout << "学校标号:" << a[temp[i]].snum << "  " << "学校总分:" << a[temp[i]].score << endl;cout << "男子总分" << a[temp[i]].mscore << "  " << "女子总分:" << a[temp[i]].wscore << endl;}break;case 2:for (i = 0; i < n; i++) {temp[i] = i;}for (i = 0; i < n; i++) {for (j = i + 1; j < n; j++) {if (a[temp[i]].score < a[j].score) {k = temp[i];temp[i] = temp[j];temp[j] = k;}}}for (i = 0; i < n; i++) {// cout<<"学校编号:%d  学校总分:%d   男子总分:%d   女子总分:%d\n", a[temp[i]].snum, a[temp[i]].score, a[temp[i]].mscore, a[temp[i]].wscore;cout << "学校标号:" << a[temp[i]].snum << "  " << "学校总分:" << a[temp[i]].score << endl;cout << "男子总分" << a[temp[i]].mscore << "  " << "女子总分:" << a[temp[i]].wscore << endl;}break;case 3:for (i = 0; i < n; i++) {temp[i] = i;}for (i = 0; i < n; i++) {for (j = i + 1; j < n; j++) {if (a[temp[i]].mscore < a[j].mscore) {k = temp[i];temp[i] = temp[j];temp[j] = k;}}}for (i = 0; i < n; i++) {printf("学校编号:%d  学校总分:%d  男团总分:%d  女团总分:%d\n", a[temp[i]].snum, a[temp[i]].score, a[temp[i]].mscore, a[temp[i]].wscore);}break;case 4:for (i = 0; i < n; i++) {temp[i] = i;}for (i = 0; i < n; i++) {for (j = i + 1; j < n; j++) {if (a[temp[i]].wscore < a[j].wscore) {k = temp[i];temp[i] = temp[j];temp[j] = k;}}}for (i = 0; i < n; i++) {printf("学校编号:%d  学校总分:%d  男团总分:%d  女团总分:%d\n", a[temp[i]].snum, a[temp[i]].score, a[temp[i]].mscore, a[temp[i]].wscore);}break;default:printf("您的输入有误!请从新输入...");}printf("请选择 1.返回主菜单  0.继续");scanf_s("%d", &q);printf("\n");}//=======================while (0 == q);printf("\n");//=======================if (q != 0) {menu(n, m, w);}
}//查询功能
void search(int n, int m, int w)
{readfromfile();int c, i, j, k, d, l, q = 0;cout<<"\t****************查询系统****************"<<endl;cout << endl;cout << "\t\t****1.按学校编号查询****"<<endl;cout << "\t\t****2.按项目编号查询****" << endl;cout << "======================================================="<<endl;cout << endl;do{k = -1; d = -1; l = -1;cout<<"请选择要实现功能的编号(1--2):";//scanf_s("%d", &c);cin >> c;switch (c) {case 1:cout<<"要查询的学校编号:";       /*查找学校编号下标*/// scanf_s("%d", &c);cin >> c;for (i = 0; i < n; i++) {if (c == a[i].snum) {k = i;}}if (-1 == k) {cout<<"错误:这个学校没有参加此次运动会!"<<endl;}else {cout<<"要查询的项目编号:";         /*查找项目编号下标*///scanf_s("%d", &c);cin >> c;for (j = 0; j < m + w; j++) {if (c == a[k].t[j].inum) {d = j;}}if (-1 == d) {cout<<"此次运动会没有这个项目"<<endl;}else {//cout<<"这个项目取前 %d名,该学校的成绩如下:\n", a[k].t[d].top);cout << "这个项目取前" << a[k].t[d].top << "名,该学校的成绩如下:" << endl;for (i = 0; i < 5; i++) {if (a[k].t[d].range[i] != 0) {//cout<<"名次:%d\n", a[k].t[d].range[i];cout << "名次:" << a[k].t[d].range[i];}}}}break;case 2:cout<<"要查询的项目编号:";     /*查找项目编号下标*///scanf_s("%d", &c);cin >> c;for (i = 0; i < n; i++) {for (j = 0; j < m + w; j++) {if (c == a[i].t[j].inum) {l = j;}if (-1 == l) {cout<<"此次运动会没有该项目";}else {//printf("该项目取前 %d名,取得名次的学校\n", a[0].t[l].top);cout << "该项目取前a[0].t[l].top名,取得名次的学校" << endl;for (i = 0; i < n; i++) {for (j = 0; j < 5; j++) {if (a[i].t[l].range[j] != 0) {//cout<<"学校编号:%d,名次:%d\n", a[i].snum, a[i].t[l].range[j]);cout << "学校编号:" << a[i].snum << "  " << ", 名次:" << a[i].t[l].range[j] << endl;}}}}}}break;default:cout << "输入错误,请重试!" << endl;}cout<<"请选择:1.返回主菜单 0.继续";//scanf_s("%d", &q);cin >> q;//printf("\n");cout << endl;} while (0 == q);//printf("\n");cout << endl;if (q != 0) {menu(n, m, w);}
}//主函数
int main()
{int n, m, w;//n为学校个数,m为男子数,w为女子数cout<<"\t\t\t欢迎使用\t\t\t\t"<<endl;cout << endl;cout << "\t***********运动会分数统计系统***********" << endl;cout << endl;cout<<"请先输入运动会主要信息"<<endl;cout<<"输入学校个数:";cin >> n;cout<<"输入男子项目个数:";cin >> m;cout<<"输入女子项目个数:";cin >> w;menu(n, m, w);}

结果截图 

 

这篇关于数据结构课设----运动会分数统计系统(C++版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493855

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作