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

【C++】Arrays

在这里插入图片描述

《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记


文章目录

  • 1、一维数组的定义与初始化
    • 1.1、一维数组的定义
    • 1.2、一维数组的初始化
  • 2、一维数组的使用
  • 3、一维数组与函数
  • 4、二维数组
    • 4.1、二维数组的定义
    • 4.2、二维数组的初始化
    • 4.3、二维数组的使用
  • 5、字符数组
    • 5.1、字符数组的定义
    • 5.2、字符数组的初始化
    • 5.3、字符数组的使用
    • 5.4、字符串常用函数
  • 6、string 类型
    • 6.1、字符串变量的定义与初始化
    • 6.2、字符串变量的使用
    • 6.3、字符串数组
  • 7、应用实例

1、一维数组的定义与初始化

1.1、一维数组的定义

把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组

数组相当于一次性定义出多个同类型的变量。

dataType arrayName[size];
  • dataType 是数组中元素的类型(如 int、float、char 等)。
  • arrayName 是数组的名称。
  • size 是数组中元素的数量,整型常量表达式

eg

int numbers[5];  // 定义一个包含5个整数的数组

在这里插入图片描述
eg

#include <iostream>
using namespace std;

int main() 
{
    int a[10];
    for(int i=0; i<10; i++)
        cout << sizeof(a[i]) << ' ' << &a[i] << ' ' << a[i] << endl;
    return 0;
}

output

4 0x64b1bffaf0 0
4 0x64b1bffaf4 0
4 0x64b1bffaf8 560010489
4 0x64b1bffafc 32759
4 0x64b1bffb00 316807608
4 0x64b1bffb04 448
4 0x64b1bffb08 96
4 0x64b1bffb0c 0
4 0x64b1bffb10 316807664
4 0x64b1bffb14 448

1.2、一维数组的初始化

不初始化,数组空间里将是系统赋给的随机值(上面小节的例子中可以看出)

#include <iostream>
using namespace std;

int main() 
{
    cout << "case 1" << endl;
    int s[6] = {1, 2, 3, 4, 5, 6};
    for(int i=0; i<6; i++)
        cout << s[i] << endl;
    
    cout << "case 2" << endl;
    int s1[] = {1, 2, 3, 4, 5, 6};
    for(int i=0; i<6; i++)
        cout << s1[i] << endl;
    
    cout << "case 3" << endl;
    int s2[6] = {1, 2, 3, 4};
    for(int i=0; i<6; i++)
        cout << s2[i] << endl;
    
    cout << "case 4" << endl;
    int s3[6] = {1};
    for(int i=0; i<6; i++)
        cout << s3[i] << endl;

    cout << "case 5" << endl;
    char s4[6] = "hello";  // 初始化字符数组为字符串 "hello",注意字符串末尾会自动加上空字符 '\0'
    for(int i=0; i<6; i++)
        cout << s4[i] << endl;
    return 0;
}

定义并初始化数组 char s4[6] = "hello!"; 会报错,因为字符数组在初始化时,末尾会自动加上空字符 \0 以标识字符串的结束。

output

case 1
1
2
3
4
5
6
case 2
1
2
3
4
5
6
case 3
1
2
3
4
0
0
case 4
1
0
0
0
0
0
case 5
h
e
l
l
o

注意,当离开了定义的语句,则不能用初始化列表对数组进行整体赋值。

error

int s[5];
s = {1,2,3,4,5}

error

int s[5];
s[5] = {1,2,3,4,5};

2、一维数组的使用

eg 5-1 从键盘输入 10 个整数,然后按输入的相反顺序输出

#include <iostream>
using namespace std;

int main() 
{
    int a[10];
    for(int i=0; i<10; i++)
        cin >> a[i];
    for(int i=9; i>=0; i--)
        cout << a[i] << " ";
    return 0;
}

output

1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

eg 5-2,计算 Fibonacci 数列的前 10 个数据,用数组保存并打印出来

方法一,递归

#include <iostream>
using namespace std;

int fibonacci(int x)
    {
        if((x==1) || (x==2))
            return 1;
        else
            return fibonacci(x-1) + fibonacci(x-2);
    }

