当前位置: 首页 > news >正文

C语言初阶--数组

1.一维数组的创建和初始化

1.1数组的创建

数组是一组相同类型元素的集合。

数组的创建方式:

type_t   arr_name  [const_n];
//type_t 数组的元素类型
//const_n 常量表达式,指定数组的大小
#include <stdio.h>
int main()
{int arr[10]; //数组的创建char ch[4+1];//下面的代码只能在支持C99标准的编译器上编译,此处VS不行int n = 10;scanf("%d", &n);int arr2[n]; //这种数组不能初始化//在C99标准之前,数组的大小必须是常量或常量表达式;在C99标准之后,为了支持变长数组,数组的大小可以是变量return 0;
}

1.2数组的初始化

数组的初始化:在创建数组的同时给数组的内容一些合理的初始值。

int main()
{int arr[10] = {1,2,3}; //不完全初始化,剩余的元素默认初始化为0int arr1[10] = {1,2,3,4,5,6,7,8,9,0}; int arr2[] = {1,2,3};char ch1[10] = {'a', 'b', 'c'}; // a b cchar ch2[10] = "abc"; // a b c \0char ch3[] = {'a', 'b', 'c'}; char ch4[] ="abc";return 0;
}

可以自行查看数组内的数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3一维数组的使用

数组的使用之前介绍了一种操作符:[],下标引用操作符。它其实就是数组访问的操作符。
在这里插入图片描述

#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};//[] 下标引用操作符printf("%d\n", arr[4]); //5return 0;
}
#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};int i = 0;int sz = sizeof(arr) / sizeof(arr[0]); //10//for (i = 0; i < sz; i++)//{//    printf("%d ", arr[i]); //1 2 3 4 5 6 7 8 9 10//}for (i = sz-1; i >= 0; i--){printf("%d ", arr[i]); //10 9 8 7 6 5 4 3 2 1}return 0;
}

数组是使用下标来访问的,下标从0开始。

数组的大小可以通过计算得到。

1.4一维数组在内存中的存储

#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};int i = 0;int sz = sizeof(arr) / sizeof(arr[0]); //10//打印数组每个元素的地址for (i = 0; i < sz; i++){printf("&arr[%d] = %p\n", i, &arr[i]); }return 0;
}

在这里插入图片描述
从运行结果看得出(或者自己查看内存),随着数组下标的增长,元素的地址,也在有规律的递增。得出结论:数组在内存中是连续存放的
在这里插入图片描述

2.二维数组的创建和初始化

2.1二维数组的创建

// 1 2 3 4
// 2 3 4 5
// 3 4 5 6
int main()
{int arr1[3][4];char arr2[5][10];return 0;
}

2.2二维数组的初始化

int main()
{int arr1[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6}; //完全初始化return 0;
}

在这里插入图片描述

int main()
{int arr1[3][4] = { {1,2}, {3,4}, {5,6} }; //不完全初始化return 0;
}

在这里插入图片描述

int main()
{int arr2[][4] = { {1,2,3,4}, {2,3} }; //二维数组如果有初始化,行可以省略,列不能省略int arr3[][4] = {  1,2,3,4,2,3 };return 0;
}

2.3二维数组的使用

二维数组的使用也是通过下标的方式。

#include <stdio.h>
int main()
{int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6}; int i = 0;//printf("%d\n", arr[2][0]); //3for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述

//替换原数组的元素
#include <stdio.h>
int main()
{int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6}; int i = 0;//printf("%d\n", arr[2][0]); //3for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){scanf("%d ", &arr[i][j]);}}for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述

2.4二维数组在内存中的存储

#include <stdio.h>
int main()
{int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6}; int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

在这里插入图片描述
由上可知:二维数组在内存中也是连续存储。
在这里插入图片描述

3.数组越界

数组的下标是有范围限制的。

数组的下标规定是从0开始。如果数组有n个元素,最后一个元素的下标是n-1。

所以数组的下标如果小于0或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6}; //0-5int i = 0;for (i = 0; i < 10; i++)  //0-9,越界{printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序是正确的。所以程序员写代码时,最好自己做越界的检查。

//error
#include <stdio.h>
int main()
{int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j <= 4; j++) //越界{printf("%d ", arr[i][j]);}}return 0;
}

