C++入门基础第四篇:数组

第四章 数组

一维数组

数组的定义

  1. 数组的定义方式和变量类似。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int a[10], b[20]; //a数组相当于是由20个在地址上连续的int型变量组成的整体
	float f[33];  //f数组和c数组是一样的逻辑
	char c[21];
	return 0;
}
  1. 数组的初始化
    在main函数内部,未初始化的数组中的元素是随机的。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{ 
	int a[3] = { 0,1,2 };   //含有三个数组元素分别是0,1,2
	int b[] = { 0,1,1};   //等价于上面的初始化方式,维度是三
	int c[5] = { 0,1,2 }; //等价于初始化c[]={0,1,2,0,0}
	char d[3] = { 'a' ,'b','v' };  //字符数组的初始化
	return 0;
}
  1. 访问数组元素
    通过下标访问数组。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{ 
	int a[3] = { 0,1,2 };  //数组的下标是从0开始,a[0] a[1] a[2]
	cout << a[0] << " " << a[1] << ' ' << a[2] << endl;
	a[0] = 5;
	cout << a[10] << endl;  //越界了?数组没有第十一个元素啊,是的,没有第十一个元素
	//但是数组是一个连续地址存放的一连串的相应类型的变量,
	// a:数组名就是一个代表这个数组起始位置的指针,找数组元素会按照数组名所在的地址往后加n个单位变量的地址,比如a[10],a+10*sizeof(int),这个地址存在,有元素
	//但是不能确定存的是什么,而且,如果数据元素被越界更改,可能会出现问题,要注意数组的边界
	int f[100] = {0}; //对f的所有元素初始化为0
	return 0;
}
  1. 练习题1: 使用数组实现求斐波那契数列的第N项。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{ 
	int n;
	int f[100] = {0};
	cout << "请输入你要求斐波那契数列哪一项:" ;
	cin >> n;
	f[0] = 1; f[1] = 1;
	for(int i = 2; i < n; i++)
	{
		f[i] = f[i - 1] + f[i - 2];
	}
	cout << "你要求斐波那契数列是:" <<f[n-1]<< endl;
	return 0;
}
  1. 练习题2:输入一个n,再输入n个整数。将这n个整数逆序输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	cout << "输入要存储的整数数目:";
	cin >> n;
	int a[100];
	for (int i = 0; i < n; i++)
		cin >> a[i];
	cout << "逆序输出:\n";
	for (int i = 0; i < n; i++)
		cout << a[n-1-i] << " ";
	return 0;
}
  1. 练习题3:输入一个n,再输入n个整数。将这个数组顺时针旋转k(k <= n)次,最后将结果输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,k;
	int a[100];
	cout << "输入要存储的整数数目和顺时针旋转的次数:";
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	
	reverse(a, a + k);
	reverse(a + k, a + n);
	reverse(a, a + n);
	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
	return 0;
}
  • reverse:reverse(a+m, a + k):将a[m]到a[n-1]的元素反转。结合这个思考是怎么做到顺时针旋转的,思考如何做逆时针旋转:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,k;
	int a[100];
	cout << "输入要存储的整数数目和顺时针旋转的次数:";
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	reverse(a +(n-k), a + n);
	reverse(a, a + (n-k));
	reverse(a, a + n);
	
	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
	return 0;
}
  • reserve:
    reserve 函数用于预留容器中的元素数量,但并不改变容器中的元素数量。也就是说,调用 reserve 后,容器的大小(size())不会改变,但容量(capacity())会增加到或超过指定的值。
    使用 reserve 可以减少因插入新元素而导致的内存重新分配和元素复制的开销,从而提高性能。
    reserve 通常用于已知将要向容器中插入大量元素的情况。
  • resize:
    resize 函数用于改变容器的大小。如果新的大小大于当前大小,那么容器会添加默认值(对于基本类型如 int 是0,对于 std::string 是空字符串)的元素,直到达到指定的大小。如果新的大小小于当前大小,那么容器会删除多余的元素。
    resize 会改变容器的大小和可能的容量(如果新的大小大于当前容量,则可能会增加容量)。
    使用 resize 可以直接设置容器的大小,并可能同时改变其容量。
  1. 练习题4:输入n个数,将这n个数按从小到大的顺序输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	int a[100];
	cin >> n ;
	for (int i = 0; i < n; i++) //读入数据
		cin >> a[i];
	for (int i = 0; i < n; i++)  //采用的是简单选择排序,每次最外层的for循环都会选择一个最小的元素放在位置a[i]
		for (int j = i + 1; j < n; j++)
			if(a[i]>a[j])
				swap(a[i], a[j]);
	for (int i = 0; i < n; i++) cout << a[i] << ' ';
	cout << endl;
	return 0;
}
  1. 练习题5:计算2的N次方。N <= 10000
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int a[100], size = 1, n;
	a[0] = 1;
	cin >> n;
	for (int i = 1; i <=n; i++)
	{
		a[i] = a[i - 1] * 2;
	}
    cout << a[n];
	cout << endl;
	return 0;
}

多维数组

多维数组就是数组的数组。
Int a[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组。
Int arr[10][20][30] = {0}; // 将所有元素初始化为0
链接:多维数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLWkt5IE-1722038796964)(https://i-blog.csdnimg.cn/direct/a9930b00ceef467b96e07257b2750187.png)]

  1. 练习题:输入一个n行m列的矩阵,从左上角开始将其按回字形的顺序顺时针打印出来。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n, m;
	int arr[50][50];
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> arr[i][j];

	bool st[50][50] = { false };
	int dx[4] = { -1,0,1,0 };
	int dy[4] = { 0,1,0,-1 };
	int d = 1, x = 0, y = 0;
	for (int i = 0; i < n * m; i++)
	{
		int a = x + dx[d], b = y + dy[d];
		if (a < 0 || a >= n || b < 0 || b >= m || st[a][b])
		{
			d = (d + 1) % 4;
			a = x + dx[d], b = y + dy[d];
		}
		cout << arr[x][y] << " ";
		st[x][y] = true;
		x = a, y = b;
	}
	cout << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值