数据结构与算法(C语言版)—-运动会管理系统

1、需求分析

  • 问题阐述:

(1)在”学校运动会管理系统”中,设有n个单位参加比赛(单位可是学院、系、年级等,应可设置),学院与个人可以选择参加项目,运动员参加项目应有限制,如最多参加3项。

(2)各项目名次应可设置,随系统环境环境而变化,如:

参赛人数超过6人,取前5名:第一名7分,第二名5分,第三名3分,第四名2分,第五名1分;

参赛人数不超过6人,取前3名:第一名5分,第二名3分,第三名2

参赛项目人数不足4人则取消项目

(3)系统设置内容

参赛单位名称

比赛项目设置

运动员参赛项目限制

选取名次设置

  1. 基本要求:
    1. 数据备份
    2. 比赛成绩自动统计
    3. 比赛成绩查询
    4. 秩序册生成
    5. 参赛信息查询
    6. 运动员报名登记
    7. 参赛项目发布

2、概要设计

通过使用数据结构的知识,将对应的信息存储在对应数组和……中,并写入txt文件达到数据备份的作用,再通过数组中值的比较实现信息查询、修改等功能。

3、详细设计

菜单:通过switch case语句调用对应方法实现菜单界面功能选择

录入信息:打开data.txt文件,在判定文件状态后,通过scanf语句将数据写入结构数组对应位置,关闭文件

信息查询:打开data.txt文件,在判定文件状态后,通过比对所输入的数据与结构数组中的数据,将其对应的结构数据的其他数据一同输出,关闭文件

信息修改:打开data.txt文件,在判定文件状态后,通过比对所输入的数据与结构数组中的数据,将其对应的结构数据进行修改,关闭文件

秩序册项目集:将项目相关信息以及相关选手信息进行排列输出,得到整体的校运会项目时间秩序册。

定义结构体DATA(姓名、学院、项目、成绩)来传递对象信息,用FORMAT格式化输出,定义文件指针变量,实现打开关闭文件写入读出数据进行数据存储。

4、用户手册

  1. 输入密码123456按回车后进入运动会管理系统
  2. 进入界面之后通过文字便可以了解逐步的操作
  3. 显示所有信息指显示目前已经录入的所有运动员的信息
  4. 查询单一项目信息指显示一个项目的选手的相关信息
  5. 查询单一学院信息指显示一个学院的选手的相关信息
  6. 项目表是运动会的项目表
  7. 秩序册是运动会流程大致展示

5、测试结果

界面展示:

选项一:

将信息录入data.txt 文件中:

6、源代码

//
//   created by stu_kk on 2022/05/01
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L sizeof(ID)
#define FORMAT "\t\t\t%-12s%-\t\t%-15s%-\t\t%-15s%-\t\t%-60s"
#define DATA ids[i].name, ids[i].xy, ids[i].xm,ids[i].score
int n;
int i = 0;
int j = 0;
int c;
int k;
FILE *p; //定义指向FILE类型文件的指针变量
char name[12];
typedef struct
{
	char name[12];	//姓名
	char xy[15];	//学院 
	char xm[15];    //项目 
	char score[60]; //成绩
} ID;				//声明新的类型名ID 代表上面结构体类型
ID ids[100];
void menu() //菜单
{
	system("cls");
	printf("\n\n\n");
	printf("\t\t\t\t|------------------------------------------------------|\n");
	printf("\t\t\t\t|------------------------------------------------------|\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|                校运会信息管理系统                    |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|     1.录入运动员信息         2.查询运动员信息        |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|     3.修改运动员信息         4.删除运动员信息        |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|     5.显示所有信息           6.查询单一项目信息      |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|     7.查询单一学院信息       8.项目表                |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|     9.查看秩序册             0.退出系统              |\n");
	printf("\t\t\t\t|                                                      |\n");
	printf("\t\t\t\t|------------------------------------------------------|\n");
	printf("\t\t\t\t|------------------------------------------------------|\n");
	printf("\t\t\t\t|请在(0-9)选择要进行的操作!\n"); //菜单的主页面
}

