一.知识点的整理
通过前几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多的时候,仅仅靠之前所学的知识是不够的,即使是简单的问题也可能需要比较复杂的程序来处理。因此,我们引入了数组。
①一维数组的定义:
类型标识符 数组名[常量表达式]
常量表达式表示数组元素的个数,不能是变量。
数组元素从0开始。
e.g. a[3]中有3个元素,依次为a[0],a[1],a[2]。
②一维数组的引用:
数组名[下标]
注意:只能逐个引用数组元素,而不能一次引用整个数组;
引用时,下标值应在数组定义的的下标值范围内。
③一维数组的初始化:
类型标识符 数组名[常量表达式]={1,2,3……}
可以赋值部分,则剩余元素自动赋值为零,也可以全赋值。
如果没赋值,则随机赋值给元素随机大数。
④数组越界:
即要访问的元素不在数组的储存空间中。
数组越界是实际编程中常见错误,而且这类错误往往难以捕捉。因为越界语句本身并不一定导致程序立即出错,数组越界访问系统时不一定会给出任何提示,会造成内存的混乱。
⑤二维数组
定义:若一维数组的元素也是一维数组时,就构成了数组的数组,即二维数组
数据类型 数组名[常量表达式1][常量表达式2]
与一维数组类似,二维数组从a[0][0]开始,引用,赋值也与一维类似。
可以把元素想象成矩阵,解题时重点考虑元素变换的关系问题。
⑥字符类型为由一个字符组成的字符常量或字符变量。字符数组是指元素为字符的数组。字符数组是用来存放字符序列或字符串的。字符数组也有一二三维之分。
二.实际应用
①一维数组的应用
数组逆序重放
#include <iostream>
using namespace std;
int main(){
int n,a[1000],i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=n;i>=1;i--)
cout<<a[i]<<" ";
return 0;
}
②二维数组的应用:
矩阵变换行
#include<iostream>
using namespace std;
int main()
{
int a[6][6],i,j,m,n;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
cin>>a[i][j];
cin>>n>>m;
for(i=1;i<=5;i++)
swap(a[m][i],a[n][i]);
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
扫雷计算
#include<iostream>
using namespace std;
char a[110][110];
int main()
{
int m,n,i,j,x;
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
x=0;
if(a[i][j]=='*')
cout<<"*";
else
{
if(a[i+1][j]=='*')x=x+1;
if(a[i][j+1]=='*')x=x+1;
if(a[i+1][j+1]=='*')x=x+1;
if(a[i-1][j]=='*')x=x+1;
if(a[i][j-1]=='*')x=x+1;
if(a[i-1][j-1]=='*')x=x+1;
if(a[i-1][j+1]=='*')x=x+1;
if(a[i+1][j-1]=='*')x=x+1;
cout<<x;
}
}
cout<<endl;
}
return 0;
}
三.注意事项与感想
①字符常量只能是单个字符,字符串常量可以是多个字符。
②字符串用scanf输入时,不用加&。
③我的感想:
应用数组之后,很明显感觉到在解决一些实际问题的时候方便了许多,减少了一些步骤,使得在解决一些问题的时候不再像之前一样繁琐了。但是在最初使用数组时,还是有些不适应的,初期经常忘了加for(i.....)。在学习了数组以后,能解决的实际问题变多了不少,很多不熟悉的题型接法,感觉自己学起来也是很吃力的,在遇到一个新的题型时,总是毫无思路,而且不够熟悉掌握最基本的代码,还是容易犯很多小错误,导致做oj题总是各种各样的错误出现。
需要学习的地方还有很多很多,只希望自己能不放弃,多重复,多尝试,努力积攒经验,在熟练掌握最基础的题目后不断尝试新题目,尽自己所能多开拓思路,学习别人的做法,希望最终能真正地学会,能够切实地解决一些实际问题。