本文为数据结构与算法课设《田径比赛的时间安排问题》课题的一个分享,使用涂色算法和菜单导航来实现安排最合理的赛程安排。在原先的基础上没有进行大的改动,只做了一些优化。
(*对于C语言的widdows库函数应该了解学习一下)
目录
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