void all() //全部运动员信息展示
{
	system("cls"); //清屏
	printf("\n\n\n\n");
	p = fopen("data.txt", "rb"); //打开文件并将fopen函数的返回值赋给指针变量p
	j = 0;
	while (!feof(p))					  //判断p指向的文件是否结束
		if (fread(&ids[j], L, 1, p) == 1) //将p指向的文件中读入结构体数组ids的一个元素 每次读入一个 则读入成功 其返回值为1
			j++;						  //每读一个 j就加1
	fclose(p);							  //把p指向的文件关闭 以后p不再指向该文件
	if (j == 0)
	{
		printf("\t\t\t\t目前没有运动员信息\n\t\t\t");
		system("pause");
		return;
	}
	printf("\t\t\t姓名\t\t\t学院\t\t\t项目\t\t\t成绩\n");
	for (i = 0; i < j; i++) //输出运动员信息
	{
		printf(FORMAT, DATA);
		printf("\n");
	}
	printf("\t\t\t输入任意键返回主界面\n\t");
	system("pause");
}

void input()
{
	system("cls"); //清屏
	printf("\n\n\n");
	if ((p = fopen("data.txt", "a+")) == NULL) //打开文件,先检查是否有错,有错则输出无法打开文件
	{
		printf("\t\t\t\t\t无法打开文件\n\t\t\t\t\t");
		system("pause");
		return;
	}
	while (!feof(p)) //判断p指向的文件是否结束
	{
		if (fread(&ids[j], L, 1, p) == 1) //将p指向的文件中读入结构体数组ids的一个元素 每次读入一个 则读入成功 其返回值为1
			j++;
	}
	fclose(p); //把p指向的文件关闭 以后p不再指向该文件
	if (j == 0)
		printf("\t\t\t\t\t目前没有运动员\n");
	else
	{
		system("cls"); //清屏
		printf("\n\n\n\n");
		all();
	}
	if ((p = fopen("data.txt", "wb")) == NULL) //打开文件,先检查是否有错,有错则输出无法打开文件,p指向该文件
	{
		printf("\t\t\t\t\t文件无法打开\n\t\t\t\t\t");
		system("pause");
		return;
	}
	for (i = 0; i < j; i++) //建立运动员信息
		fwrite(&ids[i], L, 1, p);
	printf("\t\t\t\t\t输入1开始建立运动员信息 输入0结束\n\t\t\t\t\t");
	scanf("%d", &c);
	while (c)
	{
		printf("\t\t\t\t\t输入运动员姓名\n\t\t\t\t\t");
		scanf("%s", &ids[j].name);
		for (i = 0; i < j; i++)
			if (strcmp(ids[j].name, ids[i].name) == 0)
			{
				printf("\t\t\t\t\t该运动员已存在\n\t\t\t\t\t");
				system("pause");
				fclose(p);
				return;
			}
		printf("\t\t\t\t\t学院:\n\t\t\t\t\t");
		scanf("%s", &ids[j].xy);
		printf("\t\t\t\t\t项目:\n\t\t\t\t\t");
		scanf("%s", &ids[j].xm);
		printf("\t\t\t\t\t成绩:\n\t\t\t\t\t");
		scanf("%s", &ids[j].score);
		if (fwrite(&ids[j], L, 1, p) != 1)
		{
			printf("\t\t\t\t\t写入失败\n\t\t\t\t\t");
			system("pause");
			return;
		}
		else
		{
			printf("\t\t\t\t\t运动员信息 %s 写入成功\n", &ids[j].name);
			j++;
		}
		printf("\t\t\t\t\t是否继续输入?输入1继续 输入0结束\n\t\t\t\t\t");
		scanf("%d", &c);
	}
	fclose(p);
	printf("\t\t\t\t\t已关闭文件\n");
	printf("\t\t\t\t\t任意键返回主界面\n\t\t\t\t\t");
	system("pause");
}


