C语言9~10 DAY(合集)

news2024/11/15 4:43:50

数组的概念

什么是数组

数组是相同类型,有序数据的集合。

数组的特征

  • 数组中的数据被称为数组的元素,是同构的

  • 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类型的变量空间)

衍生概念:下标(索引)

  • 下标或索引代表了数组中元素距离第一个元素的偏移位置。

  • 数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址)。

  • 数组的下标是从0开始的。

一维数组

数组的定义

  • 类型说明符 数组名[数组容量]

说明:

  • 数组的类型说明符由数组中的元素来决定,也就是元素是什么类型,数组就是什么类型

  • 数组名也是标识符, 我们所说的数组(名),大家可以理解为数据类型是数组的变量(名)。

  • 数组容量也可以叫做常量表达式,举例: int ages[10]、int lcd[1024*768]

类型:代表了数组中元素的类型

容量:数组中能存储多少个元素,数组容量可以是一个常量、常量表达式,还可以是符号常量,但必须是整型。

深入理解:定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单元是连续的。

定义一个数组,相当于定义了多个匿名变量,这些变量可以通过 数组名[下标] 来标识。

举例:

// 定义一个数组
int arr[10];
// 问题:上面数组中,最小下标0,最大下标9

经过上面的案例,分析得到

 数组的最大下标 = 数组元素个数(数组容量) - 1

数组元素的访问

原则:数组中的元素不能一次性访问所有元素,只能一个一个的访问。

访问方式:

数组名[下标];

举例:

// 定义一个容纳10个元素的int数组
int arr[10];
// 给数组的第一个元素进行赋值
arr[0] = 89;
// 访问数组的第一个元素
int a = arr[0];
// 问题:以下访问是否正确
int b = arr[10]; // error,下标越界异常

注意:数组元素的访问一定不能越界

案例:

/*
需求:一维数组案例-引用数组元素。利用循环给数组元素a[0]~a[9]赋值0~9,并且逆序输出
*/
#include <stdio.h>
int main()
{
    // 创建一个数组
    int arr[10];
    // 使用for循环给数组赋值
    for(int i = 0;i < 10;i++)
    {
        arr[i] = i;
    }
    // 逆序输出
    // 我们通过循环将数组中的元素一个个取出来,称之为遍历
    for(int j = 9;j >= 0;j--)
    {
        printf("%d ",arr[j]);
    }
    printf("\n"); // 纯粹换行
    return 0;
}

数组的初始化

定义数组的同时,用指定数据来给对应元素赋值。

简化数组定义后,需要对元素一一赋值操作。

语法规则:

  • 类型 数组名[容量] = {常量1,常量2,常量3...};

注意事项:

  • 数组可以部分初始化:也就是可以给数组中前几个元素初始化,未被初始化的元素系统将自动初始化,如0;如果定义数组时未指定数据容量,则系统会根据初始化元素的个数来决定数组容量。

// 1. 如果定义数组时只给数组前几个初始化,后续剩余元素会自动完成初始化,比如赋值0
int arr[10] = {1,2,3,4,5} // 推荐写法,等价于以下写法
int arr[10] = {1,2,3,4,5,0,0,0,0,0}
// 2. 如果定义数组时未指定数据容量,根据初始化元素个数来决定容量
int arr[] = {1,2,3,4,5} // 推荐写法,等价于以下写法
int arr[5] = {1,2,3,4,5}

衍生概念:

  • 柔性数组:柔性数组的概念是在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;

广义简单理解:数组容量待定或者待确定的数组,举例: int arr[] = {1,2,3,4,5}

面试题:

  • 在不知道数组类型的情况下,如何确定数组元素的个数

int length = sizeof(arr) / sizeof(arr[0])

说明:

1. arr就是我们计算的数组本身,`sizeof(arr)`用来计算该数组中总的字节大小。
2. `sizeof(arr[0])`用来计算数组中一个元素所占的字节大小,因为数组中的元素类型相同,所以计算哪一个都行。
3. `sizeof(arr)/sizeof(arr[0])`就是用数组中总的字节数除以每一个元素所占的字节数,从而得到元素的个数。

一维数组案例

案例1:

