扫雷(C 语言)
目录
- 一、游戏设计分析
- 二、各个步骤的代码实现
- 1. 游戏菜单界面的实现
- 2. 游戏初始化
- 3. 开始扫雷
- 三、完整代码
- 四、总结
一、游戏设计分析
本次设计的扫雷游戏是展示一个 9 * 9 的棋盘,然后输入坐标进行判断,若是雷,则游戏结束,否则继续判断,直到排除所有雷,游戏胜利。然后选择退出或者重新开始游戏。
(1)游戏菜单界面实现
提供开始游戏和退出游戏两个选项,游戏结束后可以再次选择,直到退出游戏。
(2)游戏初始化
开始游戏后,初始化棋盘,随机设置地雷,然后显示棋盘。这里需要两个二维数组,一个用来显示棋盘,一个用来存储地雷的信息。
(3)开始扫雷
提示玩家输入坐标,然后检查坐标是否合法,最后判断位置是否为雷。若为雷,则游戏结束;若不为雷则计算周围地雷的个数,若周围地雷的个数不为 0,则显示将其显示在棋盘上;若周围地雷个数为 0,则使用刚才的方法继续检查周围的 8 个位置,以此类推,检查结束后把信息全部显示在棋盘上。然后继续下一次坐标输入,直到把所有的雷找出,游戏获胜。
上述需要计算输入坐标周围的的雷的个数,如果在该坐标在最边上一圈,那么会存在排查的坐标非法的情况。这里可以使用 11 * 11 的棋盘,然后通过把雷设置为字符 ‘1’,非雷设置为字符 ‘0’,当计算时把周围八个坐标相加然后减去 8 个字符 ‘0’ 即可。
(4)游戏结束或重新开始游戏
二、各个步骤的代码实现
1. 游戏菜单界面的实现
游戏菜单界面需要提供开始游戏和退出游戏两个选项,且玩完一局游戏之后可以选择再玩一局。在主函数使用一个循环来控制实现,如下:
(1)test.c 测试文件
// 头文件
#include "Mine.h"int main()
{// 所需变量int select;// 选择do{// 菜单menu();// 输入scanf("%d", &select);// 判断switch (select){case 1:printf("扫雷游戏\n");//Minesweeper_game();break;case 0:printf("游戏结束!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (select);return 0;
}
(2)Mine.h 头文件
// 头文件
#include <stdio.h>// 函数声明
// 菜单
void menu();
(3)Mine.c 函数实现文件
// 头文件
#include "Mine.h"// 函数定义
// 菜单
void menu()
{printf("*****************************************\n");printf("************* 1. play *************\n");printf("************* 0. exit *************\n");printf("*****************************************\n");
}
(4)代码运行效果:

2. 游戏初始化
游戏初始化需要显示棋盘,然后随机设置雷。这里需要使用两个数组,一个数组用来显示棋盘,另一个数组用来存储雷的信息。为了方便计算,两个数组都采用 11*11 的字符数组,初始棋盘使用符号 ‘*’,地雷使用字符 ‘1’,非地雷使用字符 ‘0’。数组大小使用在头文件中定义的符号常量,设计一个初始化函数 InitBoard() 和设置雷函数 SetMine(),还有显示棋盘函数 PrintBoard()。
InitBoard() 函数可以一次性传两个数组,也可以通过参数传递设置的值。SetMine() 函数需要使用随机数。PrintBoard() 函数显示的时候可以在左边和上面加上行号和列号,方便玩家输入坐标。
(1)test.c 测试文件
添加了扫雷游戏函数 Minesweeper_game()
// 头文件
#include "Mine.h"int main()
{// 所需变量int select;// 选择do{// 菜单menu();// 输入scanf("%d", &select);// 判断switch (select){case 1:Minesweeper_game(); // 扫雷游戏break;case 0:printf("游戏结束!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (select);return 0;
}
(2)Mine.h 头文件
// 头文件
#include <stdio.h>// 常量声明
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2// 函数声明
// 菜单
void menu();// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col);// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col);// 扫雷游戏
void Minesweeper_game();
(3)Mine.c 函数实现文件
// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{int i;for (i = 0; i < rows; ++i){int j;for (j = 0; j < cols; ++j){Board[i][j] = set;}}
}// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col)
{// 所需变量int x, y; // 雷的坐标int num = MINE_COUNT; // 雷的数量// 设置雷while (num){// 随机设置坐标值x = rand() % row + 1; // 11 * 11 实际坐标 1 - 9y = rand() % col + 1;// 检查坐标是否重复if (Board[x][y] == '0'){Board[x][y] = '1';--num;}}
}// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col)
{// 分界线printf("-----------------------扫雷----------------------\n");// 列号printf(" ");int j;for (j = 0; j < col; ++j){printf("%d ", j + 1);}printf("\n");// 棋盘int i;for (i = 0; i < row; ++i){// 列号printf("%d ", i + 1);for (j = 0; j < col; ++j){printf("%c ", Board[i+1][j+1]);}// 下一行printf("\n");}// 分界线printf("-----------------------扫雷----------------------\n");
}// 扫雷游戏
void Minesweeper_game()
{// 创建两个棋盘char board[ROWS][COLS];char mine[ROWS][COLS];// 初始化棋盘InitBoard(board, ROWS, COLS, '*');printf("初始化两个数组:\n"); // 删除PrintBoard(board, ROW, COL); // 删除InitBoard(mine, ROWS, COLS, '0');PrintBoard(mine, ROW, COL); // 删除// 设置雷SetMine(mine, ROW, COL);printf("雷的信息:\n"); // 删除PrintBoard(mine, ROW, COL); // 删除
}
上述标记了删除的语句都是不需要的,这是作者写完代码用来检测的。
(4)代码运行效果