void search()
{
	system("cls");
	printf("\n\n\n\n");
	if ((p = fopen("data.txt", "rb")) == NULL)
	{
		printf("\t\t\t\t\t打开文件失败\n\t\t\t\t\t");
		system("pause");
		return;
	}
	while (!feof(p))
		if (fread(&ids[j], L, 1, p) == 1)
			j++;
	fclose(p);
	if (j == 0)
	{
		printf("\t\t\t\t\t目前没有运动员信息\n\t\t\t\t\t");
		system("pause");
		return;
	}
	printf("\t\t\t\t\t请输入要查找的运动员姓名\n\t\t\t\t\t");
	scanf("%s", name);
	for (i = 0; i < j; i++)
		if (strcmp(ids[i].name, name) == 0)
		{
			printf("\t\t\t\t\t已找到运动员\n");
			printf("\t\t\t\t\t是否显示此运动员? 输入1显示 输入0不显示\n\t\t\t\t\t");
			scanf("%d", &c);
			if (c)
			{
				printf("\t\t\t姓名\t\t\t学院\t\t\t项目\t\t\t成绩\t\t\t\t\n");
				printf(FORMAT, DATA);
			}
			break;
		}
	if (i == j)
		printf("\t\t\t\t\t未查询到该运动员\n");
	printf("\t\t\t\t\t任意键返回主页面\n\t\t\t\t\t");
	system("pause");
}


void updata()
{
	system("cls");
	printf("\n\n\n\n");
	if ((p = fopen("data.txt", "rb")) == NULL)
	{
		printf("\t\t\t\t\t无法打开文件\n\t\t\t\t\t");
		system("pause");
		return;
	}
	while (!feof(p))
	{
		if (fread(&ids[j], L, 1, p) == 1)
			j++;
	}
	if (j == 0)
	{
		printf("\t\t\t\t\t目前还没有运动员\n");
		fclose(p);
		return;
	}
	fclose(p);
	all();
	printf("\t\t\t\t\t输入你想修改的运动员信息\n");
	printf("\t\t\t\t\t姓名:");
	scanf("%s", name);
	for (i = 0; i < j; i++)
	{
		if (strcmp(name, ids[i].name) == 0)
		{
			printf("\t\t\t\t\t已找到该运动员,请修改\n");
			printf("\t\t\t\t\t姓名:");
			scanf("%s", &ids[i].name);
			printf("\t\t\t\t\t学院:");
			scanf("%s", &ids[i].xy);
			printf("\t\t\t\t\t项目:");
			scanf("%s", &ids[i].xm);
			printf("\t\t\t\t\t成绩:");
			scanf("%s", &ids[i].score);
			fopen("data.txt", "wb");
			for (c = 0; c < j; c++)
				if (fwrite(&ids[c], L, 1, p) != 1)
				{
					printf("\t\t\t\t\t没有成功保存\n");
					system("pause");
					return;
				}
			printf("\t\t\t\t\t运动员 %s 的信息修改成功\n", name);
			fclose(p);
			break;
		}
	}
	if (i == j)
		printf("\t\t\t\t\t没有找到该运动员\n");
	printf("\t\t\t\t\t输入任意键返回主界面\n\t\t\t\t\t");
	system("pause");
}
void dlt()
{
	system("cls");
	printf("\n\n\n\n");

	if ((p = fopen("data.txt", "r+")) == NULL)
	{
		printf("\t\t\t\t\t目前没有文件\n\t\t\t\t\t");
		system("pause");
		return;
	}
	j = 0;
	while (!feof(p))
	{
		if (fread(&ids[j], L, 1, p) == 1)
		{
			j++;
		}
	}
	fclose(p);
	if (j == 0)
	{
		printf("\t\t\t\t\t目前没有运动员信息\n\t\t\t\t\t");
		system("pause");
		return;
	}
	printf("\t\t\t\t\t输入你想删除的运动员姓名: ");
	scanf("%s", name);
	for (i = 0; i < j; i++)
	{
		if (strcmp(name, ids[i].name) == 0)
		{
			printf("\t\t\t\t\t已找到该运动员,是否删除 1 确定 0 取消\n");
			printf("\t\t\t姓名\t\t\t学院\t\t\t项目\t\t\t成绩\t\t\t\t\n");
			printf(FORMAT, DATA);
			printf("\n\t\t\t");
			scanf("%d", &k);
			if (k)
			{
				for (n = i; n < j; n++)
				{
					ids[n] = ids[n + 1];
				}
				j -= 1;
			}
			break;
		}
	}
	fopen("data.txt", "wb");
	for (i = 0; i < j; i++)
	{
		if (fwrite(&ids[i], L, 1, p) != 1)
		{
			printf("\t\t\t\t\t没有修改成功\n");
			system("pause");
			return;
		}
	}
	printf("\t\t\t\t\t运动员 %s 的信息删除成功\n", name);
	fclose(p);
	printf("\t\t\t\t\t输入任意键返回主界面\n\t\t\t\t\t");
	system("pause");
}