int main() 
{
    int a[10];
    for(int i=0; i<10; i++)
        a[i] = fibonacci(i+1);
    for(int i=0; i<10; i++)
        cout << a[i] << " ";
    return 0;
}

output

1 1 2 3 5 8 13 21 34 55

方法二,数组

#include <iostream>
using namespace std;

int main() 
{
    int fibonacci[10] = {1, 1};
    for(int i=2; i<10; i++)
        fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
    for(int i=0; i<10; i++)
        cout << fibonacci[i] << " ";
    return 0;
}

output

1 1 2 3 5 8 13 21 34 55

3、一维数组与函数

由于数组名是一片连续空间的首地址,如果将其作为函数的实参,传递的内容将是一个地址。因此要求函数的形参是能够接受地址的变量,所以形参也需要声明一个数组。

eg 5-3,对数组的元素进行升序排序

#include <iostream>
using namespace std;

void sort(int a[])
{
    for(int i=0; i<6; i++) // 进行6趟比较
    {
        for(int j=i+1; j<6; j++) // 每趟进行 5-i 次两两比较
        {
            if(a[i]>a[j])  // 如果前面的数字大于后面的数字,交换位置
            {
                int temp;
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}

int main() 
{
    int a[6] = {8,3,6,1,9,7};
    sort(a);
    for(int i=0; i<6; i++)
        cout << a[i] << " ";
    return 0;
}

output

1 3 6 7 8 9 

上个例子展示了冒泡排序

系统没有为数组 a 开辟空间,而是让数组 a 和函数里面的数组 a 共用了同一块空间(因为是地址传递)

4、二维数组

二维数组是一种用于存储表格数据的结构,其中每个元素都是一个一维数组。

4.1、二维数组的定义

数据类型 数组名[整形常量表达式1][整形常量表达式2]

eg

int s[3][4];

error

int a[2,5];

二维数组虽然在形式上可以看作一个表格的形状,但在内存中的存放却是按照一维线性排列(行优先),这是由内存编址决定的
在这里插入图片描述

4.2、二维数组的初始化

按行

int s[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

eg:

#include <iostream>
using namespace std;

int main() 
{
    cout << "case1:"<<endl;
    int s[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
    for(int i=0; i<3; i++){
        for(int j=0; j<4; j++)
            cout<<s[i][j] <<" ";
        cout << endl;
    }

    cout << "case2:"<<endl;
    int s2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    for(int i=0; i<3; i++){
        for(int j=0; j<4; j++)
            cout<<s2[i][j] <<" ";
        cout << endl;
    }

    cout << "case3:"<<endl;
    int s3[3][4] = {1,2,3,4,5,6,};
    for(int i=0; i<3; i++){
        for(int j=0; j<4; j++)
            cout<<s3[i][j] <<" ";
        cout << endl;
    }

    cout << "case4:"<<endl;
    int s4[3][4] = {{1,2},{3,4,5},{6},};
    for(int i=0; i<3; i++){
        for(int j=0; j<4; j++)
            cout<<s4[i][j] <<" ";
        cout << endl;
    }
    return 0;
}

output

case1:
1 2 3 4
5 6 7 8
9 10 11 12
case2:
1 2 3 4
5 6 7 8
9 10 11 12
case3:
1 2 3 4
5 6 0 0
0 0 0 0
case4:
1 2 0 0
3 4 5 0
6 0 0 0

4.3、二维数组的使用

eg 5-4

#include <iostream>
using namespace std;

int main() 
{
    int s[5][5] = {0};
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++)
            s[i][j] = 3*i +2*j - 8;
    }

    int sum1= 0;
    for(int i=0; i<5; i++){
        sum1 += s[3][i];
    }
    cout << "第四行所有元素之和为:" <<sum1 << endl;

    int avg= 0;
    for(int i=0; i<5; i++){
        avg += s[i][4];
    }
    cout << "第五列所有元素的平均值为:" << avg*1.0/5 << endl;

    int num =0;
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++){
            if ((i==j) && (s[i][j]<0))
                num += 1;
        }
    }
    cout << "主对角线负数的个数为:" << num << endl;

    return 0;
}

output

第四行所有元素之和为:25
第五列所有元素的平均值为:6
主对角线负数的个数为:2

下面用函数的形式实现上例

注意,二位数组作为形参的时候,必须给出数组类型,数组的维度,以及第二维的大小int s[][] 会报错 an array may not have elements of this type

eg 5-5

#include <iostream>
using namespace std;

void sum_row(int s[][5])
{
    int sum1= 0;
    for(int i=0; i<5; i++){
        sum1 += s[3][i];
    }
    cout << "第四行所有元素之和为:" <<sum1 << endl;
}

void avg_col(int s[][5])
{
    int avg= 0;
    for(int i=0; i<5; i++){
        avg += s[i][4];
    }
    cout << "第五列所有元素的平均值为:" << avg*1.0/5 << endl;
}

void num(int s[][5])
{
    int num =0;
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++){
            if ((i==j) && (s[i][j]<0))
                num += 1;
        }
    }
    cout << "主对角线负数的个数为:" << num << endl;
}

