数组

数组是啥?
数组是干嘛的?
数组怎么用?

不管咋样,先看百科了解亿下:

C++ 数组 —— 菜鸟教程
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

这都是啥跟啥啊?!
数组 array是C++等编程语言里重要的数据结构,后期我们将学 栈stack、队列queue等。
同时,C++里面的vectorPython里面的list差不多,arraylist的下标都是从0开始的。为了方便我们后期可能会使用 \(STL\) 大法!

别的先别说了,开搞吧!

数组也有数据类型,比如有整数型的、长整数型的、浮点型的等等,其中的字符数组就是字符串的一种。
定义方法:

数据类型 数组名[数组长度]={数组内容};

我建议大家在定义数组时定义在main函数外面,这样一是方便其他函数使用,二是这样写可以给数组的每个元素赋值为0(变量的值也是0)。
在主函数内定义,这种数组就成为了局部变量,而且用不到的元素C++默认为随机数,有可能你找半天bug也找不到……
要是给一个数组的每一个元素快速赋值,可以使用memset函数,就像这样:

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
	int a[101];
	// 初始化
	memset(a,-1,sizeof(a));
	// 等同于 int a[101]={};
	// 输出
	for(int i=0;i<101;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

那么,给你出一道题:

请你输出正整数 \(n\) 各个数位上的数。
输入:1234
输出:1 2 3 4

哈哈,可惜你没学过字符串,不然轻轻松松就给秒了。
我们可以使用数组储存每一位的数字,然后再输出。

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
	cin>>n;
	while(n) a[k++]=n%10,n/=10;
	// 倒着输出
	for(int i=k-1;i>=0;i--){
		cout<<a[i]<<" ";
	}
	return 0;
}

你要是再厉害一点儿呢,可以这么写:

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
	cin>>n;
	while(n) a[k++]=n%10,n/=10; // 获取每一位上的数字
	// 先把每一位的数字变成正确的顺序
	for(int i=0;i<k/2;i++){
		// 交换两个变量的值
		// swap(a[i],a[k-i-1]);
		// swap可以交换两个变量的值
		
		// 临时变量法
		m=a[i],a[i]=a[k-i-1],a[k-i-1]=m;
	}
	for(int i=0;i<k;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

这是个数学原理。要获取 \(a\) 每一位上的数字,可以这么干:

\[a\ mod\ 10( 获取最后一位的数字)\Longrightarrow \left \lfloor a{\div} 10 \right \rfloor (a缩小到原来的\frac{1}{10}) \]

总之,任何强大的成绩,都建立在海量的刷题之上。
来做个俩题儿吧:


第一题不难,你应该已经有思路了吧?!
很简单,用上刚刚的数组知识,解个这种题嘎嘎简单!

//Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,a[101],k=0;
	while(cin>>n){
		a[k++]=n;
	}
	for(int i=k-1;i>=0;i--){
		if(a[i]==0) continue;
		cout<<a[i]<<" ";
	}
	return 0;
}

后面这个也不难,掌握方法就行。

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,a[101],b[101],k=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=n-1;i>=0;i--){
		int x=0;
		for(int j=i;j>=0;j--){
			if(a[j]<a[i]) x++;
		}
		b[k++]=x;
	}
	for(int i=k-1;i>=0;i--){
		cout<<b[i]<<" ";
	}
	return 0;
}

以下内容为作死,慎重使用

P1427 这个题官方给出的算法标签是递归和栈?,倒也不是不行,不过很有趣。

拓展:考试的时候,测题机会在末尾加上 ctrl+z 退出,所以我们可以利用这一特性来做题。因为这个键(^Z=ctrl+z)能终止死循环,所以我们只需要在输入时判断是否为这个键就行了;而这个键的bool值为假,所以输入时就会自动判断了。
模拟法:

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
	int a[101]={},k=0;
	while(cin>>a[k++]); // 输入数据
	// 如果不是0就输出
	for(int i=k-2;i>=0;i--) if(a[i]!=0) cout<<a[i]<<" ";
	return 0;
}

递归法:

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int x;
void f(int k){
	if(k==0) return;
	cin>>x;
	f(x);
	cout<<k<<" ";
}
int main(){
	cin>>x;
	f(x);
	return 0;
}

栈法:

// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
	stack<int> st;
	int n,m;
	while(cin>>n){
		st.push(n);
	}
	while(!st.empty()){
		m=st.top();
		if(m!=0) cout<<m<<" ";
		st.pop();
	}
	return 0;
}