void chaxunxiangmu()
{
	system("cls");
	printf("\n\n\n\n");
	char proname[15];
	int i; 

	if ((p = fopen("data.txt", "r+")) == NULL)
	{
		printf("\t\t\t\t\t目前没有文件\n\t\t\t\t\t");
		system("pause");
		return;
	}
	j = 0;
	while (!feof(p))
	{
		if (fread(&ids[j], L, 1, p) == 1)
		{
			j++;
		}
	}
	fclose(p);
	if (j == 0)
	{
		printf("\t\t\t\t\t目前没有项目信息\n\t\t\t\t\t");
		system("pause");
		return;
	}
	printf("\t\t\t\t\t请输入任意一个项目的名称以获取相关的信息\n"); 
	scanf("%s", proname);
	while(!feof(p))
	{
		int m; 
		int p=0;
		if(strcmp(proname, ids[m].xm) == 0&&p==0)
		{
			printf("\t\t\t姓名\t\t\t学院\t\t\t项目\t\t\t成绩\t\t\t\t\n");
			p=1;
		}
		if(strcmp(proname, ids[m].xm) == 0)
		{
			printf("\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t\t\n",ids[m].name,ids[m].xy,ids[m].xm,ids[m].score);
			printf("\n");
		}
		m++;	
	}

	printf("\t\t\t\t\t项目 %s 的信息查找成功\n", proname);
	printf("\t\t\t\t\t输入任意键返回主界面\n\t\t\t\t\t");
	system("pause");
}

void chaxunxueyuan()
{
	system("cls");
	printf("\n\n\n\n");
	char proname[15];
	int i; 

	if ((p = fopen("data.txt", "r+")) == NULL)
	{
		printf("\t\t\t\t\t目前没有文件\n\t\t\t\t\t");
		system("pause");
		return;
	}
	j = 0;
	while (!feof(p))
	{
		if (fread(&ids[j], L, 1, p) == 1)
		{
			j++;
		}
	}
	fclose(p);
	if (j == 0)
	{
		printf("\t\t\t\t\t目前没有项目信息\n\t\t\t\t\t");
		system("pause");
		return;
	}
	printf("\t\t\t\t\t请输入任意一个学院的名称以获取相关的信息\n"); 
	scanf("%s", proname);
	while(!feof(p))
	{
		int m; 
		int p=0;
		if(strcmp(proname, ids[m].xy) == 0&&p==0)
		{
			printf("\t\t\t姓名\t\t\t学院\t\t\t项目\t\t\t成绩\t\t\t\t\n");
			p=1;
		}
		if(strcmp(proname, ids[m].xy) == 0)
		{
			printf("\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t\t\n",ids[m].name,ids[m].xy,ids[m].xm,ids[m].score);
			printf("\n");
		}
		m++;	
	}
	fopen("data.txt", "wb");
	printf("\t\t\t\t\t学院 %s 的信息查找成功\n", proname);
	fclose(p);
	printf("\t\t\t\t\t输入任意键返回主界面\n\t\t\t\t\t");
	system("pause");

}


