[c++]数组

2023-11-16

数组

在C++的程序设计中,为了处理方便,把具有相同类型的若干变量或对象按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组,组成数组的变量或对象称为数组的元素。数组元素由数组名和下标组成。

数组的声明与使用

1.数组的声明

数组属于构造类型,在使用前一定要先进行类型声明,然后才能被引用。这里的声明又称为定义性声明
数组声明的一般形式为:

类型标识符 数组名[常量表达式1][常量表达式2]...

其中类型标识符是用来说明数组元素的类型,可以是任一种基本数据类型,也可以是构造类型或类等用户自定义的类型。数组名的命名规则和变量名相同,遵循标识符规则,但不能与其他变量名重名。常量表达式需要用一对方括号括起来,可以是常量,符号常量或常量表达式,但是不允许为变量,即C++不允许对数组的大小做动态的定义。常量表达式1用来确定第1维下标的长度,常量表达式2用来确定第2维下标的长度…数组元素的个数等于各维长度的乘积。
例如:

#define M 50
int a[10];
char str[M];
float b[3][4];

Notice:
定义a是整形的一维数组,共有10个元素,每个元素可以存储一个整形数据;str是字符型的一维数组,共有50个元素,每个元素可以存储一个字符;b是实型的二维数组,第一维下标的长度为3,第二维下标的长度为4,共有12个元素,每个元素可以存储一个单精度类型的数据。在实际使用中,二维数组常和矩阵对应,故第一维下标又称为行下标,第二维下标又称为列下标。

一般情况下,三维和三维以上数组很少用,最常用的就是一维数组。

2.数组的使用

一个数组一旦经过定义即可以使用,但是数组不允许整体使用,只能逐个引用数组元素。
数组元素的表示形式:

数组名[下标表达式1][下标表达式2]...

其中,下标表达式的个数取决于数组的维度,该组下标指明拟访问的数组元素的在数组中的位置。下标表达式一般为整形常量或整形表达式,若为小数,系统自动取整。下标表达式的值从0开始,上界不要超过声明时所确定的该维的大小。在引用数组元素时若下标"越界",C++编译系统是不做检查报错的,这时需要编程者在编写程序的时候自己保证引用的正确性。数组元素的使用方法和同类型的变量使用方法一样,凡是允许使用该类型变量的地方,都可以使用数组元素。
例如,按照上面的定义:

a[3] = 2*a[0];  //合法
cout>>a[10];    //合法
cin<<b[i][j];   //合法

我们通过下面的例子来进行学习:

#include <iostream>
using namespace std;

int main(void)
{
	int i,a[10];
	for(i = 0;i<10;i++){
		a[i] = 2*i+1;
	}
	for(i = 9;i>=0;i--){
		cout<<a[i]<<' ';
	}
	cout<<endl;
	
	return 0;
}

程序运行结果:
20230114_3
程序中,声明了一个有10个元素的一维整型数组,用for循环分别给每个数组元素赋值1,3,5等奇数值,在倒叙输出各个元素的值。对于第一个for循环中的"a[i] = 2*i"语句,如果输入的数据无规律,则改用"cin>>a[i]";如果输出a[5.2]或a[5.8]元素的值,则只输出a[5]元素的值,结果为11.

数组的存储与初始化

1.数组的存储

数组在内存中占用一段连续的内存空间,数组元素的值依次存储在这段连续的存储空间内。对于一维数组,数组按下标由小到大存放;对于多维数组,元素"按行存储",即首先存储第一维下标为0的所有元素,再存储下标为1的所有元素等,依次类推。
例如:

int a[10];
float b[3][4];

说明a数组在内存中占用一段连续的空间,在这段空间内依次存储a[0],a[1],a[2]直到a[9]。b数组在内存中也占用一段连续的空间,在这段空间内首先存储行下标为0的所有元素,即b[0][0],b[0][1],b[0][2].b[0][3],然后再存储行下标为1的所有元素,即b[1][0],b[1][1],b[1][2],b[1][3],最后存储行下标为2的所有元素,即b[2][0],b[2][1],b[2][2],b[2][3].

2.数组的初始化