在这里插入图片描述
二维数组的行和列也可能存在越界。

4.数组作为函数参数

冒泡排序的核心思想:两个相邻的元素进行比较。

分析:
在这里插入图片描述
一趟冒泡排序让一个数据来到它最终应该出现的位置上!第1趟——10个元素——比较9次;第二趟——9个元素——比较8次···

10个元素——9趟

n个元素——n-1趟

4.1冒泡排序函数的错误设计

#include <stdio.h>
//数组传参时,形参有2种写法:
//1.数组
//2.指针
void bubble_sort(int arr[]) //形参是数组的形式。地址应该使用指针来接收,所以arr这里看似是数组,本质是指针变量
{//趟数int sz = sizeof(arr) / sizeof(arr[0]); //所以4/4=1int i = 0;for (i = 0; i < sz-1; i++){//一趟冒泡排序int j = 0; //下标for (j = 0; j < sz-1-i; j++){if (arr[j] > arr[j+1]){//交换int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}int main()
{int arr[] = {9,8,7,6,5,4,3,2,1,0}; //数组,把数组的元素排成升序//0 1 2 3 4 5 6 7 8 9//冒泡排序的算法,对数组进行排序int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr); //数组名本质上是数组首元素的地址int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]); //error,未到达预期效果,9 8 7 6 5 4 3 2 1 0}return 0;
}

修正:

#include <stdio.h>
//数组传参时,形参有2种写法:
//1.数组
//2.指针 void bubble_sort(int* arr, int sz)
void bubble_sort(int arr[], int sz) //形参是数组的形式。地址应该使用指针来接收,所以arr这里看似是数组,本质是指针变量
{//趟数int i = 0;for (i = 0; i < sz-1; i++){//一趟冒泡排序int j = 0; //下标for (j = 0; j < sz-1-i; j++){if (arr[j] > arr[j+1]){//交换int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}int main()
{int arr[] = {9,8,7,6,5,4,3,2,1,0}; //数组,把数组的元素排成升序//0 1 2 3 4 5 6 7 8 9//冒泡排序的算法,对数组进行排序int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz); //数组名本质上是数组首元素的地址int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]); //0 1 2 3 4 5 6 7 8 9}return 0;
}

4.2数组名是什么?

#include <stdio.h>
int main()
{int arr[10];printf("%p\n", arr); printf("%p\n", &arr[0]);return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{int arr[10];int n = sizeof(arr);printf("%d\n", n); //40return 0;
}

纠正前面的说法:

数组名确实能表示首元素的地址,但是有2个例外:

1、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。

2、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

#include <stdio.h>
int main()
{int arr[10] = {0};printf("%p\n", arr);  //arr就是首元素的地址printf("%p\n", arr+1); printf("------------------\n");printf("%p\n", &arr[0]); //首元素的地址printf("%p\n", &arr[0]+1); //下一个元素的地址printf("------------------\n");printf("%p\n", &arr); //数组的地址printf("%p\n", &arr+1);return 0;
}

二维数组的数组名理解:

#include <stdio.h>
int main()
{int arr[3][4];//int sz = sizeof(arr);//printf("%d\n", sz); //48printf("%p\n", arr); //二维数组的数组名也表示数组首元素的地址printf("%p\n", arr+1);//005FFCA4//005FFCB4return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{int arr[3][4] = {0};printf("%d\n", sizeof(arr) / sizeof(arr[0])); // 48/16=3,计算行printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0])); // 16/4=4,计算列
}

5.数组的应用实例

5.1实例1:三子棋

拆分模块:

test.c 测试游戏的逻辑

game.c 游戏代码的实现

game.h 游戏代码的声明(函数声明、符号定义)

//test.c
#define _CRT_SECURE_NO_WARNINGS #include "game.h"
void menu()
{printf("********************\n");printf("***1.play  0.exit***\n");printf("********************\n"); 
}
void game()
{char ret = 0;char board[ROW][COL] = {0};//初始化棋盘的函数InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);//下棋while (1){PlayerMove(board, ROW, COL);//判断输赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);//判断输赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}        DisplayBoard(board, ROW, COL);}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else{printf("平局\n");}DisplayBoard(board, ROW, COL);}int main()
{srand((unsigned int)time(NULL)); //设置随机数的生成起点int input = 0;do{menu(); //打印菜单printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误!\n");break;}}while (input);return 0;
}
//game.h
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 3
#define COL 3//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋:找没有下棋的地方随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char IsWin(char board[ROW][COL], int row, int col);
//game.c
#define _CRT_SECURE_NO_WARNINGS #include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}//第一个版本
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
//    int i = 0;
//    for (i = 0; i < row; i++)
//    {
//        //打印数据
//        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
//        //打印分割行
//        if (i < row - 1)
//            printf("---|---|---\n");
//    }
//}
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){//打印数据//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);int j = 0;for (j = 0; j< col; j++){printf(" %c ", board[i][j]);if (j < col-1)printf("|");}printf("\n");//打印分割行if (i < row-1){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col-1)printf("|");}printf("\n");}}
}void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入坐标:>");scanf("%d %d", &x, &y);//坐标范围合法性判断if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x-1][y-1] == ' '){board[x-1][y-1] = '*';break;}else{printf("坐标被占用,不能下棋,请选择其他位置\n");}}else{printf("坐标非法,请重新输入\n");}}
}void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");int x = 0;int y = 0;while (1){x = rand() % row; //0-2y = rand() % col; //0-2if (board[x][y] == ' '){board[x][y] = '#';break;}}
}//满了返回1
//不满返回0
int IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' '){return 0;}}}return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{//判断行int i = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' '){return board[i][1];}}//判断列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}} //判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//还没有人赢,则判断平局if (IsFull(board, row, col)){return 'Q';}//游戏继续return 'C';
}

