数据结构课设:迷宫问题

news2024/11/17 2:43:57

文章目录

  • 前言
  • 一、概要设计
    • 1、基本信息
    • 2、功能模块图
    • 3、功能描述
    • 4、调用关系图
    • 5、结果演示
      • ① 创建迷宫
      • ② 求解
      • ③ 清除多余路径
  • 二、完整代码

前言

最近刚好在写自己的课设,匆匆忙忙写出来的课设系统,仍有不足,拿出来和大家分享一下,希望能对大家有帮助。

一、概要设计

1、基本信息

具体功能包括:
(1) 选择创建的迷宫的方式:文件读取、用户输入、系统随机生成。
(2) 向用户展示生成的迷宫
(3) 选择求解的方式(DFS or BFS)
(4) 向用户展示迷宫路径
(5) 用户选择是否去掉多余路径

开发环境:VS2019

2、功能模块图

在这里插入图片描述

3、功能描述

(1) 迷宫的创建:文件读取(提前在文件中写好迷宫直接读取),用户输入(用户手动输入),系统随机生成(rand%2的方式随机生成迷宫)
(2) 求解方式:DFS(通过栈,以及DFS回溯的方式求解),BFS(通过队列,以及BFS穷举的方式求解)
(3) 去掉多余路径:多余标记全部删除

4、调用关系图

在这里插入图片描述

5、结果演示

提前在源文件同一目录下创建好这两个文件
在这里插入图片描述

① 创建迷宫

在这里插入图片描述
读取文件:
提前在文件 maze_information.txt 中写好,迷宫矩阵:
在这里插入图片描述
用户输入:
在这里插入图片描述
系统随机生成:
在这里插入图片描述

② 求解

栈+DFS:
在这里插入图片描述

队列 + BFS:
在这里插入图片描述

③ 清除多余路径

栈+DFS:
在这里插入图片描述

队列 + BFS:
在这里插入图片描述

二、完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<Windows.h>
#include<time.h>

typedef int Status;                     // 下一个通道方向  
#define RANGE 100                       // 迷宫大小  
#define STACK_INIT_SIZE 100             // 栈的初始大小
#define STACKINCREMENT 10               // 栈的储存增量
#define ROW 10                          // 迷宫的行数
#define COL 10                          // 迷宫的列数    

// 迷宫
typedef struct
{
    int m, n;
    int arr[RANGE][RANGE];              // 迷宫数组
}MazeType;    

//坐标(row,col)
typedef struct
{
    int row;                            // 迷宫中的行
    int col;                            // 迷宫中的列
}PosType;     

// 路径
typedef struct
{
    int step;                           // 当前位置在路径上的"序号"
    PosType seat;                       // 当前坐标
    Status di;                          // 往下一个坐标位置的方向
}SElemType;

// 定义栈
typedef struct
{
    SElemType* base;                    // 栈底
    SElemType* top;                     // 栈顶
    int stacksize;                      // 栈长
}SqStack;

// 定义队列
typedef struct
{
    PosType seat;                       // 当前坐标
    int pre;                            // 父节点
}Strnode;
Strnode que[ROW * COL];

// 原始迷宫,其中'1'表示墙,'0'表示通道
int a[ROW][COL];

// 创建迷宫
void ChoiceMazeInterface();                                                     // 选择创建方式界面
int ReadMaze(int a[ROW][COL]);                                                  // 读取文件中迷宫
int WriteMaze(int a[ROW][COL]);                                                 // 用户输入迷宫
int CreateMaze(int a[ROW][COL]);                                                // 随机迷宫
int SaveMaze(MazeType& maze);                                                  // 保存文件

// 栈的实现
int InitStack(SqStack& s);                                                      // 栈的初始化
int GetTop(SqStack s, SElemType& e);                                            // 当栈s不为空时,返回栈顶e
int Push(SqStack& s, SElemType e);                                              // 入栈
int Pop(SqStack& s, SElemType& e);                                              // 出栈
int StackEmpty(SqStack s);                                                      // 判空栈
int DestoryStack(SqStack& s);                                                   // 销毁栈

