数据结构课程设计预习报告

  应学校数据结构课程设计要求,写一点课程设计作业的内容。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代表不临接。

四.结语

详细代码即思路详见实验报告。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值