/*
需求:一维数组案例-非波拉契数列
*/
#include <stdio.h>
int main()
{
    int i;// 循环变量
    int f[20] = {1,1}; // 定义一个数组,用来存储数列,默认存储第1位和第2位
    int length = sizeof(f)/sizeof(f[0]);// 计算数组的元素个数
    // 生出数列存入数组
    for(i = 2;i < length;i++)
    {
        // 给数组元素赋值,从数组的第3个元素开始
        f[i] = f[i - 2] + f[i - 1];
    }
    // 遍历数组
    // 通过循环将数组中的每一个元素取出来,称之为遍历
    for(i = 0;i < length;i++)
    {
        // 遍历的时候,要求一行显示5个数
        if(i % 5 == 0)
        {
            printf("\n");
        }
        printf("%6d",f[i]);
    }
    printf("\n");
    return 0;
}    

数组的典型应用:数据排序

冒泡排序

  • 向后冒泡 思想:

  1. 一次只排好一个数,针对n个数,最差情况需要 n-1次就可以排好

  2. 每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大/较小的数就会出现在最后,这也是该数应该有的位置。

  3. 在余下的数中,再次应用第2步的操作,直到只剩下一个数。

  • 向前冒泡

    思想:

    1. 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好

    2. 每次排序假定第一个元素是最大/最小的,用第一个元素的后面的元素一一与第一个元素比较,遇到较大/较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数;

    3. 在余下的数中,再次应用第2步的操作,直到只剩下一个数。

一维数组案例

案例2:

/*
需求:一维数组案例-冒泡排序
*/
#include <stdio.h>
int main()
{
    // 创建一个数组,用来存储排序的数列
    int arr[11];
    int i,j,temp;// i:比较的轮数,j:每一轮比较的次数,temp:临时变量,用来比较时交换数据
    printf("请输入11个测试整数:\n");
    // 计算数组的大小
    int length = sizeof(arr) / sizeof(int); // 这里 sizeof(int) 等价于 sizeof(arr[0]);
    // 通过循环录入数据
    for(i = 0;i < length; i++)
    {
        scanf("%d",&arr[i]);
    }
    printf("\n");
    // 对数组arr使用冒泡进行排序(注意:我们使用标准冒泡,大家也可以自行补充优化版的冒泡,如鸡尾酒排序法等等)
    // 外层循环:控制比较的轮数,因为有11个数,所以我们需要比较 length -1 轮,也就是比较10轮
    for(i = 0;i < length -1;i++)
    {
        // 内层循环:每一轮比较的次数,每一轮比较的次数为 length - 1 - i, 3-1-0=2,3-1-1=1,3-1-2=0
        for(j = 0;j < length-1-i;j++)
        {
            // 相邻的两个数进行比较,满足条件交换位置
            if(arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    printf("冒泡排序后遍历数组:\n");
    for(i = 0; i < length; i++)
    {
        printf("%4d",arr[i]);
    }
    printf("\n");
    return 0;
}

案例3:

/*
需求:一维数组案例-从键盘输入年、月、日,计算并输出该日是该年的第几天。
*/
#include <stdio.h>
int main()
{
    // 定义变量:年,月,日,统计总天数,循环变量,用来遍历当前月前面的月份
    int year,month,day,sum,k;
    // 定义一个数组,用来存放1~12月每月的天数
    int t[] = {31,0,31,30,31,30,31,31,30,31,30,31};// 柔性数组
    printf("请输入年份、月份、天:\n");
    scanf("%d,%d,%d",&year,&month,&day);
    // 因为二月比较特殊,存在平年和润年这样的因素,所以需要进行平年和润年的判断
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        t[1] = 29; // 润年 2月 29天
    }
    else
    {
        t[1] = 28; // 平年 2月 28天
    }
    sum = day; // 默认记录最后一个月的天数
    // 这是该年的第几天
    for(k = 0; k < month -1;k++)
    {
        sum += t[k]; // 叠加前几个月的天数
    }
    printf("%d月%d日是%d年的第%d天。\n",month,day,year,sum);
    return 0;
}   

二维数组

定义

  • 二维数组本质上是一个行列式的组合,也就是说二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。

  • 二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。

语法

类型 数组名[行数][列数];

举例:

int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; // 等价于以下写法
int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}}; // 柔性数组
int arr[3][] = {{1,2},{4,5,6},{7}} // 等价于 {{1,2,0},{4,5,6},{7,0,0}}