数组的初始化是指在声明数组的时候对数组中开始的若干元素乃至全部元素赋初值。

对于基本类型的数组初始化的过程就是给数组元素赋值;对于对象数组,每个元素都是某个类的一个对象,初始化就是调用该对象的构造函数。

(1)数组元素全部初始化

例如,一维数组元素全部初始化

int a[10] = {0,1,2,3,4,5,6,7,8,9};

Notice:
{}中的各数据元素值即为各元素的初始值,各值之间用逗号间隔。对于一维数组a初始化时,如果所有元素均有赋值,在定义的时候可以省略掉方括号中的常量,即可以写成:
int a[] = {0,1,2,3,4,5,6,7,8,9};

例如,二维数组全部初始化:

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

二维数组初始化时,可以按行连续赋初值,即把所有元素的值都写在{}内,数组元素的值按其在内存中的排列顺序赋值,若所有元素均有赋值,在定义的时候可以省掉第一维的大小,编译系统在编译程序时对初始值表中所包含的元素的个数进行检测,能够自动确定这个二维数组的第一维长度。也可以采用按行分段赋初值,即按第一维下标进行分组,使用{}将每一组数组括起来。若初始化时每一行均有赋值,在定义的时候可以省掉第一维的大小。
如下:

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

(2)数组元素部分初始化

数组在初始化的时候,初始值的数目小于数组的个数,即只给出部分数组元素的初始值,则数组剩余的元素自动被初始化为0.如果是一维数组部分初始化,则在定义时不能省掉方括号中的常量;若二维数组采用的是按行连续赋初值的方式,则在定义时不能省掉第一维的大小;若采用按行分段赋初值,行没有全给,定义时也不能省略第一维的大小。例如:

int a[10] = {0,1,2,3,4};//只给a[0]~a[4]5个元素赋0值,定义的时候[]中的10不能省略掉
int b1[3][4] = {{0,1},{0,0,2},{3}};//可以省略掉一维大小3
/*上面语句与下面语句等价*/
int b1[3][4] = {0,1,0,0,0,0,0,2,0,3};//第一维大小3不能省略
int b2[][4] = {{0,0,3},{0},{0,10}};//采用按行分段赋初值,每行都有给数据,省略第一维大小

