一.知识梳理
1.数组的定义:使用一个数组首先要对其进行定义,在定义语句中要声明数组元素的类型和下标的个数,下标的个数代表数组的维数。(注意:C语言中数组下标是从0开始;数组的大小不能用变量定义,必须用常量。)
2.一维数组和二维数组:
一维数组初始化:
1.int a[5]={0,1,2,3,4} 即a[0]=0 a[1]=1…;
2.int a[5]={0,1} 只给数组前两个元素赋初值,后面的3个元素默认为0;
3.对数组每个元素赋初值时可以不指定数组的长度 ,即 int a[5]={0,1,2,3,4} 可以改写成 int a[]={0,1,2,3,4}。
二维数组初始化:
1.按行分段赋值 int a[2][3]={{1,2,3},{4,5,6}};
2.按行连续赋值 int a[2][3]={1,2,3,4,5,6}。
sizeof(数组名)可以计算数组长度
3.字符型数组:
字符数组的初始化同一维数组的初始化相似,
char b[10]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’};即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组
长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即
‘\0’ )。
strlen(数组名)可以用来计算字符串的长度。
二.典型例题
1.矩阵的交换行(二维数组):
描述
给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。
输入
输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第6行包含两个整数m、n,以一个空格分开。(1 <= m,n <= 5)
输出
输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。
样例输入
1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
1 5
样例输出
3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2
解:
#include<iostream>
using namespace std;
int a[5][5];
int b[5];
int main()
{
int m,n;
int i,j;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>a[i][j];
}
}
cin>>m>>n;
for(int j=0;j<5;j++)
{
b[j]=a[m-1][j];
a[m-1][j]=a[n-1][j];
a[n-1][j]=b[j];
}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
对于矩阵类的问题,使用二维数组十分便捷,不管是矩阵的输入或是输出矩阵,都可以使用二维数组去解决。
2.反反复复(字符串数组):
描述
Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There’s no place like home on a snowy night”并且有5列,Mo会写成:t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵,当然他使用任何字母都是可以的。Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
输入
第一行包含一个整数(范围2到20),表示使用的列数。
第二行是一个长度不超过200的字符串。
输出
一行,即原始信息。
样例输入
5
toioynnkpheleaigshareconhtomesnlewx
样例输出
theresnoplacelikehomeonasnowynightx
解:
#include<iostream>
using namespace std;
int n,m;
char mp[222][222];
string s;
int main()
{
cin>>m>>s;
n=s.size()/m;
for(int i=0;i<s.size();i++)
{
int j=i+1;
int x=(j-1)/m+1;
if(x&1){
mp[x][(j-1)%m+1]=s[i];
}
else{
mp[x][m+1-((j-1)%m+1)]=s[i];
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cout<<mp[j][i];
}
}
return 0;
}
三.感悟
数组可以帮助我们方便解决需要大量输入数据的题目,比如输入大量数字或是字符串等,对于解决矩阵问题可以使用二维数组解决。在做数组这一部分的题目时,可以明显感觉到难度的提升,与之前的题目相比完全不是一个级别,在数组的题目中往往伴随着大量的输入和输出,这对我们程序的精细程度提出了巨大考验,稍有差错便导致无法输出想要的结果;时程序的长度也变长了许多,不在像之前一样短短几行便可以解决,数十行是常有的事,所以我们一定要耐得住性子。