数组

1.定义一维数组的格式如下:
类型标识符 数组名[常量表达式]:其中,类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以起定义。 数组名必须是合法的标识符。常量表达式的值即 为数组元素的个数yn例如,"int h[50];"就表示定义一一个维数组h,共有50个元素.它们的编号从0开始生49,每个元素都是int类型。
2.一维数组的元素引用数组定义好后,就可以“引用"数组中的任意个元素。引用格式为“数组名[下标]等。其中,下标只能为整型常量或整型表达式,值必须在数组定义的下标范,否则会出现“不标越界错误”。不能次引用整个数组,只能逐个引用数组的单个元素。例如,对于组a来说,语句“cout<< a;"是不合法的。
3. C++里还提供了两个函数给数组“整体”赋值。(1) memset函数 memset函数是给数组按字节”进行赋值,般用在char型数组中,如果是int类型的数组,般赋值为0和-1。使用前需要包含头文件:#include 。 例如,"memset(h,Q, sizeof(h));“就是将h数组所有元素均赋值为0。(2) fill函数 fill 函数是给数组“按元素“进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值。使用前需要包含头文件:#inelude <algrihm2。例如,“fIl(a,a+10.5);” 就是将a数组的前10个元素赋值为5。另外,C++还支持在定义数组的同时,给所有或者部分元素赋值。
4. 例如: nt a[10]=(0,1,2,3,4,5,6,7.8,9);
5. (1)键盘输入例如: int h11001; for(i=0; 1 < 100; 1++) cin >> ht1;
(2)直接赋值例如: int h[100],a[20]; for(i = 0; 1< 100; i++) hli] = 0;
forli = 0; 1< 20; i++) a[1]= 1*2+ 1; int a[101={0,1,2,3,4);//部分赋初值,后面的元素自动初始化为0 a[ ]={1,2,3,4,5};//不定义数组长度,直接根据赋值个数定
4.插入和 删除(1)在数组中插入一个元素,或者删除数组中的某一个元素,称为数组的“插入”操作或者“删除”操作。插人一个元素,需要先找到插人的位置(假设下标为),将这个元素及其之后的所有元素依次往后移位(注意 要从后往前进行操作),再将给定的元素插人(覆盖)到位置x.(2)删除某一个元素,也需要先找到删除的位置(假设下标为),将下标为x+1及其之后的所有元素依次向前移位,覆盖原来位置上的元素
5.一维数组的查找操作,就是在一维数组 中查找有没有某个元素,它的值等于指定的值x。查找操作的结果可能是一个没找到、 找到一个或者找到很多个。常见的查找算法有“顺序”查找和“二分”查找。顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。如果数组中的元素是有序的(递增或者递减),也可以采用二分查找。二分查找又称“折半”查找,其优点是比较次数少、查找速度快。
6.选择排序,冒泡排序,插入排序
(1)选择排序的基本思想是:每一趟从待排序的数据中, 通过“打擂台”比较选出最小元素,放在这些数据的最前面。这样,第一趟把n个数中(第1个到第n个)最小的放在第一个位置,第二趟把剩余的n-1个数中(第2个到第n个)最小的放在第二个位置,第三趟把剩余的n-2个数中(第3个到第n个)最小的放在第三个位置,…第n-1 趟把剩下的2个数中(第n-1个到第n个)最小的放在第n-1个位置,剩下的最后一个数(第n个)一定最大,自然落在了第n个位置。
(2)冒泡排序的基本思想是:从第一个数开始,依次不断比较相邻的两个元素.如果“速序a交换。这样,一趟排序结束后,最大的元素就放在了第n个位置了。
(3)插人排序的基本思想是:把所有待排序元素分成前后两段,前一段是已经排好序的,后 一段是待排序的。每一趟都是把后一 段的第一 个数 “插人”到前一段的某一 个位置 ,保证前一段仍然是有序的。
开始时,第1个数作为前一段肯定是有序的;第一趟,把第2个数插入进去.保证前2个数有序;第二趟,把第3个数插入进去,保证前3个数有.序…第n-1趟,把第n个数插人进去,保证n个数都有序。

7.定义二维数组的一般格式为:类型标识符数组名[常量表达式1][常量表达式2];常量表达式1的值表示第一维大小, 常量表达式2的值表示第二维大小,常量表达式1和常量表达式2的乘积就是二维数组的元素二维数组的存储及元素引用因为二维数组本质上是-维数组的每一个元素又是 个维数组,而计算 机内部存储一维数组采用的是连续存储单元。所以,二维数组的存储方式是“行优先”的连续存储,先逐个存储第0行上的所有元素,再逐个存储第1行上的所有元素.依此类推。

例题1:
描述设有一个n*m方格的棋盘(1≤m,n≤100)。

求出该棋盘中包含多少个正方形、多少个长方形(不包括正方形)。
例如:当n=2,m=3时

正方形的个数有8个;即边长为1的正方形有6个;
边长为2的正方形有2个。

长方形的个数有10个

即2*1的长方形有4个

1*2的长方形有3个

3*1的长方形有2个

3*2的长方形有1个
输入
n和m输出正方形的个数与长方形的个数,用逗号分隔
样例:输入2 3
样例:输出8,10

#include
using namespace std;
int main()
{
int n,m,i,j,s1=0,s2=0;
cin>>n>>m;
for(i=1;i<=min(n,m);i++)
s1+=(m-i+1)(n-i+1);
s2=(n+1)
(m+1)nm/4;
cout<<s1<<","<<s2-s1;
return 0;
}
例题2
描述有M个小孩子围成一圈做游戏,每个小孩子都有一个初始的号码。游戏有X步,每一步的操作方法都相同:每个小孩子把自己手上的号码改写成自己原来的号码加上右手边的小孩子的号码除以100的余数。请问你:经过X步之后,每个小孩子手上的号码是多少? 比如:有3个初始编号为{1,2,3}的小孩子,第一步操作完成之后,他们的编号变成了{1+2,2+3,3+1}即{3,5,4}。输入输入有N组测试数据。每组测试数据有2行: 第一行包含M和X。 第二行包含M个不超过100的整数。输出输出数据有N行,每行是一组测试数据的结果。注意:两个数字之间只有一个空格。样例输入23 11 2 33 21 2 3样例输出3 5 48 9 7

#include
#include
using namespace std;
int main()
{
int n,m,x,y;
int a[200000];
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> m >> x;
memset(a, 0, sizeof a);
for(int i = 1; i <= m; i++)
{
cin >> y;
a[i] = y;
}
for(int z = 1; z <= x; z++)
{
a[m + 1] = a[1];
for(int i = 1; i <= m; i++)
a[i] = a[i] + a[i + 1] % 100;
}
for(int i = 1; i <= m; i++)
cout << a[i] << " ";
cout << endl;
}
return 0;
}

感想:数组很难,很多思路很难找到,而且很容易弄乱思路,但是还是要坚持,好好学,多看看书,看透课本上的例子和习题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值