int main() 
{
    int s[5][5] = {0};
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++)
            s[i][j] = 3*i +2*j - 8;
    }
    
    sum_row(s);
    avg_col(s);
    num(s);

    return 0;
}

output

第四行所有元素之和为:25
第五列所有元素的平均值为:6
主对角线负数的个数为:2

5、字符数组

用来存放字符的数组。

字符数组常用于表示字符串

5.1、字符数组的定义

char myArray[10]; // 声明一个包含10个字符的数组,未初始化
char str[3][10];

5.2、字符数组的初始化

#include <iostream>
using namespace std;

int main() 
{
    char c1[4] = {'a', 'b', 'c', 'd'};
    for(int i=0; i<4; i++)
        cout<<c1[i]<<endl;

    char c2[4] = {'a', 'b', 'c',};
    for(int i=0; i<4; i++)
        cout<<c2[i]<<endl;

    char c3[] = {'c', 'h', 'i', 'n', 'a'};
    cout << sizeof(c3) / sizeof(c3[0]) << endl;

    char c4[6] = {"china"};

    //char c5[6] = {"china!"};  // error
    return 0;
}

output

a
b
c
d
a
b
c

5

注意,字符串总是用 \0 作为串的结束符,所以用字符串初始化字符数组的时候,注意初始化长度+1

注意 char c3[] = {'c', 'h', 'i', 'n', 'a'}; 这种初始化方法

5.3、字符数组的使用

eg 5-6,输入十个字符,反向输出来

#include <iostream>
using namespace std;

int main() 
{
    char a[10] = {'\0'};
    for(int i=0; i<10; i++)
        cin >> a[i];
    for(int i=9; i>=0; i--)
        cout << a[i] << " ";
    return 0;
}

output

a b c d e f e r f g
g f r e f e d c b a 

eg 5-7,输入正整数 m,使用最少张数的人民币纸币,凑成上述钱数 m

#include <iostream>
using namespace std;

int main() 
{
    int mon[7] = {100, 50, 20, 10, 5, 2, 1};
    int num[7] = {0};
    int money;
    cin >> money;
    for(int i=0; i<7; i++)
    {
        num[i] = money / mon[i];
        money = money - num[i] * mon[i];
    }
    for(int i=0; i<7; i++)
    {
        if(num[i])
            cout << "需要" << num[i] << "张" << mon[i] << endl;
    }

    return 0;
}

output

863
需要8100
需要150
需要110
需要12
需要11

eg 5-8 从键盘获取一串字符,分别统计出其英文、数字和其他字符的数量

#include <iostream>
using namespace std;

int main() 
{
    char s[30];
    for(int i=0; i<30; i++)
        cout << s[i] << " ";
    cout << "\n请输入字符串:";
    cin >> s;
    int alph=0, num=0, other=0;

    for(int i=0; i<30; i++)
    {
        if (s[i] == '\0')
            break;

        if(s[i]>='0' && s[i]<='9')
            num += 1;
        else if (('a'<=s[i] && 'z'>=s[i]) || ('A'<=s[i] && 'Z'>=s[i]))
            alph += 1;
        else
            other += 1;
    }
    cout<< "输入的字符串为:"<< s << endl;
    cout << alph << " " << num << " " << other << endl;

    return 0;
}

output

                        �  � � �  
请输入字符串:2we!489rsou3#
输入的字符串为:2we!489rsou3#
6 5 2