应用场合

主要应用于数据有行列要求的情况。

特殊写法

下标可以是整型表达式,如: a[2-1] [2*2-1]

下标可以是已经有值的变量或数组元素, 如 a[2*x-1] [b[3] [1]]

数组元素可以出现在表达式中, 如: b[1] [2]=a[2] [3]/2

初始化

  • 分行给二维数组赋初值

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 
  • 可将所有数据写在一个花括号内,按照排列顺序对元素赋值。

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; // 等价于上面的写法 
  • 可对部分元素赋初值,其余未赋值部分自动填充 0 | \0 | 0.0...

int a[3][4] = {{1},{5,6},{9}}; // 等价于 int a[3][4] = {{1,0,0,0},{5,6,0,0},{9,0,0,0}} 
  • 若对全部元素赋初值,自定义数组时可以省略第1为数组的长度,第2维数组的长度必须指明。

int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
  • 在分行赋初值是,也可以省略第1维的长度。

int a[][4] = {{1,2,3},{0},{0,10}}; // 等价于 int a[][4] = {{1,2,3,0},{0,0,0,0},{0,10,0,0}} 

案例

案例1:

/**
* 案例:二维数组的遍历
*/
#include <stdio.h>
int main()
{
    int arr[][3] = {{1},{2,4},{5,6,7}};// 经过论证:二维数组我们必须指明第2维的数组的长度
    // 获取行元素的大小
    int length = sizeof(arr) / sizeof(arr[0]); // 如果是二维数组,第1维的长度,应该是如左侧这样获取
    printf("length:%d\n",length);
    // 遍历二维数组,需要使用双层for循环,外层遍历行,内层遍历每一行的列
    for(int row = 0;row < length;row++)
    {
        // 获取列元素的总大小
        int len = sizeof(arr[row]) / sizeof(int);
        for(int col = 0; col < len; col++)
        {
            // 获取列元素
            printf("%3d",arr[row][col]);// 意思是获取数组arr 第row行第col列
        }
        printf("\n");
    }
    return 0;
}
// 数据类型,分支结构,循环结构,数组

案例2:

/**
* 需求:二维数组案例-矩阵的转置(就是将一个2行3列的数组转换为3行2列的数组)
*/
#include <stdio.h>
int main()
{
    // 准备2个数组,存放转前和转后的数据
    int arr_before[2][3] = {1,2,3,4,5,6};
    int arr_after[3][2] = {0};// 初始化,每一列上都是0
    // 遍历arr_before
    for(int i = 0;i < sizeof(arr_before)/sizeof(arr_before[0]);i++)
    {
        for(int j = 0;j < sizeof(arr_before[i])/sizeof(int);j++)
        {
            // 转置
            arr_after[j][i] = arr_before[i][j];
        }
    }
    // 遍历arr_after
    for(int i = 0;i < sizeof(arr_after)/sizeof(arr_after[0]);i++)
    {
        for(int j = 0;j < sizeof(arr_after[i])/sizeof(int);j++)
        {
            // 输出
            printf("%4d",arr_after[i][j]);
        }
        printf("\n");
    }
    return 0;
}

案例3