void xmxx(){
		system("cls");
	printf("\n\n\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|                                              |\n");
	printf("\t\t\t\t|                项目信息                      |\n");
	printf("\t\t\t\t|田赛:                                        |\n");
	printf("\t\t\t\t|铅球投掷(预赛、决赛)                          |\n");
	printf("\t\t\t\t|跳高    (预赛、决赛)                          |\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|径赛:                                        |\n");
	printf("\t\t\t\t|100m跑  (预赛、决赛)                          |\n");
	printf("\t\t\t\t|200m跑  (预赛、决赛)                          |\n");
	printf("\t\t\t\t|400m跑  (预赛、决赛)                          |\n");
	printf("\t\t\t\t|800m跑  (预赛、决赛)                          |\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t\t输入任意键返回主界面\n\t\t\t\t\t");
	system("pause");

} 
void zhixuce(){

		system("cls");
	printf("\n\n\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|                                              |\n");
	printf("\t\t\t\t|                运动会秩序册                  |\n");
	printf("\t\t\t\t|运动会第一天                                  |\n");
	printf("\t\t\t\t|上午:                                        |\n");
	printf("\t\t\t\t|   时间              项目                     |\n");
	printf("\t\t\t\t|8:00~8:40         100m跑  (预赛)            |\n");
	printf("\t\t\t\t|9:00~10:40        200m跑  (预赛)            |\n");
	printf("\t\t\t\t|11:00~11:40       400m跑  (预赛)            |\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|下午:                                        |\n");
	printf("\t\t\t\t|   时间              项目                     |\n");
	printf("\t\t\t\t|14:00~14:40       800m跑  (预赛)            |\n");
	printf("\t\t\t\t|15:00~15:40       立定跳远(预赛)            |\n");
	printf("\t\t\t\t|16:00~16:40       三级跳远(预赛)            |\n");
	printf("\t\t\t\t|17:00~17:40       铅球投掷(预赛)            |\n");
	printf("\t\t\t\t|17:00~17:40       跳高    (预赛)            |\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|运动会第二天                                  |\n");
	printf("\t\t\t\t|上午:                                        |\n");
	printf("\t\t\t\t|   时间              项目                     |\n");
	printf("\t\t\t\t|8:00~8:40         100m跑  (决赛)            |\n");
	printf("\t\t\t\t|9:00~10:40        200m跑  (决赛)            |\n");
	printf("\t\t\t\t|11:00~11:40       400m跑  (决赛)            |\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|下午:                                        |\n");
	printf("\t\t\t\t|   时间              项目                     |\n");
	printf("\t\t\t\t|14:00~14:40       800m跑  (决赛)            |\n");
	printf("\t\t\t\t|15:00~15:40       立定跳远(决赛)            |\n");
	printf("\t\t\t\t|16:00~16:40       三级跳远(决赛)            | \n");
	printf("\t\t\t\t|17:00~17:40       铅球投掷(决赛)            |\n");
	printf("\t\t\t\t|18:00~18:40       跳高    (决赛)            | \n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	printf("\t\t\t\t|----------------------------------------------|\n");
	
	system("pause");
}
main()
{
	char s[20];
	printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t请输入密码以进入系统:");
	scanf("%s", s);
	if (strcmp(s, "123456") == 0)	//密码
	{

		void menu();
		void input();
		void search();
		void updata();
		void dlt();
		void all();
	repeat:
		menu();
		scanf("%d", &n);
		while (n)
		{
			switch (n)
			{
			case 1:
				input();
				break;
			case 2:
				search();
				break;
			case 3:
				updata();
				break;
			case 4:
				dlt();
				break;
			case 5:
				all();
				break;
			case 6:
			    chaxunxiangmu(); 
				break; 
			case 7:
		     	chaxunxueyuan(); 
			break;
			case 8:
			    xmxx(); 
			    break; 
			case 9:
			    zhixuce();
				break; 
			}
			goto repeat;
		}
	}
	else
		printf("密码输入错误!系统已关闭!");
	return 0;
}

选项二:

选项三:

选项四:

删除后如选项五所示

选项五:

版权声明:本文为博主作者:stu_kk原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_54409739/article/details/125822687

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年1月3日
下一篇 2024年1月3日

相关推荐