这样的写法能够通知编译系统:数组共有3行。数组各元素为:
0 0 3 0
0 0 0 0
0 10 0 0
我们通过下面的例题,进一步加深对数组的理解!
题目:将一个二维数组中的行和列元素进行互换,存放到另一个二维数组中去。
如原数组为:
a =
[ 1 2 3 4 5 6 ] \left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{matrix} \right] [142536]
互换后为:
b =
[ 1 4 2 5 3 6 ] \left[ \begin{matrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{matrix} \right] 123456

解决代码如下:

#include <iostream>
using namespace std;

int main(void)
{
	int a[2][3] = {{1,2,3},{4,5,6}};
	int b[3][2];
	for(int i = 0;i < 2;i++){
		for(int j = 0;j<3;j++){
			b[j][i] = a[i][j];
		}
	}
	cout<<"Array a:"<<endl;
	for(int i=0;i<2;i++){
		for(int j=0;j<3;j++){
			cout<<a[i][j]<<' ';
		}
		cout<<endl;
	}
	cout<<"Array b:"<<endl;
	for(int i=0;i<3;i++){
		for(int j=0;j<2;j++){
			cout<<b[i][j]<<' ';
		}
		cout<<endl;
	}
	
	return 0;
}

运行结果如下:
20230115_1

数组作为函数的参数

数组元素和数组名都可以作为函数的实参,以实现函数间数据的传递和共享。数组元素作为函数实参时,其用法与同类型变量作为函数实参时用法相同;数组名作为函数实参时,传递的时数组的首地址。

**1.数组元素作为函数实参

前面已经介绍过,数组元素的使用等同于同类型的变量。因此数组元素作为函数实参同变量实参一样,和形参之间采取的是单向的"值传递".
案例如下:

/*用数组元素作为函数实参*/
#include <iostream>
using namespace std;
void swap1(int x,int y){
	int t;
	t = x;
	x = y;
	y = t;
}
int main()
{
	int a[2] = {2,4};
	cout<<"a[0] = "<<a[0]<<"a[1] = "<<a[1]<<endl;
	swap1(a[0],a[1]);
	cout<<"a[0] = "<<a[0]<<"a[1] = "<<a[1]<<endl;
	return 0;
}

运行结果如下:
20230115_2
从运算结果看出,在调用swap1()函数前后,a数组元素的值没有发生变化。这是因为数组元素做参数采用的是"值传递"的方式,形参的改变不会影响实参的值。

2.数组名作为函数实参

用数组名作为函数实参,此时,实参与形参都应是数组名,且类型要相同。

和数组元素作为实参不同,由于数组名代表的是数组所占用的内存段的起始地址,故使用数组名作为函数实参时,传递的是实参数组的首地址。
通过下面的案例来进行分析:
case 1: 编写一个函数可以求n个数的平均值,并在主函数中调用该函数

#include <iostream>
using namespace std;
float average(float array[],int n){
	float aver,sum = 0;
	for(int i = 0;i < n;i++){
		sum = sum + array[i];
	} 
	aver = sum/n;
	return aver;
} 
int main(void)
{
	float data[10] = {5.6,8.9,4,3.2,1,2.8,98,12,23.5,44.6};
	cout<<"the average of datal is "<<average(data,10)<<endl;
	return 0;
}

运行结果如下:
20230116_1

关于数组名作为实参的几点说明
(1) 用数组名作为函数实参时,应在主调函数和被调函数中分别定义数组,case 1 中array是形参数组名,data是实参数组名,分别在其所在函数中定义。
(2) 实参数组与形参数组类型应该一致(case 1中均为float型),系统可能进行自动转换,但是不一定能得到期望的结果。
(3) 由于C++编译系统对形参数组大小不做检查,只是将实参数组的首地址传给形参数组,因此在被调用函数中定义形参数组时可以不给一维数组的大小。为了在被调用函数中处理数组元素的个数需要,可以另设一个参数,传递数组元素的个数(如case 1中是n).
(4) 应当注意:用数组名作为函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址 传递给形参数组,这样两个数组就共占同一段内存单元。形参数组中各元素的值如果发生变化,会使实参数组元素的值同时发生变化。
case 2:用数组名作为函数实参实现数组元素的反序存储

#include <iostream>
using namespace std;

void inverse(int array[],int n){
	int i,j,t;
	for(i = 0,j = n-1;i<j;i++,j--){
		t = array[i];
		array[i] = array[j];
		array[j] = t;
	}
}
int main()
{
	int a[10],i,n;
	cout<<"input n:";
	cin>>n;
	cout<<" input "<<n<<" numbers:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	inverse(a,n);
	cout<<" the inverse of numbers:";
	for(int i=0;i<n;i++){
		cout<<" "<<a[i];
	}
	cout<<endl;
	return 0;
} 

运行结果如下:
20230116_2
二维数组元素作为函数实参与一维数组元素以及简单变量作为实参相同,采用"值传递"。二维数组名作为函数实参与一维数组名相同,传递的是数组的起始地址,在被调函数中对形参数组定义时可以指定每一维大小,也可以省略第一维大小说明。如

int a[3][10];
//或者
//int a[][10];

二者都合法并且等价。但是不能把第二维大小说明省略。
case 3:有一个2✖4的矩阵,求所有元素中的最小值。

#include <iostream>
using namespace std;
int min_value(int array[][4],int n){
	int min;
	min = array[0][0];
	for(int i = 0;i<n;i++){
		for(int j =0;j<4;j++){
			if(array[i][j]<min){
				min = array[i][j];
			}
		}
	}
	return min;
}

int main(void)
{
	int a[2][4] = {{101,34,63,28},{90,17,56,62}};
	cout<<min_value(a,2)<<endl;
	return 0;
}

运行结果如下:
20230116_3

对象数组

数组的元素可以是基本数据类型的数据,也可以是用户自定义数据类型的数据,对象数组就是指数组的元素是对象。

对象数组中的元素必须属于同一个类,每个元素不仅具有数据成员,而且还有成员函数。因此和基本数据类型相比,对象数组有一些特殊之处。
声明一个一维的对象数组的形式为:

类名 数组名[下标表达式]...

其中"类名"指出该对象数组的元素所在的类;"下标表达式"给出数组的维数和大小。例如:

myclass obs[5];//定义了一个对象数组obs,它含有5个属于exam类的对象

与基本类型数组一样,在使用对象数组时也只能使用单个数组元素。每个数组元素都是一个对象,通过这个对象,便可以访问到它的2公有成员。其引用形式为:

数组名[下标].成员名

例如:

cout<<obs[2].getx()<<endl;

其中,getx()是myclass中的公有成员函数
对象数组的赋值是通过对数组中的每一个元素的赋值来实现的,可以给它赋初值,也可以被重新赋值。对象数组的初始化过程就是调用构造函数对每一个元素对象进行初始化的过程。如果在声明数组时给每一个数组元素指定初始值,在数组初始化过程中就会调用与形参类似相匹配的构造函数。
case 4:给类中无自定义的构造函数的对象数组赋值

#include <iostream>
using namespace std;
class exam{
	private:
		int x;
	public:
		void setx(int n){
			x = n;
		}
		int getx(){
			return x;
		}
};
int main(void)
{
	exam ob[4];
	for(int i = 0;i < 4;i++){
		ob[i].setx(i);
	}
	for(int i=0;i<4;i++){
		cout<<ob[i].getx()<<' '<<endl;
	}
	return 0;
}

case 5: 给类中定义了不带参数的构造函数的对象数组赋值

#include <iostream>
using namespace std;
class exam{
	private:
		int x;
	public:
		exam(){
			x = 0;
		}
		exam(int n){
			x = n;
		}
		int getx(){
			return x;
		}
};
int main(void)
{
	exam ob1[4];	//调用不带参数的构造函数 
	exam ob2[4] = {1,2,3,4};	//调用初始值表给对象数组赋值 
	for(int i=0;i<4;i++){
		cout<<ob1[i].getx()<<" "<<endl; 
	}
	for(int i=0;i<4;i++){
		cout<<ob2[i].getx()<<" "<<endl; 
	}
	
	return 0;
}
程序实例

/冒泡排序/
这是数组中常用的一个算法————排序问题。排序是将一组随机排放的数按从小到大(升序)或从大到小(降序)重新排列。排序有冒泡法,选择法等等,该例中采用冒泡法实现升序排列。
冒泡排序的思路是:每一轮在待排序列中进行元素两两比较,若不满足排序要求,则交换。
假定有n个元素存放在a[0] ~ a[n-1]中,第一轮将a[0]与a[1]比较,a[1]与a[2]比较,依次到a[n-2]与a[n-1]比较,如果前者比后者大,就互换,则一轮下来,n个元素中最大的被换到a[n-1]中;第二轮从a[0] ~ a[n-2]进行元素的两两比较,使得n个元素中次大的元素被换到a[n-2]中去;依次下去,进行n-1轮比较,a[0]~a[n-1]就按由小到大顺序存放了。

#include <iostream>
using namespace std;

void sort(int array[],int n){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(array[j]>array[j+1]){
				int temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}
}
int main(void)
{
	int a[10];
	cout<<"input 10 numbers:"<<endl;
	for(int i=0;i<10;i++){
		cin>>a[i];
	}
	sort(a,10);
	cout<<"the sorted numbers:"<<endl;
	for(int i=0;i<10;i++){
		cout<<a[i]<<' ';
	}
	cout<<endl;
	
	return 0;
}

运行结果如下:
20230116_4
求二维数组中的鞍点

**所谓鞍点是指一个矩阵元素的值在其所在行最大,在其所在类最小。

#include <iostream>
using namespace std;

#define M 3
#define N 3

int AnDian_solve(int B[][N]){
	for(int i=0;i<M;i++){
		int max_temp = B[i][0];
		int col;//记录元素所在列 
		for(int j=0;j<N;j++){
			if(B[i][j]>max_temp){
				max_temp = B[i][j];
				col = j; 
			}
		}
		int flag = 1;
		for(int k=0;k<M&&flag;k++){
			if(B[k][col]<max_temp){
				flag = 0;
				break;
			}
		}
		if(flag){
			cout<<"数组A中的鞍点是:"<<max_temp<<endl;
			cout<<"位置是:"<<"第"<<i+1<<"行"<<"第"<<col+1<<"列"<<endl;
			return 0;
		}
	}
	return 1;
}

int main(void)
{
	int A[M][N];
	cout<<"请输入数组A[M][N]的元素:"<<endl;
	for(int i=0;i<M;i++){
		for(int j=0;j<N;j++){
			cin>>A[i][j];
		}
	}
	int returnN = AnDian_solve(A);
	if(returnN){
		cout<<"数组A无鞍点"<<endl;
	}
	return 0;
}

运行结果如下:
20230117_1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[c++]数组 的相关文章

  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 使用来自本地对象的消息的 std::Exception

    以下代码是否可以安全地抛出带有自定义消息的异常 include
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 无法在更新面板中找到上传的文件

    aspx
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • 在 DefaultHttpContext 上使用 FeatureCollection 时,响应对象为 null

    我正在测试一些 net Core 中间件 并希望使用整个 asp net Core http 管道来运行中间件 而不是模拟它 问题是 当我使用特征集合时 不知何故 响应对象没有在 httpRequest 中设置 并且它在请求本身上是只读的
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 没有运算符“<<”与这些操作数匹配[重复]

    这个问题在这里已经有答案了 不知道发生了什么事 我查看了与此问题类似的其他帖子 但到目前为止没有解决方案有帮助 这是带有错误部分注释的代码 在某一时刻 它说 不起作用 而在代码的其余部分中 它说 include
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数

随机推荐

  • 【C++】C/C++内存管理(new和delete详解)

    目录 1 C C 内存分布 2 C语言中动态内存管理方式 3 C 内存管理方式 3 1 new delete操作内置类型 3 2 new delete操作自定义类型 4 operator new与operator delete函数 4 1
  • 解决width: 100%;再设置margin问题

    最近在做前端 遇到了这么个小问题 就是当我们把一个 div 的 width 设置为 100 之后 再设置 margin 的时候 这个div 莫名其妙的超出了屏幕 情景如下图 这就很难受了啊 不过办法总比困难多 下面 我将讲两种解决方法 方法
  • Python调用文心一言的API

    最近申请了文心一言的key 然后尝试调用了一下文心一言 这里使用一个简单的方式来调用文心一言 pip install paddle pipelines from pipelines nodes import ErnieBot api key
  • 应聘时最漂亮的回答,看后不分享都难啊

    1 请你自我介绍一下自己好吗 回答提示 一般人回答这个问题过于平常 只说姓名 年龄 爱好 工作经验 这些在简历上都有 其实 企业最希望知道的是求职者能否胜任工作 包括 最强的技能 最深入研究的知识领域 个性中最积极的部分 做过的最成功的事
  • python基础总结:1.8、输入输出

    python基础总结 1 8 输入输出 文章目录 python基础总结 1 8 输入输出 1 更漂亮的输出格式 1 1 格式化字符串文字 1 2 字符串的format 方法 1 3 手动格式化字符串 1 4 旧的字符串格式化方法 2 读写文
  • Android下截屏 及 格式转换

    http wiseideal iteye com blog 1250175 Android下截屏 及 格式转换 2011 02 17 11 41 43 转载 标签 it 根据王研科先生的探索 Android G1手机的色深是16bit 即R
  • linux shell 实现 四则运算(整数及浮点) 简单方法

    在刚刚学习写shell 批处理时候 进行逻辑运算中 少不了需要进行基础的 四则运算 这里说说在linux shell 里面简单的实现方法 1 简单方法 chengmo centos5 b 5 5 5 3 2 chengmo centos5
  • gps纠偏及大陆地图偏移原因

    大陆地图偏移原因 国家安全与地图保密插件 国家保密插件 也叫做加密插件或者加偏或者SM模组 其实就是对真实坐标系统进行人为的加偏处理 按照几行代码的算法 将真实的坐标加密成虚假的坐标 而这个加偏并不是线性的加偏 所以各地的偏移情况都会有所不
  • mysql为空转换为0_MySQL数据库 null转为0,及一些case when用法

    1 如果为空返回0 select ifnull null 0 应用情景 如果在进行右连接或者左连接时 有一些为空的字段 可以进行这样的处理 select ifnull B submission time A submission time
  • arm的多级流水线技术和和存储管理单元mmu

    流水线概念 流水线的概念与原理 处理器按照一系列步骤来执行每一条指令 典型的步骤如下 1 从存储器读取指令 fetch 2 译码以鉴别它属于哪一条指令 decode 3 从指令中提取指令的操作数 这些操作数往往存在于寄存器reg中 4 将操
  • java for循环时间复杂度_关于for循环的时间复杂度

    今天在看算法时 遇见了一些问题 想了很久 现总结如下 关于for循环的时间复杂度 我们知道当一重for循环时 packageSuanfa public classFortest public static voidmain String a
  • 垂直同步到底要不要开?老司机教你G-Sync显示器的正确打开姿势

    一直以来我们都认为PC的画面效果取决于显卡 认为游戏的FPS值越高代表游戏越流畅 但实际上 显示器也是决定游戏帧数的重要一环 显卡将画面渲染并输出到显示器中 显示器接收GPU的信号并输出 然而 因为显卡性能和运行程序的差异 显卡一般无法以恒
  • Linux学习第17天:pinctrl和gpio子系统开发:由0到1

    Linux版本号4 1 15 芯片I MX6ULL 大叔学Linux 品人间百味 思文短情长 本篇笔记的题目为 pinctrl和gpio子系统开发 由0到1 做嵌入式系统开发 肯定经历过单片机 ARM Linux这么一个过程 这是一个8位单
  • CTF-Xortool,windows上的安装与使用

    https github com raddyfiy xortool for Windows 下载好脚本文件 转移到 python的这个位置 使用 加密 python xortool xor py f text cmd exe s secre
  • linux运维工程师岗位职责

    1 运维工程师简历怎么写较好 2 网络工程师个人简历模板 3 软件工程师个人简历模板精选 4 it运维服务的管理流程 5 it运维工程师简历模板 运维工程师简历怎么写较好 1 培训客户使用 测试软件linux运维工程师简历模板的可用性 解决
  • android中实现RecyleView 加载刷新

    为了实现RecyclerView的下拉刷新和上拉加载更多功能 可以使用第三方库或者自己实现 在这里 我们介绍两种实现方式 使用第三方库 使用第三方库可以快速实现RecyclerView的下拉刷新和上拉加载更多功能 常用的库有SwipeRef
  • 《程序员修炼之道》读后感(一)

    书刚拿到手 只读了第一章 略有所悟 本书的第一章并没有直接讲程序代码上的硬核干货 而是先探讨编程思想上的哲学 在代码练习中 错误是不可避免的 在错误发生后理应承认错误 寻找补救方案 但还是人会找借口 这一点我自问无法否认 因为我也下意识地想
  • 人工智能数学基础1:通过使用python编程语言实现高等数学的求极限

    求极限 并用Python 编程求极限 from sympy import x Symbol x a Symbol a expr x 1 3 2 x 8 limit expr limit expr x a print limit expr 可
  • 联盟链FISCO BCOS可并行合约开发框架(附实操教程)

    FISCO BCOS是完全开源的联盟区块链底层技术平台 由金融区块链合作联盟 深圳 简称金链盟 成立开源工作组通力打造 开源工作组成员包括博彦科技 华为 深证通 神州数码 四方精创 腾讯 微众银行 亦笔科技和越秀金科等金链盟成员机构 代码仓
  • [c++]数组

    文章目录 数组 数组的声明与使用 数组的存储与初始化 数组作为函数的参数 对象数组 程序实例 数组 在C 的程序设计中 为了处理方便 把具有相同类型的若干变量或对象按有序的形式组织起来 这些按序排列的同类数据元素的集合称为数组 组成数组的变