数组(Array)定义是一组具有相同类型的变量的集合。例如,应用数组可以将10个成绩值存储在内存的一个连续的区域中,使用一个统一的名字来标识这组相同类型的数据,这个名字称为数组名。构成数组的每个数据项称为数组元素。C程序通过数组的下标实现对数组元素的访问。
注意
1. C语言中数组的下标都是从0开始的。
如a[5]数组的下标值为0到4,而不是1到5,其中第一个元素的下标值为0,最后一个元素的下标值为4。
2. 在定义数组时必须使用常量定义数组的大小。如 int a[i];这种定义方式就是非法的。
3. 在解决实际问题的过程中,定义数组元素个数时,最好定义元素个数稍微多余题目中给定元素个数,避免在写程序的过程中发生越界这种情况。
数组分为一维数组,二维数组还有多维数组。
1.一维数组 是用一个下标确各元素在数组的顺序,可用排成一行的元素来表示。
定义格式 :
类型 数组名[元素个数];
2. 二维数组用两个下标确定各元素在数组中的顺序,可用排列成i行j列的元素表示。第一维的长度代表数组每一列的元素的个数,第二维的长度代表数组每一行的元素个数。
定义格式:
类型 数组名[第一维长度][第二维长度]
注意,数组第二维的长度声明永远都不能省略。
这周做过的一些题
1.校门外的树
总时间限制: 1000ms 内存限制: 65536kB
描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
样例输出
298
ac代码
#include <iostream>
using namespace std;
int a[10001];
int main()
{
int n, m, q, j;
cin >> n >> m;
for (int i=0; i<m; i++)
{
cin >> q >> j;
while (q <= j)
a[q++] = 1;
}
int s = 0;
for (int i=0; i<=n; i++)
{
s += (a[i] == 0);
}
cout << s << endl;
return 0;
}
2.石头剪刀布
总时间限制: 1000ms 内存限制: 65536kB
描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?
输入
输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。
输出
输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。
样例输入
10 3 4
0 2 5
0 5 0 2
样例输出
A
AC代码
#include<iostream>
using namespace std;
int main()
{
int n,a,b,l[101],o[101],p=0,q=0,m=0,y=0;
cin>>n>>a>>b;
for(int i=1;i<=a;i++)
cin>>l[i];
for(int i=1;i<=b;i++)
cin>>o[i];
for(int i=1;i<=n;i++)
{
p++,q++;
if(p>a) p=1;
if(q>b) q=1;
if(l[p]==0&&o[q]==2) m++;
if(l[p]==0&&o[q]==5) y++;
if(l[p]==2&&o[q]==5) m++;
if(l[p]==2&&o[q]==0) y++;
if(l[p]==5&&o[q]==0) m++;
if(l[p]==5&&o[q]==2) y++;
}
if(m>y) cout<<"A"<<endl;
if(m<y) cout<<"B"<<endl;
if(m==y) cout<<"draw"<<endl;
return 0;
}
二维数组也有一些应用,主要和矩阵有关。
3.矩阵交换行
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个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
AC代码
#include<iostream>
using namespace std;
int main()
{
int i,j,m,n,a[6][6],b[6][6];
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
cin>>a[i][j];
}
cin>>m>>n;
for(j=1;j<=5;j++)
{
b[m][j]=a[m][j];
a[m][j]=a[n][j];
a[n][j]=b[m][j];
}
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}