注意字符串数组可以直接 cout << ,不用循环输出

5.4、字符串常用函数

  • strcpy:复制一个字符串到另一个字符串。
  • strncpy:将源字符串的部分内容复制到目标字符串中,可以指定长度。注意,如果指定的长度不足以容纳源字符串的所有字符,目标字符串将不会被空字符’\0’正确终止。
  • strcat:在目标字符串末尾追加源字符串。
  • strncat:在目标字符串末尾追加源字符串的部分内容,可以指定长度。同样,如果指定的长度加上目标字符串的当前长度超过了目标字符串的总容量,可能会导致缓冲区溢出。
  • strlen:计算字符串的长度,不包括空字符’\0’。
  • strcmp:依照 ASCII 码表中的大小,依次比较两个字符串中对应位置上的字符,相等0,
  • strncmp:比较两个字符串的部分内容,可以指定长度。比较规则与strcmp相同。
  • atof:将字符串转换为浮点数。
  • atoi:将字符串转换为整数。
  • atol:将字符串转换为长整型数。

(1)字符串连接函数 strcat

strcat(s1, s2); 把 s2 中的字符串连接到 s1 字符串后面,返回的是 s1 的首地址

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char s1[] = {"Kobe "};
    char s2[] = {"Bryant!"};
    strcat(s1, s2); // 把 s2 中的字符串连接到 s1 字符串后面,返回的是 s1 的首地址
    cout << s1 << endl;
    cout << s2 << endl;
    return 0;
}

output

Kobe Bryant!
Bryant!

注意 s1 中的 \0 会被覆盖掉

(2)字符串拷贝函数 strcpy

复制一个字符串到另一个字符串

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char s1[] = {"I love "};
    char s2[] = {"apple!"};
    cout << strcpy(s1, s2)<< endl;
    return 0;
}

output

apple!

(3)字符串比较函数 strcmp

strcmp:依照 ASCII 码表中的大小,依次比较两个字符串中对应位置上的字符,相等0,

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char s1[] = {"Kobe "};
    char s2[] = {"Bryant!"};
    char s3[] = {"Kobe "};
    cout << strcmp(s1, s2) << endl;
    cout << strcmp(s2, s1) << endl;
    cout << strcmp(s1, s3) << endl;
    return 0;
}

output

1
-1
0

(4)计算字符串长度函数 strlen

不包括 \0

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char s1[] = {"I love "};
    char s2[] = {"apple!"};
    cout << strlen(s1)<< " " << strlen(s2) <<endl;
    return 0;
}

output

7 6

eg 5-9 从键盘获取三个字符串
(1)计算长度
(2)找出最大的字符串
(3)将三个字符串连起来放在 s1 中,并输出
(4)将 s3 的内容拷贝到 s2 中

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char s1[30], s2[15], s3[10];
    cin >> s1 >> s2 >> s3;
    cout << strlen(s1) << " " << strlen(s2) << " " << strlen(s3) << endl;
    if(strcmp(s1, s2) > 0)
    {
        if(strcmp(s1, s3) > 0)
            cout << "max s1:" << s1 << endl;
        else
            cout << "max s3:" << s3 << endl;
    }
    else
    {
        if(strcmp(s2, s3) > 0)
            cout << "max s2:" << s2 << endl;
        else
            cout << "max s3:" << s3 << endl;
    }
    strcat(s1,s2);
    strcat(s1,s3);
    cout << "s1+s2+s3:" << s1 << endl; 
    strcpy(s2, s3);
    cout << "copy s3 to s2:" << s2 << endl;
    return 0;
}

output

we  
are
student
2 3 7
max s1:we
s1+s2+s3:wearestudent
copy s3 to s2:student

6、string 类型

c++ 将字符数组和一些常用操作封装成一个字符串类——string

6.1、字符串变量的定义与初始化

#include<string>
string s1;
string s2="apple";

字符串变量空间是动态的,其根据存储内容自动调整空间大小,因此不用担心存放的内容超出变量的空间

6.2、字符串变量的使用

(1)赋值

(2)比较

(3)连接

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    string s1 = "hello!";
    string s2 = "world!";

    if (s1 >= s2)
        cout << "max is s1:" << s1 << endl;
    else
        cout << "max is s2:" << s2 << endl;

    cout << s1 + s2 << endl;
    s2 = s1; 
    cout << s2 << endl;
    return 0;
}

