【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;elsereturn 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!"}; // errorreturn 0;
}
output
a
b
c
d
a
b
c5
注意,字符串总是用 \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
需要8张100
需要1张50
需要1张10
需要1张2
需要1张1
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;elseother += 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;elsecout << "max s3:" << s3 << endl;}else{if(strcmp(s2, s3) > 0)cout << "max s2:" << s2 << endl;elsecout << "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;elsecout << "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;elsecout << "max is s[2]:" << s[2] << endl;}else {if(s[1]>=s[2])cout << "max is s[1]:" << s[1] << endl;elsecout << "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}; // 计算学科总分数组,记得初始化为 0float 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
查无此人!
相关文章:
【C++】Arrays
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…...
EX_25/2/24
写一个三角形类,拥有私有成员 a,b,c 三条边 写好构造函数初始化 abc 以及 abc 的set get 接口 再写一个等腰三角形类,继承自三角形类 1:写好构造函数,初始化三条边 2:要求无论如何,等腰三角形类对象&#x…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
代码随想录D52-53 图论 Python
目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点: 整体来说是一个图着色的问题。 这道题目的思路符合直觉,但代码实现会和直觉有差别。如果仅使用visit记录不使用着色,会遇到非常多的…...
机器学习(部分算法、模型)
一、KNN 算法 原理 K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别; 如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别 比如: 有10000个样…...
axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密) 前言 在SpringBoot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职&…...
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
力扣 下一个排列
交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…...
Three.js 快速入门教程【八】常见材质类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
爬虫第九篇-结束爬虫循环
最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...
考研/保研复试英语问答题库(华工建院)
华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...
《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
前端如何解决跨域
解决前端跨域问题有多种方法 JSONP:利用 <script> 标签的跨域能力,通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求,安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...
【HDLbits--Comb组合逻辑】
HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是: 无时钟信号…...
如何在 Linux 上安装和配置 Zsh
文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...
Chromedriver与Chrome版本映射表
Chromedriver与Chrome版本映射表如下: Chrome 71-73版本对应Chromedriver 2.46Chrome 70-72版本对应Chromedriver 2.45Chrome 69-71版本对应Chromedriver 2.44Chrome 68-70版本对应Chromedriver 2.43Chrome 67-69版本对应Chromedriver 2.42…...
HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒
一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...
06C语言——指针
一、指针入门 (1)、准备知识 0、图解: 1、内存地址 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址:系统为了便于区分每一个字节而对…...
Ubuntu DeepSeek磁盘空间不够解决办法
标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…...
东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急
《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...
Qt layout
文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…...
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程…...
基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Android MMKV集成指南
首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...
React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能…...
5分钟使用Docker部署Paint Board快速打造专属在线画板应用
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...
【深度学习神经网络学习笔记(三)】向量化编程
向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术,尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...
PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
hbase集群部署
1.hbase集群的搭建(以及内部逻辑) 虽然Hmaster有多个,但是属于热备,起作用的就active上的这个。 部署流程: 因为我配置的hadoop是一个非HA的,所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...
塔能物联运维保障智慧地下停车场安全与高效
一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造,智慧地下停车场的重要性日益凸显。在现代城市中,土地资源愈发珍贵,地下停车场成为解决停车难题的关键设施。然而,停车场的安全问题是其正常运行和…...
面试八股文--数据库基础知识总结(2) MySQL
本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...
QT各种版本下载安装
参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…...
java进阶学习脑图
今天开始分享我的第一篇博客,先放上我自己花费一个月完成的java进阶学习脑图吧! 谁都想像R大一样对JVM可以知无不言,言无不尽; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发; 但是,不能只停留在想…...
Spring 原始注解详解与实战指南
📝 1. 前言 在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解,包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等,…...
uniapp封装请求
在uniapp中封装HTTP请求,通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API,可以用来发送各种类型的HTTP请求(GET、POST、PUT、DELETE等)。下面是如何在uniapp中封装一个通用的HTTP请求方法,…...
YOLOv10 解析与地平线 征程 6 模型量化
一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…...
基本网络安全的实现
基本网络安全的实现 一 :AAA AAA 是Authentication,Authorization and Accounting(认证、授权和计费)的简 称,它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架, 它是对网络安全…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
Java数据结构第十四期:走进二叉树的奇妙世界(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同,我们是否只能遍历一…...
GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...
《炎龙骑士团 1 邪神之封印》游戏信息
发行公司:1994 年由汉堂国际资讯公司发行。 游戏类型:回合制角色扮演游戏 故事背景 远古之战:在远古时代,圣族与魔族爆发大战,魔族领导者大邪神力量强大,圣族处于下风。圣族派出十二战士突袭,虽…...
本地大模型编程实战(23)用智能体(Agent)实现基于SQL数据构建问答系统(2)
本文将用 智能体(Agent) 实现对 SQLite 数据库的查询:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。 本次将分别在英文、中文环境下,使用 qwen2.5 、 MFDoom/deepseek-r1-tool-calling:7b 以及 llama3.1 做实验。…...
Flash-03
1-问题:Flash软件画两个图形,若有部分重合则变为一个整体 解决方法1:两个图形分属于不同的图层 解决方法2:将每个图形都转化为【元件】 问题2:元件是什么? 在 Adobe Flash(现在称为 Adobe Anim…...
防火墙双机热备---VRRP,VGMP,HRP(超详细)
双机热备技术-----VRRP,VGMP,HRP三个组成 注:与路由器VRRP有所不同,路由器是通过控制开销值控制数据包流通方向 防火墙双机热备: 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道(心…...