3. 开始扫雷
开始扫雷,设计一个函数 find(),要求玩家输入坐标,检查该坐标是否合法,然后判断该位置是否为雷,是雷则游戏结束,不是雷则使用函数 calc_mine() 计算周围一圈的雷的个数。如果周围一圈没有雷,则按照刚才的步骤检查周围一圈,实现函数 calc_mine() 递归。然后继续扫雷,直到找出所有的雷。
函数 calc_mine() 只在 find() 函数中使用,可以设置为 Mine.c 函数实现文件中的静态函数。判断游戏结束也需要使用一个变量,这里使用一个全局变量 REAMIN 来进行控制,当 REAMIN 的值为棋子总数减去雷数时,则排除所有雷,游戏结束。
代码测试时,可以一个一个功能进行测试,一个功能完成无误后再进入下一个。作者是全部测试好了才放上来的。
(1)Mine.h 头文件
// ...// 找雷
void find(char Board[ROWS][COLS], int row, int col);// 扫雷游戏
void Minesweeper_game();
(2)Mine.c 函数实现文件
// 计算周围的雷
void calc_mine(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col, int x, int y)
{// 坐标非法或者已经排查或该位置为雷则退出if (x < 1 || x > 9 || y < 1 || y > 9 || Board[x][y] != '*' || Mine[x][y] != '0')return;// 所需变量int num = 0;int i;for (i = x - 1; i <= x + 1; ++i){int j;for (j = y - 1; j <= y + 1; ++j){num += Mine[i][j];}}// 加的是字符 '0' 所以要减去num = num - 9 * '0';// 排雷 +1++REMAIN;if (num){Board[x][y] = num + '0';}else{Board[x][y] = ' ';// 如果该坐标周围没雷,则对其周围八个坐标进行检查,形成递归for (i = x - 1; i <= x + 1; ++i){int j;for (j = y - 1; j <= y + 1; ++j){calc_mine(Board, Mine, row, col, i, j);}}}
}// 找雷
int find(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col)
{// 所需变量int x, y;// 输入排查坐标while (1){printf("请输入排雷坐标:");scanf("%d %d", &x, &y);// 判断坐标是否合法if (Board[x][y] != '*'){printf("该坐标已被排查!\n");continue;}if (x >= 1 && x <= row && y >= 1 && y <= col){if (Mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");printf("以下是本局雷的信息\n");return 0;}else{calc_mine(Board, Mine, row, col, x, y);return 1;}}}
}// 扫雷游戏
void Minesweeper_game()
{// 重置REMAIN = 0;// 创建两个棋盘char board[ROWS][COLS];char mine[ROWS][COLS];// 初始化棋盘InitBoard(board, ROWS, COLS, '*');InitBoard(mine, ROWS, COLS, '0');// 设置雷SetMine(mine, ROW, COL);int ret = 0;while (REMAIN != ROW * COL - MINE_COUNT){// 显示棋盘PrintBoard(board, ROW, COL);// 排雷ret = find(board, mine, ROW, COL);// 如果是雷,则显示雷的信息,游戏结束if (!ret){PrintBoard(mine, ROW, COL);break;}}// 判断if (REMAIN == ROW * COL - MINE_COUNT)\{printf("恭喜你排雷成功,游戏结束!\n");printf("以下是本局雷的信息:\n");PrintBoard(mine, ROW, COL);}
}
(3)代码运行效果:
下图是完整代码运行效果,一整局游戏的运行图:

三、完整代码
完整代码分为三个文件:头文件 Mine.h,测试文件 test.c,函数实现文件 Mine.c
头文件 Mine.h
#pragma once// 头文件
#include <stdio.h>
#include <stdlib.h>// 常量声明
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define MINE_COUNT 10// 函数声明
// 菜单
void menu();// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col);// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col);// 找雷
int find(char Board[ROWS][COLS],char Mine[ROWS][COLS], int row, int col);// 扫雷游戏
void Minesweeper_game();
测试文件 test.c
// 头文件
#include "Mine.h"
#include <time.h>int main()
{// 设置随机数种子srand((unsigned)time(0));// 所需变量int select;// 选择do{// 菜单menu();// 输入scanf("%d", &select);// 判断switch (select){case 1:Minesweeper_game(); // 扫雷游戏break;case 0:printf("游戏结束!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (select);return 0;
}
函数实现文件 Mine.c
// 头文件
#include "Mine.h"// 全局静态变量
static REMAIN = 0;// 函数定义
// 菜单
void menu()
{printf("*****************************************\n");printf("************* 1. play *************\n");printf("************* 0. exit *************\n");printf("*****************************************\n");
}// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{int i;for (i = 0; i < rows; ++i){int j;for (j = 0; j < cols; ++j){Board[i][j] = set;}}
}// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col)
{// 所需变量int x, y; // 雷的坐标int num = MINE_COUNT; // 雷的数量// 设置雷while (num){// 随机设置坐标值x = rand() % row + 1; // 11 * 11 实际坐标 1 - 9y = rand() % col + 1;// 检查坐标是否重复if (Board[x][y] == '0'){Board[x][y] = '1';--num;}}
}// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col)
{// 分界线printf("-----------------------扫雷----------------------\n");// 列号printf(" ");int j;for (j = 0; j < col; ++j){printf("%d ", j + 1);}printf("\n");// 棋盘int i;for (i = 0; i < row; ++i){// 列号printf("%d ", i + 1);for (j = 0; j < col; ++j){printf("%c ", Board[i+1][j+1]);}// 下一行printf("\n");}// 分界线printf("-----------------------扫雷----------------------\n");
}// 计算周围的雷
void calc_mine(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col, int x, int y)
{// 坐标非法或者已经排查或该位置为雷则退出if (x < 1 || x > 9 || y < 1 || y > 9 || Board[x][y] != '*' || Mine[x][y] != '0')return;// 所需变量int num = 0;int i;for (i = x - 1; i <= x + 1; ++i){int j;for (j = y - 1; j <= y + 1; ++j){num += Mine[i][j];}}// 加的是字符 '0' 所以要减去num = num - 9 * '0';// 排雷 +1++REMAIN;if (num){Board[x][y] = num + '0';}else{Board[x][y] = ' ';// 如果该坐标周围没雷,则对其周围八个坐标进行检查,形成递归for (i = x - 1; i <= x + 1; ++i){int j;for (j = y - 1; j <= y + 1; ++j){calc_mine(Board, Mine, row, col, i, j);}}}
}// 找雷
int find(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col)
{// 所需变量int x, y;// 输入排查坐标while (1){printf("请输入排雷坐标:");scanf("%d %d", &x, &y);// 判断坐标是否合法if (Board[x][y] != '*'){printf("该坐标已被排查!\n");continue;}if (x >= 1 && x <= row && y >= 1 && y <= col){if (Mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");printf("以下是本局雷的信息\n");return 0;}else{calc_mine(Board, Mine, row, col, x, y);return 1;}}}
}// 扫雷游戏
void Minesweeper_game()
{// 重置REMAIN = 0;// 创建两个棋盘char board[ROWS][COLS];char mine[ROWS][COLS];// 初始化棋盘InitBoard(board, ROWS, COLS, '*');InitBoard(mine, ROWS, COLS, '0');// 设置雷SetMine(mine, ROW, COL);int ret = 0;while (REMAIN != ROW * COL - MINE_COUNT){// 显示棋盘PrintBoard(board, ROW, COL);// 排雷ret = find(board, mine, ROW, COL);// 如果是雷,则显示雷的信息,游戏结束if (!ret){PrintBoard(mine, ROW, COL);break;}}// 判断if (REMAIN == ROW * COL - MINE_COUNT)\{printf("恭喜你排雷成功,游戏结束!\n");printf("以下是本局雷的信息:\n");PrintBoard(mine, ROW, COL);}
}
四、总结
本次扫雷游戏的代码实现,总体来说还比较可以。基本功能均实现,游戏也能正常进行。本游戏还有许多可以提升的地方,比如:代码的优化,雷的标记,难度的选择等等。
本代码稍微难一点的地方在于排查坐标周围地雷数的函数 calc_mine() 的递归,需要明确何时需要递归,和递归的结束条件。
复习一下递归需要满足两个条件:
(1)需要结束条件
(2)每次递归都更加靠近这个结束条件
相关文章:
扫雷(C 语言)
目录 一、游戏设计分析二、各个步骤的代码实现1. 游戏菜单界面的实现2. 游戏初始化3. 开始扫雷 三、完整代码四、总结 一、游戏设计分析 本次设计的扫雷游戏是展示一个 9 * 9 的棋盘,然后输入坐标进行判断,若是雷,则游戏结束,否则…...
有源滤波器(一)
滤波器设计工具 | 滤波器设计向导 | Analog Devices 一种带通滤波器: 有源滤波器完美规避了这个带不带负载滤波参数变化的问题,但是有源滤波器只能处理小电流和小电压: 鼠标所指的电路图是一阶同相滤波器,右上角的是他的幅频特性…...
Flume面试整理-常见的Channel类型
Apache Flume提供了多种Channel(通道)类型,作为Source(源)和Sink(汇)之间的缓冲区,确保数据的可靠传输。不同类型的Channel提供了不同的性能和可靠性,适用于不同的应用场景。以下是Flume中常见的Channel类型及其特点: 1. Memory Channel ● 描述:Memory Channel将数…...
【前端】如何制作一个自己的网页(6)
接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键,选择【复制图片地址】,即可获得该图片的网络地址。 其实在HTML中,除了图片以外,我们还可以利用地址找到另一个网页。 如右图所示&#…...
Linux系统性能调优技巧
Linux系统性能调优是一个复杂而持续的过程,需要综合考虑硬件、软件、内核参数、进程管理等多个方面。以下是一些具体的调优技巧: 一、硬件优化 增加物理内存:内存不足时,系统会频繁进行交换(swapping)活动…...
数学建模算法与应用 第5章 插值与拟合方法
目录 5.1 插值方法 Matlab代码示例:线性插值 Matlab代码示例:样条插值 5.2 曲线拟合的线性最小二乘法 Matlab代码示例:线性拟合 5.3 最小二乘优化与多项式拟合 Matlab代码示例:多项式拟合 5.4 曲线拟合与函数逼近 Matlab代…...
3D Slicer 教程二 ---- 数据集
上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …...
【建议收藏】30个Java异常的知识点,你能撑到第几个?
文章目录 问题1:Error 和 Exception 区别是什么?问题2:运行时异常和一般异常(受检异常)区别是什么?问题3:JVM 是如何处理异常的?问题4:throw 和 throws 的区别是什么?问题5ÿ…...
【Linux系统编程】环境基础开发工具使用
目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程编辑编辑编辑 3.2 详解链接 动态链接 静态链接 4…...
滚雪球学Redis[6.2讲]:Redis脚本与Lua:深入掌握Redis中的高效编程技巧
全文目录: 📝前言🚦正文🌟6.2.1 Lua脚本的优势🖋️6.2.2 EVAL命令与Lua脚本编写🐵编写Lua脚本的基本步骤🐶示例:简单的GET和SET操作🐱示例:Lua实现自增和过期…...
上市不到一月,极氪7X交付破万台!论纯电,极氪真“遥遥领先”
承认吧,在纯电这条赛道上,极氪真就“遥遥领先”~ 推出的第一款原生纯电猎装极氪001,就常年霸榜25万级豪华纯电销冠 主打豪华大车的极氪009,成为40万以上高端“保姆车”的不二之选 第一次面向主流纯电市场推出的豪华大五座——极…...
【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>
前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…...
Java高并发控制之按业务对象加同步锁
一、需求 最常见的一个场景,账户余额更新! 业务场景稍复杂点,一个客户有多个虚拟余额账户,产生交易时,需要同时更新客户的多个余额账户,现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁&…...
Python魔法函数__iter__的用法
下面是找到的一个比较好的科学解释: Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。 1.__iter__方法的作用是让对象可以用for…...
Redis-缓存一致性
缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类: 只读缓存:(脚本批量写入,canal 等)读写缓存 同步直写:vip数据等即时数据异步缓写:允许延时(仓库,物流&a…...
SAP学习笔记 - 豆知识13 - Msg 番号 NR751 - Object RF_BELEG R100、番号範囲間隔 49 不存在 FBN1
其实这种就是自动採番的番号没弄。 比如跨年了,那该新年度的番号范围没弄啊,就会出这种错误。 把番号范围给加一下就可以了。 1,现象 比如点 VL02N 出荷传票变更 画面,点 出库确认 就会出如下错误: Object RF_BEL…...
美摄科技云服务解决方案,方案成熟,接入简单
美摄科技作为视频处理领域的先锋,凭借其强大的技术实力和深厚的行业经验,推出了成熟的云服务解决方案,为轻量化视频制作开辟了全新的道路。 一、成熟方案,接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…...
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…...
python的多线程和多进程
首先需要明确的是,多进程和其他语言的一样,能够利用多核cpu,但是python由于GIL的存在,多线程在执行的时候,实际上,每一时刻只有一个线程在执行。相当于是单线程。然而多线程在某些情况下,还是能…...
基于SpringBoot+Vue+uniapp的时间管理小程序的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