// 迷宫操作
int InitMaze(MazeType& maze, int a[ROW][COL]);                                  // 初始化迷宫
int Pass(MazeType maze, PosType curpos);                                        // 判断当前节点是否走过
int FootPrint(MazeType& maze, PosType curpos);                                  // 标记可以通过
int MarkPrint(MazeType& maze, PosType curpos);                                  // 标记不能通过
SElemType CreateSElem(int step, PosType pos, int di);                           // 创建路径
PosType NextPos(PosType curpos, Status di);                                     // 移动
int PosEqual(PosType pos1, PosType pos2);                                       // 判断是不是出口
void PrintMaze(MazeType maze, int row, int col);                                // 打印路径

// 实现方法
void Welcome();                                                                 // 迷宫路径界面
int DepthFirstInterface(MazeType& maze, PosType start, PosType end);            // 深搜界面
int DepthFirstMazePath(MazeType& maze, PosType start, PosType end);             // 深搜求解迷宫maze中,从入口start到出口end的一条路径
int BreadthFirstInterface(MazeType& maze, PosType start, PosType end);          // 广搜界面
int BreadthFirstMazePath(MazeType& maze, PosType start, PosType end);           // 广搜求解迷宫maze中,从入口start到出口end的一条路径
void Sign(MazeType& maze, int ans);                                             // 广搜标记地图
void Clean(MazeType& maze);                                                     // 清除错误路径
void GoodBye();                                                                 // 结束

int main()
{
    int i, j;
    int choice;
    PosType start, end;      //开始,终点坐标
    MazeType maze;

    while (1) 
    {
        ChoiceMazeInterface();
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            ReadMaze(a);
            break;
        case 2:
            WriteMaze(a);
            break;
        case 3:
            CreateMaze(a);
            break;
        default:
            GoodBye();
            break;
        }

        while (1)
        {
            InitMaze(maze, a);                 // 初始化迷宫
            system("cls");
            printf("\n-------------------------------------------------\n");
            printf("\n迷宫如下:\n");
            PrintMaze(maze, ROW, COL);
            printf("\n-------------------------------------------------\n");
            printf("\n请输入迷宫起点坐标:");
            scanf("%d %d", &start.row, &start.col);
            printf("\n请输入迷宫终点坐标:");
            scanf("%d %d", &end.row, &end.col);

            Welcome();
            scanf("%d", &choice);
            switch (choice)
            {
            case 1:
                if (DepthFirstInterface(maze, start, end))
                {
                    system("cls");
                    printf("\n--------------      栈 + 深搜      --------------\n");
                    Clean(maze);
                }
                break;
            case 2:
                if (BreadthFirstInterface(maze, start, end))
                {
                    system("cls");
                    printf("\n--------------     队列 + 广搜     --------------\n");
                    Clean(maze);
                }
                break;
            case 0:
                GoodBye();
                break;
            default:
                break;
            }
            SaveMaze(maze);
            printf("\n-------------------------------------------------\n");
            printf("是否需要继续对该迷宫操作?(Yes:1 / No:0):");
            scanf("%d", &choice);
            if (choice == 0)
                break;
        }
    }
    GoodBye();
}

// 选择创建方式界面
void ChoiceMazeInterface()
{
    system("cls");
    printf("****************************************************************\n");
    printf("***********               迷宫创建                   ***********\n");
    printf("***********          1 ---- 读取文件                 ***********\n");
    printf("***********          2 ---- 用户输入                 ***********\n");
    printf("***********          3 ---- 随机生成                 ***********\n");
    printf("***********       else ---- 退出                     ***********\n");
    printf("****************************************************************\n");

    printf("请选择想要创建迷宫的方式(数字):");
}