/**
* 需求:二维数组案例-准备一个int类型的二维数组,求该数组中大的最大值,以及对应的行号,列号
*/
#include <stdio.h>
int main()
{
    // 准备一个二维数组
    int arr[3][4] = {{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
    // 创建变量,用保存最大值、行号、列号
    int max = arr[0][0],row=0,col=0;
    // 遍历集合
    for(int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
    {
        for(int j = 0;j < sizeof(arr[i]) / sizeof(arr[i][0]);j++)
        {
            // 判断最大值
            if(arr[i][j] > max)
            {
                max = arr[i][j];
                row = i;
                col = j;
            }
        }
    }
    printf("max=%d,row=%d,col=%d\n",max,row,col);
    return 0;
}          

字符数组

概念

  • 元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们C语言中的字符是字节字符。

  • 字节字符:也就是一个字符占1个字节

测试题:

char a = 'A' // 正确
char b = '1' // 正确
char c = 65 // 正确 这是ASCII码编号,对应的值是 'A'
char d = "A" // 错误,这是字符串的写法,也是char数组的写法,char d[1] = "A"
char e = '马' // 错误,中文一个字符超过1一个字节

语法

char 数组名[容量];
char 数组名[行容量][列容量];

字符数组的语法就是之前所学一维数组和二维数组的语法,只不过数据类型是char而已。

注意: 如果我们的char数组初始化的时候,没有完全赋完值的时候,空出来的地方使用 \0 进行填充。

字符案例

案例1:

/**
* 需求:字符数组案例-输出一个字符串(I LOVE YOU!)
*/
#include <stdio.h>
int main()
{
    // 准备一个测试字符串 I LOVE YOU!
    char arr[11] = {'I',' ','L','O','V','E',' ','Y','O','U','!'};
    // 通过一个for循环进行遍历输出
    for(int i = 0;i < sizeof(arr)/sizeof(char);i++)
    {
        printf("%c",arr[i]);
    }
    printf("\n");
    return 0;
}

案例2:

/**
* 需求:字符数组案例-输出一个用字符组成的菱形图案
*/
#include <stdio.h>
int main()
{
    // 准备数据
    char arr[5][5] = {{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{'
    ','*',' ','*',' '},{' ',' ','*',' ',' '}};
    // 遍历数组
    for(int i = 0;i < sizeof(arr)/sizeof(arr[0]);i++)
    {
        for(int j = 0;j < sizeof(arr[i])/sizeof(char);j++)
        {
            // 打印菱形
            printf("%c",arr[i][j]);
        }
        // 内层循环每结束一轮,就是一行
        printf("\n");
    }
    printf("\n");
    return 0;
}    

字符串和字符串结束标志

说明

字符数组的多样表示

我们的char数组可以以数组的方式一个个输出每个字符;我们的char数组也可以以字符串的方式整体

进行输出所有字符。具体如下面案例:

/*
需求:字符数组->字符串
*/
#include <stdio.h>
int main()
{
    // 字符串第1种表示:
    char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d'};
    // 字符串第2种表示:
    char s2[] = {"hello world"};
    // 字符串第3种表示:
    char s3[] = "hello world";
    // 测试,使用字符串方式打印,这样就不用一一遍历
    printf("%s\n",s1);
    printf("%s\n",s2);
    printf("%s\n",s3);
    
    return 0;
}

注意

  • 字符串的长度与字符数组的长度不一定相同。

  • 利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值。

// 正确写法:利用字符串常量给字符数组初始化
char b[15] = "China";
// 错误写法:利用字符串常量给字符数组赋值
char b[15];
b[15] = "China";

字符串的基础操作

字符串输入

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    scanf("%s",name);// 如果是字符串,这里不是变量地址,是变量名
    printf("您的姓名是:%s\n",name);
    return 0;
}

注意:采用scanf进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束。

  • fgets(数组名,数组容量,stdin);

说明:采用fgets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我们

可能需要处理 \n

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    fgets(name,sizeof(name)/sizeof(char),stdin);// 输入,返回地址
    puts(name);// 输出
    return 0;
}

注意:

  1. 如果输入的字符串不包含 空格 和 换行 ,可以使用scanf() | fgets();

  1. 如果输入的字符串需要包含 空格 和 换行 ,只能使用fgets();

  2. 经过对比,我们发现,在字符串的输入中,fgets()更好;

字符串输出

puts(数组名)

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    scanf("%s",name);
    puts(name);// 输出 问题?字符串如何拼接
    printf("您的姓名是:%s\n",name);
    return 0;
}
  • printf("%s",数组名);

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    scanf("%s",name);
    printf("您的姓名是:%s\n",name);
    return 0;
}

字符串拼接

  • strcat(数组名,"需要拼接的字符串") 注意:需要引入 #include <string.h>

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    fgets(name,sizeof(name)/sizeof(char),stdin);// 输入,返回地址
    puts(strcat(name," 跑着!"));// 拼接
    return 0;
}

字符串拷贝

  • strcpy(数组名,字符串)

    注意:需要引入 <string.h>库

    说明:这个方法适合给字符串赋值用。

char str[16] = "马杰克" // 初始化,正确
char str[16]; str[16] = "马杰克" // 赋值,错误
char str[16]; strcpy(str,"马杰克") // 赋值,正确,结果:马杰克

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char name[20];
    printf("请输入您的姓名:\n");
    scanf("%s",name);
    strcpy(name,"你好");
    printf("%s\n",name);// 输出
    return 0;
}

