田径比赛的时间安排问题(数据结构与算法课设)(C语言版)

        本文为数据结构与算法课设《田径比赛的时间安排问题》课题的一个分享,使用涂色算法和菜单导航来实现安排最合理的赛程安排。在原先的基础上没有进行大的改动,只做了一些优化。

(*对于C语言的widdows库函数应该了解学习一下)

目录

1.设计目的与要求

2.代码实现

1.结构体定义

2.全局变量和变量定义

3.键入信息或者文件导入

4.打印邻接矩阵

5.着色和涂色算法

6.输出时间安排

7.菜单函数与主函数

8.装饰:开场欢迎和结束

*9.完整代码 


1.设计目的与要求

设计内容:

设某田径比赛共有m个比赛项目,规定每个选手至多可参加三个项目,有n人报名参加比赛。设计比赛日程表,使得比赛能在尽可能短的时间内完成。要求:m个比赛项目及人员的报名情况表均事先存储在文件中,需要用数据时从文件中读取。

设计要求:

(1) 符合课题要求,实现相应功能;

(2) 要求界面友好美观,操作方便易行;

(3) 注意程序的实用性、安全性

2.代码实现

1.结构体定义

struct Node {
	int number;
	int item; //度  
	int color;  //颜色  
}node[MAX];

typedef struct Race {
	char name[MAX];
}race[9];

         结构体定义一个图的结构来实现功能。


2.全局变量和变量定义

using namespace std;

#define OVERFLOW  -2         //内存溢出错误常量
#define ILLEGAL  -1          //非法操作错误常量 
#define OK 1                //表示操作正确的常量 
#define ERROR 0             //表示操作错误的常量
#define MAX  20				//最大比赛项目数量 

int a[MAX][MAX] = { 0 };
int i, j, x;
FILE* filep;
FILE* f;
int b[3], item, temp;
char c, ch;
bool flag = false;//判断用户是否输入数据 

3.键入信息或者文件导入

void DataFromKeyboard()
{
	cout << endl;
	cout << "\t =============================================================================\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||             ★★★★★★★你选择的方法是键盘输入★★★★★★★             ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||============================================================================||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||                          本届田径比赛的项目种类                            ||\n";
	cout << "\t||               [1]110米跑步      [2]100米跑步      [3]跳高                  ||\n";
	cout << "\t||               [4]1000米长跑     [5]800米长跑      [6]110米跨栏             ||\n";
	cout << "\t||               [7]100米跨栏      [8]跳远           [9]铅球                  ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||============================================================================||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||    接下来的每一行是该运动员所参加的所有运动项目序号(每人最多参加三项)    ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||                              以 0 结束输入                                 ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||============================================================================||\n";

	while (c != '0')
	{
		c = getchar();
		if (c == '\n')
		{
			for (j = 0; j < i - 1; j++)
				a[b[j]][b[j + 1]] = a[b[j + 1]][b[j]] = 1;

			if (i == 3)
				a[b[0]][b[2]] = a[b[2]][b[0]] = 1;

			i = 0;
			cout << "\t\t\t\t\t";
		}
		if (c > '0' && c <= '9')
			b[i++] = c - 48;
		if (c == '0')
			break;
	}

	for (i = 1; i < 10; i++)
	{
		item = 0;
		for (j = 1; j < 10; j++)
		{
			if (a[i][j])
				item++;
		}
		node[i].item = item;
		node[i].number = i;
		node[i].color = 0;    //0表示初始化无颜色 
	}


	cout << "\t||                                                                            ||\n";
	cout << "\t||             ★★★★★★★数据已成功录入★★★★★★★                     ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t =============================================================================\n";

	flag = true;

	//着色
	Draw(1, 1);

	//按颜色排序
	qsort(node + 1, 6, sizeof(node[1]), cmp);

	cout << "\n\n\n";
	cout << "按任意键继续...";
	getchar();
	getchar();
	system("CLS");
}
void DataFromFile()
{
	cout << endl;
	cout << "\t =============================================================================\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||             ★★★★★★★你选择的方法是文件导入★★★★★★★             ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||============================================================================||\n";
	cout << "\t||============================================================================||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||                            请确保文件中的格式为                            ||\n";
	cout << "\t||    接下来的每一行是该运动员所参加的所有运动项目序号(每人最多参加三项)    ||\n";
	cout << "\t||                                                                            ||\n";
	cout << "\t||============================================================================||\n";
	cout << "\t||                              是否继续(y或n)                              ||\n";
	cout << "\t||============================================================================||\n";
	char op;//记录用户选择 

re://用户输入错误 
	cout << "\t\t\t\t\t请输入:";
	cin >> op;
	if (op == 'n' || op == 'N')
	{
		cout << "即将返回主菜单,请稍等...";
		Sleep(3500);
		system("CLS");
		return;
	}
	else if (op == 'y' || op == 'Y');
	else
	{
		cout << "\t||                              输入错误重新输入                              ||\n";
		goto re;
	}


	char FileName[100];  //文件名
	cout << "\t||============================================================================||\n";
	cout << "\t\t\t\t   请输入文件名称:";
	cin >> FileName;

	cout << "\t||============================================================================||\n";

	f = fopen(FileName, "r");
	c = fgetc(f);


	//读取文件并输出
	if ((filep = fopen(FileName, "r")) == NULL)
	{
		cout << "\t\t\t打开文件错误!" << endl;
		cout << "\t\t\t即将返回主菜单...";
		Sleep(3500);
		system("CLS");
		return;
	}

	ch = fgetc(filep);
	while (ch != EOF)
	{
		//	putchar(ch);
		ch = fgetc(filep);
	}

	//把文件里的数据录入到矩阵里
	i = 0;
	while (c != EOF)
	{
		if (c == '\n')
		{
			for (j = 0; j < i - 1; j++)
				a[b[j]][b[j + 1]] = a[b[j + 1]][b[j]] = 1;

			if (i == 3)
				a[b[0]][b[2]] = a[b[2]][b[0]] = 1;

			i = 0;
		}
		if (c >= '0' && c <= '9')
			b[i++] = c - 48;

		c = fgetc(f);
	}
	for (i = 1; i < 10; i++)
	{
		item = 0;
		for (j = 1; j < 10; j++)
		{
			if (a[i
  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值