应学校数据结构课程设计要求,写一点课程设计作业的内容。c++水平有限,代码不好求指教。
一.题目要求
本次作业要求写一个竞赛管理系统,大致分三部分内容。
第一部分,要求实现从文件中读取参赛队伍。队伍的添加、修改、删除、排序等基本操作。
第二部分,要求实现对不同竞赛类型的队伍进行考场分配,分配到17个考场,并实现对每个考场的队伍的竞赛状态进行模拟动态展示。每个考场按照初赛成绩分考试的先后顺序。
第三部分要求对队伍提供比赛校区内的最近路线提示。
二.实现思路
1.team.h team.cpp
#pragma once
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class team {
public:
string id;
string workname;
string school;
string types;
string name;
string director;
int grade = 60;
team(string id1, string workname1, string school1, string types1, string name1, string director1);
void showinformation();
};
//员工的编号与位置
class numplace {
public:
int id;
int position;
string id2;
// 0表示侯赛 1表示比赛中 2表示参赛结束
//int time = 0;
};
以上是team.h中的函数定义。第一个team类定义了每个队伍的7项属性,分别是id 队伍编号 workname是作品名称,school是学生的学校,name是学生名字,dirctor是指导老师。grade是初赛成绩,默认60;定义了构造函数和showinformation函数。showinformation主要负责在屏幕上展示队伍信息。
numplace类主要是为了后续排序方便定义。position将会存储某个team在数组中的序号信息,id2存储作品类别,id存储初赛成绩,用于后续以成绩为依据 的排序。
2.manage.h和manage.cpp
#pragma once
#include<iostream>
#include<string>
#include"team.h"
#include<fstream>
using namespace std;
class manage {
public:
manage();
bool fileisempty;
//总队伍数
int number = 0;
//指向队伍指针数组的指针;
team** p;
//分配考场后的队伍名单
numplace list[17][200];
//分配考场并展示结果
void showpoint();
//查询分配结果
void searchpoint();
//考场动态显示
void showstatement();
//声名展示菜单
void showmenu();
//声明退出系统
void exist();
//声明添加队伍
void addteam();
//保存数据
void save();
//初始化对象
void chushi();
//显示队伍信息
void showinformation();
//删除队伍信息
void deleteteam();
//修改队伍信息
void changeteam();
//搜索队伍信息
void search();
//给队伍排序显示
void place();
//删除全部队伍
void deleteall();
int getfilenumber();
//随机分配成绩
void givegrade();
//导航查询服务
void guide();
};
以上是操作面板的类manage的函数和属性定义。构造函数中负责在确定文件中有数据,初始化一些参数,并调用chushi函数导入数据。fileisempty参数判断文件中是否有数据,number参数记录目前队伍人数。team**p是一个队伍类的二级指针。它将指向一个一级指针数组,每个元素是一个指向team类的指针。list是分配考场后的存储数组,17行分别存储17个考场中的队伍信息。后续内容已在注释中表明。
3.源.cpp
#include <iostream>
#include<string>
#include"manage.h"
#include"team.h"
using namespace std;
int main() {
manage a;
while (true) {
a.showmenu();
cout << "请输入选择的功能:";
int choice;
cin >> choice;
if (choice == 1 || choice == 3 || choice == 4 || choice == 7 || choice == 8 || choice == 9) {
cout << "请输入管理员密码:";
string password;
cin >> password;
if (password != "我们青水玩家实在是太有操作了") {
cout << "密码错误";
system("pause");
system("cls");
continue;
}
}
switch (choice)
{
case 0: a.exist(); break;
case 1:a.addteam(); break;
case 2:a.showinformation(); break;
case 3:a.deleteteam(); break;
case 4:a.changeteam(); break;
case 5:a.search(); break;
case 6:a.place(); break;
case 7:a.deleteall(); break;
case 8:a.givegrade(); break;
case 9:a.showpoint(); break;
case 10:a.searchpoint(); break;
case 11:a.showstatement(); break;
case 12:a.guide(); break;
default:
cout << "输入错误";
system("pause");
system("cls");
}
}
}
此文件是程序的入口,展示操作菜单然后进入一个无限循环。输入需要的选择的功能,功能使用结束后进行下一次循环。指导选择0功能推出程序,调用exit函数推出程序。并且再选择某些重要功能前需要输入管理员密码,否则直接进入下一循环重选功能。
由于防止抄袭这里不展示完整代码,下面展示程序的功能和截图。并对用到的算法进行介绍。
三.程序运行即原理展示
以上是操作界面,还有第二个功能打印参赛队员信息的功能的示例。每次调用功能结束将用system(‘pause)和system(’cls‘)语句重新清屏回到开始界面。
上图是采用冒泡排序的功能,以初赛成绩为排序指标。初赛成绩将有以下语句随机赋予:srand(time(0));
int i = 0;
while (i < number) {
p[i]->grade = (rand() % (100 - 60 + 1)) + 60;
i++;
}
save();
cout << "成绩已分配";
system("pause");
system("cls");
以上是查找功能,根据队伍编号进行顺序查找。
以上为队伍添加功能,并在添加后进行查找。
功能9为队伍分配考场,保证竞赛项目相同分配到同考场,可以通过10功能查询每个考场的队伍,由于无法上传视频,这里仅放一张动态轮播截图,下附代码。
//先进行插入排序
int i;
cout << "请输入考场号(1到17)";
cin >> i;
int length=0;
i = i - 1;
while (list[i][length].id != NULL) {
length++;
}
int i1, j1;
numplace temp;
for (i1 = 1; i1 < length; i1++) {
temp = list[i][i1];
for (j1 = i1 - 1; j1 >= 0 && temp.id > list[i][j1].id; j1--) {
list[i][j1 + 1] = list[i][j1];
}
list[i][j1 + 1] = temp;
}
int cansai = 0;
while (cansai<length) {
int z = 0;
system("cls");
while (z < length) {
cout << p[list[i][z].position]->id << " " << p[list[i][z].position]->workname << " " << p[list[i][z].position]->name << " "<< p[list[i][z].position]->grade<<" ";
if (z>cansai) {
cout << "侯赛中" << endl;
}
else if (z==cansai) {
cout << "参赛中"<<endl;
}
else if (z<cansai) {
cout << " 参赛结束" << endl;
}
z++;
}
cansai++;
Sleep(1500);
}
system("pause");
system("cls");
使用插入排序,从高到低排序,然后动态轮播。
导航功能使用迪杰斯特拉算法求最短路,顶点和邻接矩阵如下:
string vertex[10] = {"西区公交站","西食堂","明德园","文体中心","西操场","文理大楼","北苑食堂","求索园","东食堂","图书馆"};
int edge[10][10] = { {0,200,10000,400,10000,10000,10000,10000,10000,10000},
{200,0,160,300,10000,10000,10000,10000,10000,10000},
{10000,160,0,10000,240,220,10000,10000,10000,10000},
{400,300,10000,0,100,10000,10000,10000,10000,10000},
{10000,10000,240,100,0,10000,10000,300,460,10000},
{10000,10000,220,10000,10000,0,160,120,10000,10000},
{10000,10000,10000,10000,10000,160,0,10000,10000,200},
{10000,10000,10000,10000,300,120,10000,0,180,140},
{10000,10000,10000,10000,460,10000,10000,180,0,100},
{10000,10000,10000,10000,10000,10000,200,140,100,0} };
单位为米,10000代表不临接。
四.结语
详细代码即思路详见实验报告。