5.2实例2:扫雷游戏(直接贴代码,实现了基本功能)

还可添加标记功能+展开一大片功能(感兴趣可以自己实现,递归思路)

//test.c
#define _CRT_SECURE_NO_WARNINGS#include "game.h"void menu()
{printf("******************\n");printf("******1. play*****\n");printf("******0. exit*****\n");printf("******************\n");
}void game()
{char mine[ROWS][COLS] = {0}; //存放布置好的雷的信息char show[ROWS][COLS] = {0}; //存放排查出的雷的信息//初始化数组的内容为指定的内容//mine 数组在没有布置雷的时候,都是'0'InitBoard(mine, ROWS, COLS, '0');//show 数组在没有排查雷的时候,都是'*'InitBoard(show, ROWS, COLS, '*');//DisplayBoard(mine, ROW, COL);//设置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}
int main()
{int input = 0;//设置随机数的生成起点srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}
//game.h
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, int set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//game.c
#define _CRT_SECURE_NO_WARNINGS #include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, int set)
{int i = 0;int j = 0;for (i = 0; i <= rows; i++){for (j = 0; j <= cols; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("---------扫雷游戏----------\n");for (j = 0; j <= col; j++)   //打印列号{printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);       //打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("---------扫雷游戏----------\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//行和列的坐标范围1-9while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}int get_mine_count(char board[ROWS][COLS], int x, int y)
{return (board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y + 1] +board[x][y - 1] +board[x][y + 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] - 8*'0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0; //找到非雷的个数while (win < row*col-EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了,不能重复排查\n");}else{if (mine[x][y] == '1')  //如果是雷{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else  //如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0'; //转换为数字字符DisplayBoard(show, ROW, COL);}}}else{printf("输入的坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

在这里插入图片描述

6.实现字符串逆序

字符串逆序分析:
在这里插入图片描述

//1、字符串逆序(非递归实现,循环),reverse_string(char * string)
#include <stdio.h>
int main()
{char arr[] = "abcdef"; //[a b c d e f \0]int sz = sizeof(arr) / sizeof(arr[0]); //sz=7int left = 0; //下标int right = sz -2; //所以减去2while (left<right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s\n", arr); //fedcbareturn 0;
}
//1、字符串逆序(非递归实现,循环),reverse_string(char * string)
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef"; //[a b c d e f \0]//int sz = sizeof(arr) / sizeof(arr[0]);int left = 0; //下标//int right = sz -2; int right = strlen(arr)-1;while (left<right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s\n", arr); //fedcbareturn 0;
}
//2、字符串逆序(非递归实现,使用函数),reverse_string(char * string)
#include <stdio.h>
#include <string.h>void reverse(char arr[])
{int left = 0; //下标int right = strlen(arr)-1;while (left<right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}int main()
{char arr[] = "abcdef"; //[a b c d e f \0]reverse(arr);printf("%s\n", arr); //fedcbareturn 0;
}

分析:(递归实现,较复杂)
在这里插入图片描述

//字符串逆序(递归实现,不使用库函数),reverse_string(char * string)
#include <stdio.h>int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}
void reverse(char* str)
{//注释的数字对应流程图中数字char tmp = *str; //1int len = my_strlen(str);*str = *(str+len-1); //2*(str+len-1) = '\0'; //3if (my_strlen(str+1)>=2)reverse(str+1); //4*(str+len-1) = tmp; //5
}int main()
{char arr[] = "abcdef"; //[a b c d e f \0]reverse(arr);printf("%s\n", arr); //fedcbareturn 0;
}
//字符串逆序(递归实现,不使用库函数)
#include <stdio.h>int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}//这个代码存在一定潜在问题,如果字符串长度是偶数时,会出现问题
//void reverse(char arr[], int left, int right)
//{
//    char tmp = arr[left];
//    arr[left] = arr[right];
//    arr[right] = tmp;
//    if (left < right)
//        reverse(arr, left + 1, right - 1);
//}
//修正
void reverse(char arr[], int left, int right)
{if (left < right)  //满足这个条件才交换和递归{char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;reverse(arr, left+1, right-1);    }
}int main()
{char arr[] = "abcdef"; //[a b c d e f \0]int left = 0;int right = my_strlen(arr)-1;reverse(arr, left, right);printf("%s\n", arr); //fedcbareturn 0;
}

总结

今天就暂且更新至此吧,期待下周再会。如有错误还请不吝赐教。希望对您学习有所帮助,翻页前留下你的支持,以防下次失踪了嗷。

作者更新不易,免费关注别手软。

相关文章:

C语言初阶--数组

1.一维数组的创建和初始化 1.1数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 数组的元素类型 //const_n 常量表达式&#xff0c;指定数组的大小#include <stdio.h> int main() {int arr[10]; //数组…...

如何做界面自动化工具选择?

在2025年的技术环境中&#xff0c;UI自动化测试工具的选择需综合考虑工具的功能特性、适用场景、维护成本以及与团队技术栈的匹配度。以下从不同维度对当前主流的UI自动化工具进行分类推荐&#xff0c;并结合实际应用场景提供选型建议&#xff1a; 一、AI驱动的智能测试工具 …...

点云采集学习个人记录

Eagle LiDAR Scanner使用 3DMakerpro Eagle 发布&#xff1a;基于 LiDAR 的空间 3D 扫描仪 --- 3DMakerpro Eagle Launch: LiDAR-based Spatial 3D Scanner (3dwithus.com) RayStudio 工作流程教程 https://store.3dmakerpro.com/blogs/school/raystudio-workflow-tutorial…...

css识别\n换行

在CSS中&#xff0c;\n 通常不会被识别为换行符。如果你希望在CSS中实现换行效果&#xff0c;可以使用以下几种方法&#xff1a; 使用 white-space 属性&#xff1a; 设置 white-space: pre 或 white-space: pre-wrap&#xff0c;这样文本中的换行符 \n 会被保留并显示为换行。…...

《Python星球日记》 第45天:KNN 与 SVM 分类器

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、KNN 原理与距离计算1. KNN 的基本原理2. 距离计算方法3. K值的选择二、SVM 的支持向量与核技…...

STM32基础教程——硬件SPI

目录 前言 SPI硬件电路 SPI部分特征 SPI框图 SPI数据收发过程 W25Q64 技术实现 接线图 代码实现 技术要点 引脚操作 SPI初始化 SPI起始信号 SPI终止信号 SPI字节交换 宏替换W25Q64操作指令 W25Q64写使能 忙等待 读取设备ID号和制造商ID 页写入 数…...

系统架构-云原生架构设计

内涵 基于云原生技术&#xff0c;旨在将云应用中的非业务代码部分进行最大化的剥离&#xff0c;让云设施接管应用中原有的大量非功能特性。 云原生的代码包括三部分&#xff1a;业务代码、三方软件、处理非功能特性的代码 具备云原生架构的应用可以最大程度利用云服务和提升…...

ROS2: 服务通信

目录 服务通信模型服务通信的C实现服务端客户端 关键函数说明 服务通信模型 服务通信模型如上图所示&#xff0c;分为服务端和客户端&#xff0c;客户端根据需要向服务端发送请求&#xff08;Request&#xff09;&#xff0c;服务端处理请求&#xff0c;并向客户端发回响应&…...

贵州省棒球运动发展中长期规划(2024-2035)·棒球1号位

贵州省棒球运动发展中长期规划&#xff08;2024-2035&#xff09; Guizhou Province Baseball Development Medium & Long-Term Plan (2024-2035) 一、战略定位 | Strategic Positioning 立足贵州山地特色与民族文化&#xff0c;借鉴洛杉矶"社区棒球"模式&…...

深度学习中的autograd与jacobian

1. autograd 对于一个很简单的例子&#xff0c;如下图所示&#xff0c;对于一个神经元z&#xff0c;接收数据x作为输入&#xff0c;经过激活函数&#xff0c;获得激活后的结果&#xff0c;最后利用损失函数获得损失&#xff0c;然后梯度反向回传。 上图右侧即梯度反向回传的过…...

Ubuntu 使用dotfiles个性化配置模板

dotfiles 什么是dotfilercm软件手动修改/生成dotfile启动脚本 .bash_profile按键绑定 .inputrc别名 .alias其他dotfiles 从github克隆从Github库中下载代码让dotfile文件生效 GUN stow管理初始化目录结构使用Stow 参考文章 什么是dotfile 每个人都有自己用电脑的习惯&#xff…...

VIVADO IP核整理(二)——FFT

目录 IP 核配置IP 核接口s_axis_config_tdata 配置输入输出端口描述 仿真 参考&#xff1a;FFT IP核 详细介绍 参考&#xff1a;官方文档介绍 IP 核配置 在 IP Catalog 中搜索&#xff1a;Fast Fourier Transform 按照上图所示进行配置&#xff0c;下文对配置内容进行详述。 …...

Excel处理控件Aspose.Cells教程:压缩Excel文件完整指南

Excel 电子表格是管理、分析和可视化数据的有效工具&#xff0c;但随着文件复杂度的增加&#xff0c;它们很快就会变得臃肿。无论是由于数据集庞大、嵌入图片、格式过多还是隐藏工作表&#xff0c;Excel 文件的大小都可能迅速膨胀&#xff0c;导致打开速度变慢、难以通过电子邮…...

AKS 网络深入探究:Kubenet、Azure-CNI 和 Azure-CNI(overlay)

Kubernetes 网络使您能够配置 Kubernetes 网络内的通信。部署 AKS 集群时&#xff0c;有三种网络模型需要考虑&#xff1a; Kubenet 网络 KubeNet 是 AKS 中的基础网络插件。它可以被形象地比喻成大城市的地铁系统。地铁可能无法直接连接所有可能的地点&#xff08;例如您的服…...

angular的cdk组件库

目录 一、虚拟滚动 一、虚拟滚动 <!-- itemSize相当于每个项目的高度为30px --><!-- 需要给虚拟滚动设置宽高&#xff0c;否则无法正常显示 --> <cdk-virtual-scroll-viewport [itemSize]"40" class"view_scroll"><div class"m…...

unity 使用蓝牙通讯(PC版,非安卓)

BlueTooth in pc with unity 最近接到的需求是在unity里面开发蓝牙功能,其实一开始我并不慌,因为据我所知,unity有丰富的插件可以使用,但是问题随之而来 1.unity里面无法直接与蓝牙通讯(后来找到了开启runtime一类的东西,但是我找了半天也没找到在哪里可以打开) 2.引入dll通过d…...

Feign 重试策略调整:优化微服务通信的稳定性

在微服务架构中&#xff0c;服务之间的通信是常见的场景。然而&#xff0c;网络问题、服务不稳定或临时故障都可能导致通信失败。Feign 是一个流行的声明式 REST 客户端&#xff0c;广泛用于微服务间的通信。通过合理调整 Feign 的重试策略&#xff0c;可以显著提高系统的稳定性…...

Nacos源码—5.Nacos配置中心实现分析一

大纲 1.关于Nacos配置中心的几个问题 2.Nacos如何整合SpringBoot读取远程配置 3.Nacos加载读取远程配置数据的源码分析 4.客户端如何感知远程配置数据的变更 5.集群架构下节点间如何同步配置数据 1.关于Nacos配置中心的几个问题 问题一&#xff1a;SpringBoot项目启动时如…...

【spring】Spring、Spring MVC、Spring Boot、Spring Cloud?

这些都是 Spring 家族的重要组成部分&#xff0c;但它们各自定位不同、功能层级不同&#xff0c;可以用一张表格和简要说明来帮你快速理解&#xff1a; 一、四者概念和区别表格 名称功能定位主要用途/核心功能是否依赖其他部分Spring基础框架&#xff08;核心&#xff09;IOC、…...

RDD的处理过程

1. 创建RDD 通过SparkContext的parallelize方法从本地集合创建RDD。 从外部存储&#xff08;如HDFS、本地文件系统&#xff09;加载数据创建RDD。 通过对已有RDD进行转换操作生成新的RDD。 2. 转换操作&#xff08;Transformation&#xff09; 对RDD进行操作&#xff08;如…...

Vue3 中当组件嵌套层级较深导致 ref 无法直接获取子组件实例时,可以通过 provide/inject + 回调函数的方式实现子组件方法传递到父组件

需求&#xff1a;vue3中使用defineExposeref调用子组件方法报错不是一个function 思路&#xff1a;由于组件嵌套层级太深导致ref失效&#xff0c;通过provide/inject 回调函数来实现多层穿透 1. 父组件提供「方法注册函数」 父组件通过 provide 提供一个用于接收子组件方法…...

如何在Ubuntu上安装NVIDIA显卡驱动?

作者&#xff1a;算力魔方创始人/英特尔创新大使刘力 一&#xff0c;前言 对于使用NVIDIA显卡的Ubuntu用户来说&#xff0c;正确安装显卡驱动是获得最佳图形性能的关键。与Windows系统不同&#xff0c;Linux系统通常不会自动安装专有显卡驱动。本文将详细介绍在Ubuntu系统上安…...

Linux 修改bond后网关不生效的问题

1.前言 bond原本是OK的&#xff0c;但是某个同事变更后&#xff0c;发现网关路由存在问题 #查看路由&#xff0c;默认网关信息&#xff0c;发现没有配置的网关信息 ip route show #排查/etc/sysconfig/network-script/下面的ifcfg-* 文件没有问题 1.重启network 服务 systemct…...

chili调试笔记13 工程图模块 mesh渲染 mesh共享边显示实现

把模型投影到工程图要用什么模块当工程图的画板&#xff0c;最后要导出dxf的 three是怎么读取他的3d数据的 mesh不是三角形吗怎么渲染出四边形面的 我想看到三角形的边怎么设置 ai让我干嘛我就干嘛 static getAllEdges(face: { positions: Float32Array; indices: Uint16Array …...

Eclipse 插件开发 5 编辑器

Eclipse 插件开发 5 编辑器 1 编辑器描述2 自定义编辑器2.1 注册插件(plugin.xml)2.2 继承 EditorPart2.3 实现 IEditorInput2.4 打开编辑器 1 编辑器描述 Eclipse 的 UI 基于 Workbench&#xff08;工作台&#xff09;模型&#xff0c;Editor Area 是 Workbench 的核心区域之…...

Java消息队列性能优化实践:从理论到实战

Java消息队列性能优化实践&#xff1a;从理论到实战 1. 引言 在现代分布式系统架构中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;MQ&#xff09;已经成为不可或缺的中间件组件。它不仅能够实现系统间的解耦&#xff0c;还能提供异步通信、流量削峰等重要功能…...

Android学习总结之Binder篇

一、Binder 跨进程通信底层实现 Q1&#xff1a;Binder 如何实现一次完整的跨进程方法调用&#xff1f;请描述内核态与用户态交互流程 高频错误&#xff1a;仅回答 “通过 AIDL 生成代码”&#xff0c;未涉及 Binder 驱动三层协作模型 满分答案&#xff08;附内核交互流程图&a…...

very_easy_sql(SSRF+SQL注入)

题目有一行提示&#xff1a; you are not an inner user, so we can not let you have identify~&#xff08;你不是内部用户&#xff0c;所以我们不能让你进行身份验证&#xff09;联想到可能存在SSRF漏洞&#xff0c;一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内…...

MCP认证全解析:从零到微软认证专家

MCP认证全解析&#xff1a;从零到微软认证专家 什么是MCP认证&#xff1f; Microsoft Certified Professional&#xff08;MCP&#xff09;是由微软官方颁发的技术认证&#xff0c;旨在验证IT从业者在微软技术栈&#xff08;如Azure、Windows Server、SQL Server等&#xff0…...

leetcode刷题日记——反转链表

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求将链表中指定位置的部分进行翻转反转的部分&#xff0c;其实可以看做使用头插法插入链表运行如下&#xff1a; struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {struct ListNode te…...

【day04】Fibonacci数列 | 单词搜索 | 杨辉三角

1.Fibonacci数列 题目链接&#xff1a; Fibonacci数列_牛客题霸_牛客网 解题思路&#xff1a; 求斐波那契数列的过程中&#xff0c;判断⼀下&#xff1a;何时n会在两个fib数之间。 #include <bits/stdc.h>using namespace std;#define int long longsigned main() {i…...

win11指定Microsoft Print To PDF的输出路径(电子书djvu转pdf输出路径)

首先&#xff0c;看一张效果图 前面都是废话&#xff0c;解决方法看最后&#xff0c;看最后 Microsoft Print To PDF功能作为Windows操作系统内置的一项便捷工具&#xff0c;为用户提供了将任何可打印内容高效转换为PDF格式的能力。本文深入探讨了Microsoft Print To PDF的工作…...

第3章 数据和C

目录 3.1 示例程序3.2 变量与常量数据3.3 数据&#xff1a;数据类型关键字3.4 C数据类型3.4.1 int类型3.4.2 其它整数类型3.4.3 使用字符&#xff1a;char类型3.4.4 _Bool类型3.4.5 可移植的类型&#xff1a;inttypes.h3.4.6 float、double和long double类型3.4.7 复数和虚数类…...

迁移学习:如何加速模型训练和提高性能

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Kotlin zip 函数的作用和使用场景

1. zip 函数的作用 zip 是 Kotlin 集合操作中的一个函数&#xff0c;用于将两个集合按照索引一一配对&#xff0c;生成一个新的 List<Pair<T, R>> 集合。 作用&#xff1a;将两个集合的元素按位置组合成键值对&#xff08;Pair&#xff09;。返回值&#xff1a;一…...

通用分布式锁组件

Redisson的分布式锁使用并不复杂&#xff0c;基本步骤包括&#xff1a; 1&#xff09;创建锁对象 2&#xff09;尝试获取锁 3&#xff09;处理业务 4&#xff09;释放锁 但是&#xff0c;除了第3步以外&#xff0c;其它都是非业务代码&#xff0c;对业务的侵入较多&#x…...

FastDFS,分布式文件存储系统,介绍+配置+工具类

FastDFS 什么是分布式文件存储系统 随着文件逐渐增多&#xff0c;单台计算机已经存储不下这么多数据&#xff0c;需要用多台计算机存储不同的数据或进行备份&#xff0c;这样就需要有一个管理系统管理不同的计算机节点&#xff0c;这就是分布式管理系统。 使用分布式管理系统的…...

查询nvidia边缘设备的软硬件版本jetson_release

通过jetson_release命令可查询nvidia边缘设备的软硬件版本 nvidianvidia-desktop:~/leo/test_onnx$ jetson_release Software part of jetson-stats 4.2.12 - (c) 2024, Raffaello Bonghi Model: NVIDIA Orin Nano Developer Kit - Jetpack 5.1.1 [L4T 35.3.1] NV Power Mode[…...

[学习]RTKLib详解:ppp.c与ppp_ar.c

文章目录 RTKLib详解&#xff1a;ppp.c与ppp_ar.cPart A&#xff1a; ppp.c一、整体作用与工作流程二、核心函数说明1. pppos2. res_ppp3. tide_solid4. prectrop5. corrmeas6. udbias_ppp 三、数学原理补充四、代码特点 Part B: ppp_ar.c一、整体作用与工作流程分析二、函数功…...

ntdll!LdrpSnapThunk函数分析之LdrpNameToOrdinal函数返回之后得到函数地址

第一部分&#xff1a; OrdinalNumber LdrpNameToOrdinal( ImportString, ExportDirectory->NumberOfNames, DllBase, NameTableBase, …...

LeetCode 267:回文排列 II —— Swift 解法全解析

文章目录 摘要描述题解答案题解代码分析统计字符频率判断是否可能构成回文构建半边字符数组回溯生成半边排列 示例测试及结果时间复杂度空间复杂度实际使用场景&#xff1a;回文排列在真实项目里能干啥&#xff1f;文本处理、数据清洗类系统游戏开发&#xff1a;名字合法性验证…...

【渗透测试】命令执行漏洞的原理、利用方式、防范措施

文章目录 命令执行漏洞的原理、利用方式、防范措施一、原理**1. 定义与触发条件****2. 攻击链流程图** 二、利用方式**1. 利用手法与分类**(1) 系统命令注入(2) 代码执行漏洞(3) 框架漏洞利用 **2. 案例** 三、防范措施**1. 输入过滤与验证****2. 禁用危险函数****3. 安全开发*…...

旧版谷歌浏览器Chrome v116.0.5845.141下载

63位和32位均有&#xff1a; https://bbs.pcbeta.com/forum.php?modviewthread&tid1978299 https://www.31du.cn/open/google-chrome-v116-0-5845-141.html v116.0.5845.141的win32位版本&#xff1a; https://www.cr173.com/soft/435106.html v116.0.5845.97版本&…...

行业洞察| 当大模型开始协同工作:多智能体系统的崛起与挑战

你有没有想过&#xff0c;如果一群AI智能体拉了个工作群&#xff0c;它们会聊些什么&#xff1f; 程序员AI&#xff1a;“这段代码我来写&#xff01;” 产品经理AI&#xff1a;“需求还没说完呢&#xff01;” 辩论家AI&#xff1a;“我觉得这个方案不行&#xff01;” 吃瓜…...

The Action Replay Process

Preface A commonly used inequality − x > ln ⁡ ( 1 − x ) , 0 < x < 1 -x > \ln(1 - x), \quad 0 < x < 1 −x>ln(1−x),0<x<1 Proof: Let f ( x ) ln ⁡ ( 1 − x ) x f(x) \ln(1 - x) x f(x)ln(1−x)x, for 0 < x < 1 0 < …...

Python基于Django的病人信息管理系统及安全策略分析(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

YOLOv1:开创实时目标检测新纪元

一、引言 在计算机视觉领域&#xff0c;目标检测一直是重要的研究方向&#xff0c;广泛应用于自动驾驶、安防监控、智能机器人等场景。2016年&#xff0c;Joseph Redmon等人提出的YOLO&#xff08;You Only Look Once&#xff09;v1模型&#xff0c;以其端到端、单阶段、实时性…...

【今日三题】跳台阶扩展问题(找规律) / 包含不超过两种字符的最长子串 / 字符串的排列(回溯—全排列)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 跳台阶扩展问题(找规律)包含不超过两种字符的最长子串(字符串哈希)字符串的排列(回溯—全排列) 跳台阶扩展问题(找规律) 跳台阶扩…...

MySQL 中常见的日志

1. MySQL 中常见的日志有哪些&#xff1f; MySQL 主要包含以下几种日志&#xff1a; 错误日志&#xff08;Error Log&#xff09;&#xff1a;记录 MySQL 服务器的启动和停止过程中的信息&#xff0c;以及运行过程中出现的错误或警告信息。默认情况下&#xff0c;错误日志文件…...

ubuntu nobel + qt5.15.2 设置qss语法识别正确

问题展示 解决步骤 首选项里面的高亮怎么编辑选择都没用。如果已经有generic-highlighter和css.xml&#xff0c;直接修改css.xml文件最直接&#xff01; 在generic-highlighter目录下找到css.xml文件&#xff0c;位置是&#xff1a;/opt/Qt/Tools/QtCreator/share/qtcreator/…...