// 读取文件
int ReadMaze(int a[ROW][COL])
{
    FILE* pfRead = fopen("maze_information.txt", "r");

    if (pfRead == NULL)
    {
        return 0;
    }

    for (int i = 1; i < ROW - 1; i++)
    {
        for (int j = 1; j < COL - 1; j++)
        {
            fscanf(pfRead, "%d", &a[i][j]);
        }
        fscanf(pfRead, "\n");
    }
    fclose(pfRead);
    return 1;
}

// 保存文件
int SaveMaze(MazeType& maze)
{
    FILE* pfRead = fopen("maze_answer.txt", "w");

    if (pfRead == NULL)
    {
        return 0;
    }

    for (int i = 1; i < ROW - 1; i++)
    {
        for (int j = 1; j < COL - 1; j++)
        {
            fprintf(pfRead, "%d", maze.arr[i][j]);
        }
        fprintf(pfRead, "\n");
    }
    fclose(pfRead);
    return 1;
}

// 用户输入迷宫
int WriteMaze(int a[ROW][COL])
{
    printf("\n-------------------------------------------------\n");
    printf("\n请输入原始迷宫:(8×8)\n");
    printf("(其中'1'表示墙,'0'表示通道)\n");
    for (int i = 1; i < ROW - 1; i++)
    {
        printf("请输入第 %d 行:", i);
        for (int j = 1; j < COL - 1; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    return 1;
}

// 随机迷宫
int CreateMaze(int a[ROW][COL])
{
    srand(time(0));
    for (int i = 1; i < ROW - 1; i++)
    {
        for (int j = 1; j < COL - 1; j++)
        {
            if ((rand() % 100 + 1) % 2 == 0)
                a[i][j] = 0;
            else
                a[i][j] = 1;
        }
    }
    return 1;
}

// 栈的初始化
int InitStack(SqStack& s)
{
    s.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!s.base)
        exit(0);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return 1;
}

// 当栈s不为空时,返回栈顶e
int GetTop(SqStack s, SElemType& e)
{
    // 判空栈
    if (s.top == s.base)
        return 0;
    e = *(s.top - 1);
    return 1;
}

// 入栈
int Push(SqStack& s, SElemType e)
{
    // 判满栈
    if (s.top - s.base >= s.stacksize)
    {                                 
        // 若栈满,追加存储空间
        s.base = (SElemType*)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!s.base)
            exit(0);
        s.top = s.base + s.stacksize;
        s.stacksize += STACKINCREMENT;
    }
    *s.top++ = e;
    return 1;
}

// 出栈
int Pop(SqStack& s, SElemType& e)
{
    // 判空栈
    if (s.top == s.base)
        return 0;
    e = *--s.top; //e指向新栈顶
    return 1;
}

// 判空栈
int StackEmpty(SqStack s)
{
    return s.base == s.top;
}

// 销毁栈
int DestoryStack(SqStack& s)
{
    free(&s);
    return 1;
}

// 初始化迷宫
int InitMaze(MazeType& maze, int a[ROW][COL])  
{
    // 设置迷宫maze的初值,包括加上边缘一圈的值
    int i, j;                            
    for (i = 1; i < ROW - 1;i++)
    {
        for (j = 1; j < COL - 1; j++)
        {
            maze.arr[i][j] = a[i][j];
        }
    }

    //加上围墙
    for (j = 0; j < ROW; j++)
        maze.arr[0][j] = maze.arr[ROW - 1][j] = 1;
    for (i = 0; i < COL; i++)
        maze.arr[i][0] = maze.arr[i][COL - 1] = 1;
    return 1;
}

// 判断当前节点是否走过
int Pass(MazeType maze, PosType curpos)
{
    if (maze.arr[curpos.row][curpos.col] == 0)
        return 1;
    else
        return 0;
}

// 标记可以通过
int FootPrint(MazeType& maze, PosType curpos)
{
    // 标记为2表示可以通过
    maze.arr[curpos.row][curpos.col] = 2;
    return 1;
}