字符串比较

  • strcmp(字符串1,字符串2);

    注意:

  1. 需要引入 <string.h>

  2. 返回的结果是boolean

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char username[20];
    printf("请输入您的账户:\n");
    scanf("%s",username);
    if(strcmp(username,"admin"))
    {
        printf("账户输入错误!\n");
    }
    else
    {
        printf("账户输入正确!\n");
    }
    return 0;
}

获取字符串长度

  • strlen(字符串)

注意:

  1. 需要 <string.h>

  2. 返回字符串长度

案例:

/*
* 需求:字符数组-字符串的输入输出
*/
#include <stdio.h>
#include <string.h>
int main()
{
    // 创建一个变量,用来存放人的名字
    char username[20];
    printf("请输入您的账户:\n");
    scanf("%s",username);
    // 获取字符串长度
    unsigned long len = strlen(username);
    if(strcmp(username,"admin"))
    {
        printf("账户输入错误!%lu\n",len);
    }
    else
    {
        printf("账户输入正确!%lu\n",len);
    }
    return 0;
}

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

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

相关文章

力扣高频SQL 50题(基础版)第三十七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十七题176.第二高的薪水题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十七题 176.第二高的薪水 题目说明 Employee 表&#xff1a; ----------------- …

【传知代码】基于标签相关性的多标签学习(论文复现)

在当今信息爆炸的时代&#xff0c;数据中包含的标签信息对于理解和分析复杂问题至关重要。在诸如文本分类、图像识别和推荐系统等应用中&#xff0c;如何有效地利用标签相关性提升多标签学习的效果成为了研究的热点之一。基于标签相关性的多标签学习方法&#xff0c;通过挖掘不…

存储届的奥运竞技 | 400层3D NAND最快2025到来~

随着内存巨头之间的高带宽内存 (HBM) 竞争日益激烈&#xff0c;NAND 存储器领域的竞争也在升温。据韩国媒体《etnews》报道&#xff0c;SK 海力士正在研发 400 层 NAND 闪存技术&#xff0c;计划在 2025 年底前准备好这项技术以实现量产。 报道称&#xff0c;SK 海力士目前正在…

AcWing并查集

建议先看这个 Bilibili------------------>图论——并查集(详细版) 其实M 1 2就是把1的祖先改成了2&#xff0c;然后M 3 4就是把3的祖先改成了4&#xff0c;然后查询这两数1,2的祖先是不是同一个&#xff0c;3,4的祖先是不是同一个&#xff0c;1&#xff0c;3的祖先是不是同…

【期货】收盘点评。昨天说的,p2409棕榈油在今天或者周一会走出行情

收盘点评 昨天说的&#xff0c;p2409棕榈油在今天或者周一会走出行情。事实就是如此。震荡了几天了&#xff0c;波幅不大的来回震荡&#xff0c;其实主力是不想震荡的&#xff0c;但是不震荡自己的货和行情走不出来。所以我昨天就说&#xff0c;应该就是这一两天会走出一波小行…

⑤【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信

从0制作自己的ros导航小车 前言一、准备工作二、下位机端&#xff08;STM32&#xff09;三、上位机端&#xff08;旭日x3派&#xff09;四、测试 系列文章&#xff1a; ①【从0制作自己的ros导航小车&#xff1a;介绍及准备】 ②【从0制作自己的ros导航小车&#xff1a;下位机篇…

一站式解决方案:打造无缝连接的跨渠道客户服务体验

在当今这个数字化时代&#xff0c;客户与企业之间的互动已不再局限于单一渠道。从社交媒体、在线聊天、电子邮件到电话热线&#xff0c;甚至是实体店面&#xff0c;客户期望能够随时随地、无缝切换地获得一致且高效的服务体验。因此&#xff0c;构建一站式解决方案&#xff0c;…

商城系统审计代码审计

1 开源组件通用性漏洞审计 1.1 fastjson漏洞审计与验证 1.1.1 相关知识 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对 象之间相互转换。 Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。 攻击者可以传入一个恶…

算法小白的进阶之路(力扣6~8)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

对象属性值对比(支持复杂对象)