output

max is s2:world!
hello!world!
hello!

6.3、字符串数组

通过 string 类型也可以定义出字符串数组,用来存储多个字符串

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    string s[] = {"Apple", "Banana", "Color"};
    for(int i=0; i< sizeof(s)/sizeof(s[0]); i++)
        cout << s[i] << endl;
    return 0;
}

output

Apple
Banana
Color

eg 5-10 从键盘中获取三个字符串,存入字符串数组,找出最大字符串,将三个字符串连起来

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    string s[3];
    for(int i=0; i<3; i++)
        cin >> s[i];
    if(s[0] >= s[1])
    {
        if(s[0]>=s[2])
            cout << "max is s[0]:" << s[0] << endl;
        else
            cout << "max is s[2]:" << s[2] << endl;
    }
    else 
    {
        if(s[1]>=s[2])
            cout << "max is s[1]:" << s[1] << endl;
        else
            cout << "max is s[2]:" << s[2] << endl;
    }
    s[0] = s[0] + s[1] + s[2];
    cout << "s[0]+s[1]+s[2]:" << s[0] << endl;
    return 0;
}

output

a
water
melon
max is s[1]:water
s[0]+s[1]+s[2]:awatermelon

7、应用实例

eg 5-11,利用选择排序的算法,将包含10个元素的无序数列按升序排序

选择排序的思想,当进行第 i 次交换时,先从 n-i+1 个待排序数据中找出最小值(或最大值),然后和第 i 个元素交换;反复进行,直至完成 n-1 次交换。

#include <iostream>
#include <string.h>
using namespace std;

void sort(int a[])
{
    for(int i=0; i<10; i++)
    {
        int min_index = i;
        for(int j=i+1; j<10; j++)
        {
            if(a[j] < a[min_index])
            {
                min_index = j;
            }
        }
        int tmp;
        tmp = a[i];
        a[i] = a[min_index];
        a[min_index] = tmp;
    }
}

int main() 
{
    int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    sort(a);
    for(int i=0; i<10; i++)
        cout << a[i] << ' ';
    return 0;
}

output

9 5 12 3 7 1 34 21 56 2
1 2 3 5 7 9 12 21 34 56 

eg 5-12 利用折半查找的算法在有序的数列中进行查询,给出查找结果。

#include <iostream>
#include <string.h>
using namespace std;

int search(int a[], int x)
{
    int high=14, low=0, mid;
    mid = (high + low) / 2;
    while(x != a[mid])
    {
        if(x < a[mid])
        {
            low = mid+1;
            mid = (high + low) / 2;
        }
        else
        {
            high = mid-1;
            mid = (high + low) / 2;
        }
    }
    return mid;

}

int main() 
{
    int a[] = {95, 88, 73, 67, 56, 49, 37, 31, 29, 27, 18, 15, 13, 11, 9};
    int result = search(a, 56);
    cout << result << endl;
    return 0;
}

注意 mid 更新的时候,-1 和 +1,这个例子是降序的例子,升序的话改变下判定条件即可

output

4

eg 5-13 找出一个二维数组的鞍点,即该位置上的元素在该行最大,在该列上值最小(也可能没有鞍点)

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    int a[4][5] = {{1,2,3,4,5}, {2,4,6,8,10}, {3,6,9,12,16}, {4,8,12,16,20}};
    bool flag;
    for(int i=0; i<4; i++) // 遍历每一行
    {
        int max_raw = 0;
        for(int j=0; j<5-1; j++) // 找出该行最大值的索引
        {
            if(a[i][j]<=a[i][j+1])
                max_raw = j+1;
        }

        int max_col = 0;
        for(int k=0; k<4-1; k++) // 找出该列中最小值的索引
        {
            if(a[k][max_raw]>=a[k+1][max_raw])
                max_col = k+1;
        }
        if (max_col == i)
            cout << "raw:" << max_col << ", col:" << max_raw << " is " << a[max_col][max_raw] << endl;

    }
    return 0;
}

output

raw:0, col:4 is 5