// 标记不能通过
int MarkPrint(MazeType& maze, PosType curpos)
{
    // 标记为3表示不能通过
    maze.arr[curpos.row][curpos.col] = 3;
    return 1;
}

// 创建路径
SElemType CreateSElem(int step, PosType pos, int di)
{
    SElemType e;
    e.step = step;
    e.seat = pos;
    e.di = di;
    return e;
}

// 移动
PosType NextPos(PosType curpos, Status di)   
{
    // 返回当前节点的下一节点
    PosType pos = curpos;
    switch (di)
    {
    case 1:        //右
        pos.col++;
        break;
    case 2:        //下
        pos.row++;
        break;
    case 3:        //左
        pos.col--;
        break;
    case 4:        //上
        pos.row--;
        break;
    }
    return pos;
}

// 判断是不是出口
int PosEqual(PosType pos1, PosType pos2)
{
    if (pos1.row == pos2.row && pos1.col == pos2.col)
        return 1;
    else
        return 0;
}

// 打印路径
void PrintMaze(MazeType maze, int row, int col)
{
    int i, j;
    printf("  ");
    for (i = 0; i < col; i++)
        printf("%d ", i);
    printf("\n");
    for (i = 0; i < row; i++)
    {
        printf("%d ",i);
        for (j = 0; j < col; j++)
        {
            switch (maze.arr[i][j])
            {
            case 0:
                printf("  ");                        // 没走过,但是通路
                break;
            case 1:
                printf("■");                        // 墙,障碍物
                break;

            case 2:
                printf("* ");                         // 走过且走得通
                break;
            case 3:
                printf("@ ");                         // 走过但走不通,死胡同
                break;
            default:
                break;
            }
        }
        printf("\n");
    }
}

// 迷宫路径界面
void Welcome()
{
    system("cls");
    printf("****************************************************************\n");
    printf("***********               迷宫路径                   ***********\n");
    printf("***********          1 ---- 栈 + 深搜                ***********\n");
    printf("***********          2 ---- 队列 + 广搜              ***********\n");
    printf("***********          0 ---- 退出                     ***********\n");
    printf("****************************************************************\n");

    printf("请选择想要查看的方法路径(数字):");
}

// 深搜界面
int DepthFirstInterface(MazeType& maze, PosType start, PosType end) 
{
    system("cls");
    printf("\n--------------      栈 + 深搜      --------------\n");
    InitMaze(maze, a);
    // 如果找到一条路径
    if (DepthFirstMazePath(maze, start, end))
    {
        printf("\n-------------------------------------------------\n");
        printf("\n迷宫路径如下:\n");
        printf("(其中'*'表示求解路径,'@'表示死胡同)\n");
        // 输出迷宫路径
        PrintMaze(maze, ROW, COL);
        printf("\n\n");
        printf("是否需要清除错误路径?(Yes:1 / No:0):");
        int choice;
        scanf("%d", &choice);
        return choice;
    }
    // 没有通路
    else
        printf("\n--------------从入口到出口没有通路!--------------\n");
    printf("\n\n");
    return 0;
}

// 深搜求解迷宫maze中,从入口start到出口end的一条路径
int DepthFirstMazePath(MazeType& maze, PosType start, PosType end)
{                               
    SqStack s;
    SElemType e;
    InitStack(s);
    PosType curpos = start;

    // 探索第一步
    int curstep = 1;                                
    do {
        // 如果当前位置可以通过,即是未曾走到的通道块
        if (Pass(maze, curpos))
        {
            FootPrint(maze, curpos);                // 标记
            e = CreateSElem(curstep,curpos, 1);     // 创建元素
            Push(s, e);                             // 加入路径

            // 到达终点(出口)
            if (PosEqual(curpos, end))
                return 1;

            curpos = NextPos(curpos, 1);            // 获得下一节点
            curstep++;                              // 继续探索
        }
        else
        {                                           
            // 当前位置不能通过
            if (!StackEmpty(s))
            {
                Pop(s, e);
                while (e.di == 4 && !StackEmpty(s)) // 找寻了四个方向
                {
                    // 留下不能通过的标记,并退回一步
                    MarkPrint(maze,e.seat);
                    Pop(s, e);
                }
                if (e.di < 4)
                {
                    // 换一个方向探索
                    e.di++;
                    Push(s, e);
                    // 设定当前位置是该方向上的相邻块
                    curpos = NextPos(e.seat, e.di);
                }
            }
        }
    } while (!StackEmpty(s));
    return 0;
}