文章目录 前言一、如何对比二、开始编码三、使用结果示例总结 前言 需求如下&#xff1a; 对比两个bean中的内容,返回其中属性的值不一致的完整信息,包括: 属性 新值 旧值 一、如何对比 例如我有一个这的类型: public class Tel {private String name;private String tel; …

学习笔记第十七天

1.链表 1.1链表尾插 void push_back(struct Node *pHead,int n)//尾插 {if(isEmpty(pHead)){push_front(pHead,n);}else{struct Node *p pHead->next; while(p->next !NULL){p p->next;}struct Node *pNew malloc(sizeof(struct Node));p->nextpNew;pNew->n…

C++ bind复杂回调逻辑分析

回调函数基本知识回顾 回调函数是什么 函数指针或者函数对象作为参数传递给另一个函数的机制&#xff0c;当某个事件发生的时候&#xff0c;系统会自动的调用这些函数进行处理事件驱动模型中作用&#xff0c;回调函数则被用于处理I/O事件&#xff0c;通常用来读写异常等事件 bi…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备 ​ 大家好&#xff0c;因为板端BPU环境&#xff0c;可以加速目标检测的速度&#xff0c;所以今天在此先给大家带来如何准备一个模型&#xff0c;下一期会给大家带来如何在板端部…

如何做一个惊艳领导和客户的原型?

在产品开发过程中&#xff0c;原型设计是验证设计想法、提升用户体验的重要环节。Axure作为一款业界领先的原型设计工具&#xff0c;凭借其强大的交互设计和丰富的功能&#xff0c;赢得了全球设计师和开发者的信赖。而Axure的高效交互元件库&#xff0c;则如同一本字典或说明书…

将YOLOv8模型从PyTorch的.pt格式转换为OpenVINO支持的IR格式

OpenVINO是Open Visual Inference & Neural Network Optimization工具包的缩写&#xff0c;是一个用于优化和部署AI推理模型的综合工具包。OpenVINO支持CPU、GPU和NPU设备。 OpenVINO的优势: (1).性能&#xff1a;OpenVINO利用英特尔CPU、集成和独立GPU以及FPGA的强大功能提…

原生IP节点是什么意思?和socks5节点有什么区别?

在了解这两种代理节点前&#xff0c;我们首先要了解&#xff1a;节点是什么&#xff1f; 首先&#xff0c;在电信网络当中&#xff0c;一个节点是一个连接点。表示一个再分发点又或者是一个通信端点。节点的定义依赖于所提及的网络和协议层。一个物理网络节点是一个连接到网络…

深度强化学习:穿越智能迷雾,探索AI新纪元

近年来&#xff0c;深度强化学习成为关注的热点。在自动驾驶、棋牌游戏、分子重排和机器人等领域&#xff0c;计算机程序能够通过强化学习&#xff0c;理解以前被视为超级困难的问题&#xff0c;取得了令人瞩目的成果。在围棋比赛中&#xff0c;AlphaGo接连战胜樊麾、李世石和柯…

使用 SpringBoot + 虚拟线程将服务性能提升几百倍

虚拟线程简介 虚拟线程是 Java 平台的一项创新特性。虚拟线程是一种轻量级的线程实现,它在操作系统层面并不对应真实的内核线程,而是由 JVM 进行管理和调度。这使得可以在不消耗大量系统资源的情况下创建大量的线程,从而能够更高效地处理并发任务。 虚拟线程与普通线程的区…

【数学建模】——【A题 信用风险识别问题】全面解析

目录 1.题目 2.解答分析 问题1&#xff1a;指标筛选 1.1 问题背景 1.2 数据预处理 1.3 特征选择方法 1.4 多重共线性检测 1.5 实现步骤 问题2&#xff1a;信用评分模型 2.1 问题背景 2.2 数据分割 2.3 处理不平衡数据 2.4 模型选择与理由 问题3&#xff1a;模型对…

『 Linux 』线程池与 POSIX 线程的封装编码实现

文章目录 线程池概念线程池的编码实现线程池的测试参考代码 线程的封装使用测试封装后的线程参考代码 线程池概念 池化技术是一种资源管理方法,通过预先创建和管理一组资源以便在需要使用时快速分配这些资源; 线程池是池化技术的一种典型应用; 资源分配 在线程池中预先创建一定…