eg 5-14 输入字符串 is,输出字符串 os,遍历字符串 is,数字替换成字母,字母保留,0-a,1-b,2-c,…,9-j

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char is[80];
    char os[80];
    cin >> is;
    int i;
    for(i=0; i<80; i++)
    {
        if(is[i] == '\0')
            break;
        if(is[i]>'9' || is[i]<'0')
            os[i] = is[i];
        else
        {
            os[i] = 'a' + is[i] - '0';
        }
    }
    os[i] = '\0'; // 加上变成字符串,方便 cout 输出
    cout << os << endl;
    return 0;
}

注意最后 os[i] = '\0'; 操作,是为了服务于 cout 的输出

output1

s1k02
sbkac

output2

abc5uf20t
abcfufcat

eg 5-15 存储 5 位学生的姓名,以及每个学生 4 门课的成绩,编写程序实现
(1)计算并输出每个同学的总成绩和平均成绩;
(2)根据学生的姓名进行查询,将姓名、各科成绩以及平均成绩输出,如果查不到,输出查无此人

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    string name[5]; // 存名字的字符串数组
    string find_name; // 待查找的名字
    int a[5][4]; // 存学生成绩的数组
    int sum[5]={0}; // 计算学科总分数组,记得初始化为 0
    float avg[5]; // 计算学科的平均分数组
    for(int i=0; i<5; i++)
    {
        cin >> name[i]; // 输入学生名字
        int total = 0;
        for(int j=0; j<4; j++)  // 输入学生各科成绩
        {
            cin >> a[i][j];
            sum[i] += a[i][j];  // 计算总分
        }
        avg[i] = sum[i]*1.0/4; // 计算平均分
    }
    for(int i=0; i<5; i++)
    {
        cout << name[i] << " " << sum[i] << " " << avg[i] << endl; // 输出
    }
    cout << endl << "请输入查找的名字:";
    cin >> find_name;  // 输入待查找的名字
    for(int i=0; i<5; i++)
    {
        if(name[i]==find_name)
            cout << name[i] << " " << sum[i] << " " << avg[i] << endl;  // 查到输出
    }
    if(i==5)
        cout<<"查无此人" << endl; // 查不到输出
    return 0;
}

output1

wangli
76 78 89 80
liya
87 86 90 70
zhangli
79 76 80 90
jikai
79 90 86 69
xialin
89 79 68 90
wangli 323 80.75
liya 333 83.25
zhangli 325 81.25
jikai 324 81
xialin 326 81.5

请输入查找的名字:zhangli
zhangli 325 81.25

output2

wangli
76 78 89 80
liya
87 86 90 70
zhangli
79 76 80 90
jikai
79 90 86 69
xialin
89 79 68 90
wangli 323 80.75
liya 333 83.25
zhangli 325 81.25
jikai 324 81
xialin 326 81.5

请输入查找的名字:bryant
查无此人!

http://www.kler.cn/a/562020.html

相关文章:

  • 从 Spring Boot 2 升级到 Spring Boot 3 的终极指南
  • STM32开发方式
  • 【Python爬虫(71)】用Python爬虫解锁教育数据的奥秘
  • 安装VM和Centos
  • 前端(layui表单对应行颜色、登陆页面、轮播)
  • Spring三级缓存解密:循环依赖破局之道
  • H13-821 V3.0 HCIP 华为云服务架构题库
  • 「软件设计模式」命令模式(Command)
  • Crack SmartGit
  • 使用虚拟IP会封号吗?静态IP上网速度会不会比动态IP更快?
  • 《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】
  • 6.将cr打包成网络服务|使用postman进行测试|编写oj_server的服务路由功能(C++)
  • 《白帽子讲Web安全》学习:深入解析Cookie与会话安全
  • 玩机日记 14 飞牛fnOS部署qBittorrent、AList、Jellyfin,实现下载、存取、刮削、观看一体的家庭影音中心
  • 【Python爬虫(55)】Scrapy进阶:深入剖析下载器与下载中间件
  • 物理服务器如何保障数据的安全性?
  • Qt常用控件之单行输入框QLineEdit
  • Vue进阶之AI智能助手项目(四)——ChatGPT的调用和开发
  • 在Linux、Windows和macOS上部署DeepSeek模型的最低配置要求
  • 2021Java面试-基础篇