// 广搜界面
int BreadthFirstInterface(MazeType& maze, PosType start, PosType end)
{
    system("cls");
    printf("\n--------------     队列 + 广搜     --------------\n");
    InitMaze(maze, a);
    // 如果找到一条路径
    if (BreadthFirstMazePath(maze, start, end))
    {
        printf("\n-------------------------------------------------\n");
        printf("\n迷宫路径如下:\n");
        printf("(其中'*'表示求解路径,'@'表示死胡同)\n");
        // 输出迷宫路径
        PrintMaze(maze, ROW, COL);
        printf("\n\n");
        printf("是否需要清除错误路径?(Yes:1 / No:0):");
        int choice;
        scanf("%d", &choice);
        return choice;
    }
    // 没有通路
    else
        printf("\n--------------从入口到出口没有通路!--------------\n");
    printf("\n\n");
    return 0;
}

// 广搜求解迷宫maze中,从入口start到出口end的一条路径
int BreadthFirstMazePath(MazeType& maze, PosType start, PosType end)
{
    int d[4][2] = { {-1,0},{0,-1},{1,0},{0,1} }; // 控制上下左右
    int vis[ROW][COL];                           // 访问标记数组
    memset(vis, 0, sizeof(vis));                 // 初始化标记数组
    int head = 0, tail = 0, i = 0, ans;          // 队首对位,ans当前标记

    // 从起点开始
    que[tail].seat = start;
    que[tail++].pre = -1;
    vis[start.row][start.col] = 1;

    while (head < tail)
    {
        Strnode temp = que[head++];
        MarkPrint(maze, temp.seat);
        // 到达终点(出口)
        if (PosEqual(temp.seat, end))
        {
            ans = head - 1;
            Sign(maze,ans);
            return 1;
        }
        for (i = 0; i < 4; i++)
        {
            int dx = temp.seat.row + d[i][0];
            int dy = temp.seat.col + d[i][1];
            // 未访问并且通路
            if (!vis[dx][dy] && !maze.arr[dx][dy])
            {
                /*MarkPrint(maze, que[tail].seat);*/
                que[tail].seat.row = dx;
                que[tail].seat.col = dy;
                que[tail++].pre = head - 1;
                vis[dx][dy] = 1;
            }
        }
    }
    return 0;
}

// 广搜标记地图
void Sign(MazeType& maze, int ans)
{
    if (que[ans].pre != -1)
    {
        Sign(maze, que[ans].pre);
    }
    FootPrint(maze, que[ans].seat);
    return;
}

// 清除错误路径
void Clean(MazeType& maze)
{
    for (int i = 1; i < ROW - 1; i++)
    {
        for (int j = 1; j < COL - 1; j++)
        {
            if (maze.arr[i][j] == 3)
                maze.arr[i][j] = 0;
        }
    }
    printf("\n--------------     清除错误路径    --------------\n");
    printf("\n-------------------------------------------------\n");
    printf("\n迷宫路径如下:\n");
    printf("(其中'*'表示求解路径)\n");
    // 输出迷宫路径
    PrintMaze(maze, ROW, COL);
}

// 结束界面
void GoodBye() 
{
    system("cls");
    printf("ByeBye!!!\n");
    Sleep(1000);
    exit(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C. p-binary(二进制位)

Problem - 1225C - Codeforces Vasya会看中任何数字&#xff0c;只要它是2的整数次方。另一方面&#xff0c;Petya非常保守&#xff0c;只喜欢单一的整数p&#xff08;可以是正数、负数或零&#xff09;。为了结合他们的口味&#xff0c;他们发明了2xp形式的p-二进制数&#xf…

jmeter接口测试之导入测试用例/get请求中Url存在参数(工作日记2)

导入接口用例进行接口测试 以运营中心测试计划中的企业菜单管理为例 【前提条件】 1、有接口数据 2、有接口用例 我们需要把接口测试用例转换为CSV格式步骤如下&#xff1a; 右键选择打开方式为Notepad 需要将文件设置一下编码 文件留着备用 【步骤】 1、新建一个企业…

前端基础之PS和相关基础知识总结

PS安装&#xff1a; 淘宝 PS简介 面板简介&#xff08;菜单栏、工具栏、辅助面板&#xff09; 图片格式&#xff1a; jpgjpeg&#xff08;色彩丰富的图片&#xff09;png&#xff08;半透明图片&#xff09;gif&#xff08;网页动态图&#xff09;psd&#xff08;ps设计源文…

android java udp广播 用于局域网搜索扫描设备。

DatagramSocket socket new DatagramSocket();//设置接收等待时长socket.setSoTimeout(LanCommConfig.RECEIVE_TIME_OUT);byte[] sendData new byte[1024];//使用广播形式&#xff08;目标地址设为255.255.255.255&#xff09;的udp数据包DatagramPacket sendPacket new Dat…

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示 📺显示效果 LCD1602 IIC接口 ✨本示例基于自制的STC开发板,主控采用的:IAP15W4K61S4相关篇《【PCB开源分享】STC/IAP15W4K61S4开发板》《【开源分享】自制STC15W408AS开发板》🌼接线说明 🌿CD1602+PCF8574转IIC接…

stlink下载调试器使用说明(STM32采用stlink下载程序)

stlink能干什么&#xff1f; 最基本的功能&#xff1a;下载程序。 一般STM32支持ISP串口下载&#xff0c;也支持stlink、jlink等下载器下载 。 使用stlink、jlink下载要比串口方便很多&#xff0c;在keil里直接点击下载就行了&#xff0c;不需要去选择hex文件&#xff0c;速度…

你可能还不知道 golang 的高效编码细节

xdm&#xff0c;我们都知道 golang 是天生的高并发&#xff0c;高效的编译型语言 可我们也都可知道&#xff0c;工具再好&#xff0c;用法不对&#xff0c;全都白费&#xff0c;我们来举 2 个常用路径来感受一下 struct 和 map 用谁呢&#xff1f; 计算量很小的时候&#xf…

特斯拉第10000桩落成,百度地图送10000名充电免单!

「导语」 为庆祝特斯拉在中国大陆落成第10000个超级充电桩&#xff0c;百度地图推出特斯拉车主专属权益。车主们通过百度地图APP&#xff0c;即可实时获取超级充电桩空闲信息、一键规划专属充电路线。12.28-1.2期间&#xff0c;更有10000份充电免单福利限时放送。 在汽车电动…

Linux环境开机自启java应用

Linux环境设置开机自启java应用&#xff08;Linux定时任务&#xff09; crontab是Unix和Linux用于设置需要周期性被执行的指令&#xff0c;是Linux服务器很常用的技术&#xff0c;很多任务都会设置在crontab循环执行。 crontab &#xff1a; 提供给用户控制任务计划的命令&…

WebDAV之葫芦儿·派盘+File Manager

File Manager 支持WebDAV方式连接葫芦儿派盘。 手机文件太多,空间不足、隐藏文件多、文件清理不干净?推荐您一个功能强大的文件管理器,可以让你对手机中的各类文件进行管理,支持快速移动、复制粘贴、压缩解压等等。同时还能对已经安装的程序进行卸载,自动识别手机中的AP…

啥牌子的蓝牙耳机音质好?2023公认音质最好的蓝牙耳机

音乐是有魔力的&#xff0c;繁杂的工作和琐碎的生活&#xff0c;使得大多数人焦虑不安&#xff0c;音乐可以令人放松&#xff0c;蓝牙耳机越多越多&#xff0c;真不知道怎么挑好&#xff0c;品牌成百上千&#xff0c;款式就更不用说了&#xff0c;下面笔者专门整理了一期音质表…

【小西】优化生日品同步网易严选功能,使其支持多SPU对多SKU关系

目录前言思路代码实现实体ThemeActivityGift&#xff1a;spuId由 String类型变为JSONArrayThemeActivityGiftServiceImpl改造handleYxGiftByOperation&#xff1a;保存的是严选的生日品checkSpuIds&#xff1a;校验SPU有效性checkSpuIdExist&#xff1a;校验单个spuId是否存在c…

C语言函数栈帧的创建和销毁

前期学习的时候&#xff0c;我们可能有很多困惑&#xff0c;比如&#xff1a; 局部变量是怎么创建的&#xff1f; 为什么局部变量的值是随机值&#xff1f; 函数是怎么传参的&#xff1f;传参的顺序是怎样的&#xff1f; 形参和实参是什么关系&#xff1f; 函数调用是怎么…

分享丨品牌零售行业三大实践解读,全面搭建并落地数字化运营体系

以下内容来自神策数据创始人 & CEO 桑文锋关于数据驱动零售品牌业务增长的相关分享。点击文末“阅读原文”&#xff0c;了解神策品牌零售行业完整版解决方案。神策从 2020 年深入品牌零售领域&#xff0c;一路走来跌跌撞撞&#xff0c;不过思路越来越清晰&#xff0c;对该领…

Echarts:饼图默认高亮和选中(突出并高亮)/添加单击事件/X轴字符标签换行处理

饼图默认高亮: // 我这里实现的是饼图// 获取 this.sysfbChart this.$echarts.init(document.getElementById(sysfb))// 默认高亮第一个 // highlight:突出 this.sysfbChart.dispatchAction({type: highlight,seriesIndex: 0,dataIndex: 0}); 效果图: 饼图选中(突出并高亮):…

为什么自学 Python 看不进去?

如果刚开始学习python&#xff0c;没看懂&#xff0c;那就多看几次就会了。看不进去很正常&#xff0c;这个过程会很乏味&#xff0c;但是对于你建立牢固的编程思维是必须的。会有看不进去的这个阶段 python学习的秘诀在于对技术了解的广度和对数据结构研究的深度&#xff0c;不…

2022“易观之星”奖项公布,聚焦数字经济,助力数智创新

12月29日&#xff0c;“易观之星”颁奖典礼线上举办&#xff0c;重磅颁出2022“易观之星”奖项。 2022“易观之星”设置数字产品、数字企业2个系列共7大奖项&#xff0c;覆盖金融、品牌零售、汽车出行、文化消费等领域&#xff0c;挖掘和表彰各领域表现卓越的数字产品、数字企业…

【go语言之http模型reactor】

go语言之http模型reactor示例gnet.ServeinitListenerserveactivateEventLoopspolling前面说了go自带的原生netpoll模型&#xff0c;大致的流程就是每一个新的连接都会开启一个goroutine去处理&#xff0c;这样的处理的过程简单&#xff0c;高效&#xff0c;充分利用了go的底层的…

在 K8S 中测试环境中搭建 mongodb

1.可在服务器上面创建 https://kubernetes.io/docs/home/ #k8s官网 搜索Deployment 第一个就是例子 vi rs-mongodb.yaml apiVersion: apps/v1 kind: Deployment #资源类型 metadata:namespace: klvchenname: mongodblabels:app: mongodb spec:replicas: 1selector:mat…

STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…