第6讲:数组
- 格式:docx
- 大小:37.72 KB
- 文档页数:4
第一讲数组江苏省黄埭中学王荣生小明的爸爸有三个儿子,老大叫大毛,老二叫二毛,老三叫什么?程序中经常需要存储、处理大量的具有相同类型的数据(成百上千,甚至几十万),如果用简单变量来存储这些数据,为这些变量取不同名字将是非常艰巨无法想象的事!为了解决大量相同类型数据的存储、命名问题,C++为我们提供了数组这一复合数据类型(多个简单变量类型组合而成的)。
它在一块连续的存储空间中存储这些数据,利用数组名+下标(序号)来确定每个数据。
这样就非常方便的解决了大量的、具有相同类型的数据的存储、命名、操作等问题。
数组就是在一段连续的存储空间中分配多个存储单元,每个数据存储在一个独立的存储单元中,这些存储单元又称为数组元素。
用数组名+下标来表示。
例如:int a[10];//定义一个整数类型数组,它有10个int类型的元素;char b[26];//定义一个字符类型数组,它有26个char类型的元素它们的数组元素分别是:a[0],a[1],a[2],......,a[9],其类型都是intb[0],b[1],b[2],......b[25],其类型都是char注意:数组元素的下标从0开始,不是1。
其在内存中分配情况如下图所示9876.........3210a[9]a[8]a[7]a[6]a[3]a[2]a[1]a[0]a (相当于10个整型变量)说明:1)a是数组名称,它代表整个储存空间的首地址。
“[]”是下标运算符,“[]”内的数字称为下标,表示是数组的第几个元素。
2)a[0]是数组的第0个元素,a[1]是数组的第1个元素,......3)下标可以是常数,如a[2],也可以是变量,如:a[i]4)一个数组元素可以当作是简单变量,与简单变量用法一样。
5)下标必须是非负整数,不能是负数、小数,且不能超出数组定义的范围,超出定义的范围称为“越界”。
例如:int a[10];a[-3]=5; a[10]=15; int k=a[20];C++不对下标是否越界进行检查,因此,虽然数组下标越界了,编译却能通过,但程序运行时可能会出现意想不到的结果,甚至崩溃,这是编程中常见的错误!所以编写程序时要时刻注意控制。
2009-2017全国高中数学联赛分类汇编第06讲:计数原理1、(2010一试8)方程2010=++z y x 满足z y x ≤≤的正整数解(,,)x y z 的个数是. 【答案】336675易知 100420096100331⨯=+⨯+k ,所以110033*********-⨯-⨯=k200410052006123200910052006-⨯=-⨯+-⨯=,即3356713343351003=-⨯=k .从而满足z y x ≤≤的正整数解的个数为33667533567110031=++.2、(2011一试5)现安排7名同学去参加5个运动项目,要求甲、乙两同学不能参加同一个项目,每个项目都有人参加,每人只参加一个项目,则满足上述要求的不同安排方案数为.(用数字作答) 【答案】15000【解析】由题设条件可知,满足条件的方案有两种情形:(1)有一个项目有3人参加,共有3600!5!51537=⋅-⋅C C 种方案;(2)有两个项目各有2人参加,共有11400!5!5)(21252527=⋅-⋅⋅C C C 种方案;所以满足题设要求的方案数为15000114003600=+.3、(2011一试8)已知=n a C ())95,,2,1(2162003200=⎪⎪⎭⎫⎝⎛⋅⋅-n nnn ,则数列}{n a 中整数项的个数为. 【答案】15 【解析】=n a C65400320020023n n n--⋅⋅.要使)951(≤≤n a n 为整数,必有65400,3200nn --均为整数,从而4|6+n .当=n 2,8,14,20,26,32,38,44,50,56,62,68,74,80时,3200n -和65400n-均为非负整数,所以n a 为整数,共有14个.当86=n 时,=86a C 5388620023-⋅⋅,在C !114!86!20086200⋅=中,!200中因数2的个数为1972200220022002200220022002200765432=⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡, 同理可计算得!86中因数2的个数为82,!114中因数2的个数为110,所以C 86200中因数2的个数为511082197=--,故86a 是整数.当92=n 时,=92a C 10369220023-⋅⋅,在C !108!92!20092200⋅=中,同样可求得!92中因数2的个数为88,!108中因数2的个数为105,故C 86200中因数2的个数为410588197=--,故92a 不是整数. 因此,整数项的个数为15114=+.4、(2013一试6)从1,2,…,20中任取5个不同的数,其中至少有两个是相邻数的概率为. 【答案】2323235、(2015一试8)对四位数(19,0,,9)abcd a b c d ≤≤≤≤,若,,a b b c c d ><>,则称abcd 为P 类数,若,,a b b c c d <><,则称a b c d 为Q 类数,用()N P 与()N Q 分别表示P 类数与Q 类数的个数,则()()N P N Q -的值为【答案】285【解析】分别记P 类数、Q 类数的全体为A,B ,再将个位数为零的P 类数全体记为0A ,个位数不等于零的P 类数全体记为1A .1,,,,1,abcd A dcba a b b c c d ∈><>≥对任一四位数将其对应到四位数注意到11..dcba B dcba B A abcd A B ∈∈故反之,每个唯一对应于中的元素这建立了与之间的一一 对应,因此有010()()||||||||||||.N P N Q A B A A B A -=-=+-=00||:0,0,19b,A abc A b ∈⋅⋅⋅下面计算对任一四位数可取,,,对其中每个99b a b c <≤<≤由及知,a 和c 分别有9-b 种取法,从而992200191019|=(9)26|85.b k b k ==⨯⨯-===∑∑A ()()285.N P N Q -=因此,6、(2016一试8)设4321,,,a a a a 是1,2,…,100中的4个互不相同的数,满足2433221242322232211)())((a a a a a a a a a a a a ++=++++则这样的有序数组),,,(4321a a a a 的个数为 . 【答案】40先考虑m n >的情况.此时331314)(mn a m n a a ==,注意到33,n m 互素,故31m a l =为正整数. 相应地,4321,,,a a a a 分别等于l n l mn nl m l m 3223,,,,它们均为正整数.这表明,对任意给定的1>=mnq ,满足条件并以q 为公比的等比数列4321,,,a a a a 的个数,即为满足不等式1003≤l n 的正整数l 的个数,即]100[3n.由于10053>,故仅需考虑34,4,23,3,2=q 这些情况,相应的等比数列的个数为20113312]64100[]64100[]27100[]27100[]8100[=++++=++++. 当m n <时,由对称性可知,亦有20个满足条件的等比数列4321,,,a a a a . 综上可知,共有40个满足条件的有序数组),,,(4321a a a a .7、(2017一试4)若一个三位数中任意两个相邻数码的差均不超过1,则称其为“平稳数”.平稳数的个数是. 【答案】75【解析】考虑平稳数abc .若b=0,则a=1,{0,1},.c ∈有两个平稳数1,a {1,2},c {0,1,2},23=6.2b 8,a,c {b 1,b,b 1},733=63.9,a,c {8,9}22=4.2+6+63+4=75.b b =∈∈⨯≤≤∈-+⨯⨯=∈⨯若则有个平稳数若则有个平稳数若则,有个平稳数综上可知,平稳数的个数是个平稳数8、(2010二试4)一种密码锁的密码设置是在正n 边形12n A A A 的每个顶点处赋值0和1两个数中的一个,同时在每个顶点处涂染红、蓝两种颜色之一,使得任意相邻的两个顶点的数字或颜色中至少有一个相同.问:该种密码锁共有多少种不同的密码设置?同,标有a 和b 的边都是偶数条.所以这种密码锁的所有不同的密码设置方法数等于在边上标记a ,b ,c ,使得标有a 和b 的边都是偶数条的方法数的4倍.设标有a 的边有2i 条,02n i ⎡⎤≤≤⎢⎥⎣⎦,标有b 的边有2j 条,202n i j -⎡⎤≤≤⎢⎥⎣⎦.选取2i 条边标记a 的有2in C 种方法,在余下的边中取出2j 条边标记b 的有22jn i C -种方法,其余的边标记c .由乘法原理,此时共有2in C 22j n i C -种标记方法.对i ,j 求和,密码锁的所有不同的密码设置方法数为 222222004n n i i j nn i i j C C -⎡⎤⎡⎤⎢⎥⎢⎥⎣⎦⎣⎦-==⎛⎫ ⎪ ⎪ ⎪⎝⎭∑∑. ① 这里我们约定001C =.当n 为奇数时,20n i ->,此时22221202n i jn i n ij C-⎡⎤⎢⎥⎣⎦---==∑. ②代入①式中,得()()2222222221222000044222n n i n n i j i n i i n i nn i n n i j i i C C C C -⎡⎤⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦⎣⎦----====⎛⎫ ⎪== ⎪ ⎪⎝⎭∑∑∑∑ 022(1)(21)(21)nnkn kk n kk n n nn k k C C --===+-=++-∑∑31n =+. 当n 为偶数时,若2n i <,则②式仍然成立;若2ni =,则正n 边形的所有边都标记a ,此时只有一种标记方法.于是,当n 为偶数时,所有不同的密码设置的方法数为222222004n n i i j n n i i j C C -⎡⎤⎡⎤⎢⎥⎢⎥⎣⎦⎣⎦-==⎛⎫ ⎪= ⎪⎪⎝⎭∑∑()122210412n i n i n i C ⎡⎤-⎢⎥⎣⎦--=⎛⎫ ⎪⨯+ ⎪ ⎪⎝⎭∑()2221024233n i n i nn i C ⎡⎤⎢⎥⎣⎦--==+=+∑. 综上所述,这种密码锁的所有不同的密码设置方法数是:当n 为奇数时有31n +种;当n 为偶数时有33n+种.。
小学四年级奥数举一反三第1讲至第40讲全目录第1讲找规律(一)第2讲找规律(二)第3讲简单推理第4讲应用题(一)第5讲算式谜(一)第6讲算式谜(二)第7讲最优化问题第8讲巧妙求和(一)第9讲变化规律(一)第10讲变化规律第11讲错中求解第12讲简单列举第13讲和倍问题第14讲植树问题第15讲图形问题第16讲巧妙求和第17讲数数图形第18讲数数图形第19讲应用题第20讲速算与巧算第21讲速算与巧算(二)第22讲平均数问题第23讲定义新运算第24讲差倍问题第25讲和差问题第26周巧算年龄第二十七周较复杂的和差倍问题第二十八周周期问题第二十九周行程问题(一)第三十周用假设法解题第三十一周还原问题第三十二周逻辑推理第三十三周速算与巧算(三)第三十四周行程问题(二)第三十五周容斥原理第三十六周二进制第三十七周应用题(三)第三十八周应用题(四)第三十九周盈亏问题第四十周数学开放题第1讲找规律(一)一、知识要点观察是解决问题的根据。
通过观察,得以揭示出事物的发展和变化规律,在一般情况下,我们可以从以下几个方面来找规律:1.根据每组相邻两个数之间的关系,找出规律,推断出所要填的数;2.根据相隔的每两个数的关系,找出规律,推断出所要填的数;3.要善于从整体上把握数据之间的联系,从而很快找出规律;4.数之间的联系往往可以从不同的角度来理解,只要言之有理,所得出的规律都可以认为是正确的。
二、精讲精练【例题1】先找出下列数排列的规律,并根据规律在括号里填上适当的数。
1,4,7,10,(),16,19【思路导航】在这列数中,相邻的两个数的差都是3,即每一个数加上3都等于后面的数。
根据这一规律,括号里应填的数为:10+3=13或16-3=13。
像上面按照一定的顺序排列的一串数叫做数列。
练习1:先找出下列各列数的排列规律,然后在括号里填上适当的数。
(1)2,6,10,14,(),22,26(2)3,6,9,12,(),18,21(3)33,28,23,(),13,(),3(4)55,49,43,(),31,(),19(5)3,6,12,(),48,(),192(6)2,6,18,(),162,()(7)128,64,32,(),8,(),2(8)19,3,17,3,15,3,(),(),11,3..【例题2】先找出下列数排列的规律,然后在括号里填上适当的数。
数组越界及其避免⽅法CC++所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的⼤⼩,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语⾔程序中最常见的错误之⼀。
在 C 语⾔中,数组必须是静态的。
换⽽⾔之,数组的⼤⼩必须在程序运⾏前就确定下来。
由于 C 语⾔并不具有类似等语⾔中现有的静态分析⼯具的功能,可以对程序中数组下标取值范围进⾏严格检查,⼀旦发现数组上溢或下溢,都会因抛出异常⽽终⽌程序。
也就是说,C 语⾔并不检验数组边界,数组的两端都有可能越界,从⽽使其他变量的数据甚⾄程序代码被破坏。
因此,数组下标的取值范围只能预先推断⼀个值来确定数组的维数,⽽检验数组的边界是程序员的职责。
⼀般情况下,数组的越界错误主要包括两种:数组下标取值越界与指向数组的指针的指向范围越界。
数组下标取值越界数组下标取值越界主要是指访问数组的时候,下标的取值不在已定义好的数组的取值范围内,⽽访问的是⽆法获取的内存地址。
例如,对于数组 int a[3],它的下标取值范围是 [0,2](即 a[0]、a[1] 与 a[2])。
如果我们的取值不在这个范围内(如 a[3]),就会发⽣越界错误。
⽰例代码如下所⽰:1int a[3];2int i=0;3for(i=0;i<4;i++)4 {5 a[i] = i;6 }7for(i=0;i<4;i++)8 {9 printf("a[%d]=%d\n",i,a[i]);10 }很显然,在上⾯的⽰例程序中,访问 a[3] 是⾮法的,将会发⽣越界错误。
因此,我们应该将上⾯的代码修改成如下形式:1int a[3];2int i=0;3for(i=0;i<3;i++)4 {5 a[i] = i;6 }7for(i=0;i<3;i++)8 {9 printf("a[%d]=%d\n",i,a[i]);10 }指向数组的指针的指向范围越界指向数组的指针的指向范围越界是指定义数组时会返回⼀个指向第⼀个变量的头指针,对这个指针进⾏加减运算可以向前或向后移动这个指针,进⽽访问数组中所有的变量。
第六讲找简单数列的规律日常生活中,我们经常接触到许多按一定顺序排列的数,如:自然数:1,2,3,4,5,6,7, (1)年份:1990,1991,1992,1993,1994,1995,1996 (2)某年级各班的学生人数(按班级顺序一、二、三、四、五班排列)45,45,44,46,45 (3)像上面的这些例子,按一定次序排列的一列数就叫做数列.数列中的每一个数都叫做这个数列的项,其中第1个数称为这个数列的第1项,第2个数称为第2项,…,第n个数就称为第n项。
如数列(3)中,第1项是45,第2项也是45,第3项是44,第4项是46,第5项45.根据数列中项的个数分类,我们把项数有限的数列(即有有穷多个项的数列)称为有穷数列,把项数无限的数列(即有无穷多个项的数列)称为无穷数列,上面的几个例子中,(2)(3)是有穷数列,(1)是无穷数列。
研究数列的目的是为了发现其中的内在规律性,以作为解决问题的依据,本讲将从简单数列出发,来找出数列的规律.例1观察下面的数列,找出其中的规律,并根据规律,在括号中填上合适的数.①2,5,8,11,(),17,20。
②19,17,15,13,(),9,7。
③1,3,9,27,(),243。
④64,32,16,8,(),2。
⑤1,1,2,3,5,8,(),21,34…⑥1,3,4,7,11,18,(),47…⑦1,3,6,10,(),21,28,36,()。
⑧1,2,6,24,120,(),5040。
⑨1,1,3,7,13,(),31。
⑩1,3,7,15,31,(),127,255。
(11)1,4,9,16,25,(),49,64。
(12)0,3,8,15,24,(),48,63。
(13)1,2,2,4,3,8,4,16,5,().(14)2,1,4,3,6,9,8,27,10,()。
分析与解答①不难发现,从第2项开始,每一项减去它前面一项所得的差都等于3.因此,括号中应填的数是14,即:11+3=14.②同①考虑,可以看出,每相邻两项的差是一定值2。
课题六:整数的分拆班级姓名【例1】甲和乙用玩具枪玩打靶游戏,见下图所示。
他们每人打两发子弹,甲共打中6环,乙共打中5环。
又知没有两发子弹环数相同,并且弹无虚发。
甲打中的是环和环,乙打中的是环和环。
【例2】有些人认为8是个吉利的数字,于是他们得到的东西都希望用数字“8”表示。
现有200块糖要分发给一些人,请制定一个吉利的分糖方案。
【例3】把100个馒头分装在七个盒里,要求每个盒里装的馒头数目都带有数字6,应怎样分?【例4】试将100以内的完全平方数分拆成从1开始的一串奇数之和。
你能发现有什么规律吗?【例5】将12分拆成三个不同的自然数相加之和,共有种不同的分拆方式,请把它们一一列出。
【例6】将21分拆成不大于9的四个不同的自然数相加之和,共有种不同的分拆方式,请把它们一一列出。
【例7】将15分拆成三个不同的自然数相加之和,共有种不同的分拆方式,请把它们一一列出。
【例8】(1,1,8)是一个和为10的三元自然数组,如果不考虑数字排列的顺序,和为10的三元自然数组共有个。
1. 把100个苹果分成6堆,要求每堆中苹果的数目中都必须含有6这个数字,你怎样分?请列出等式。
2. 把1000个鸡蛋放到五只篮子里,每只篮子里的鸡蛋数都由数字8组成,你怎样分?请列出等式。
3. 七只箱子分别放有1个、2个、4个、8个、16个、32个、64个苹果,现在要从这七只箱子里取出87个苹果,要求每只箱子里的苹果要么全部取走,要么不取。
你怎样取?请列出等式。
109个呢?4. 将15分拆成不大于9的三个不同的自然数相加之和,共有种不同的分拆方式,请把它们一一列出。
5. 把15个玻璃球分成数量不同的4堆,共有种不同的分法。
6. 美国硬币有1分、5分、10分和25分四种。
现有10枚硬币,价值是1元,其中有3枚25分的硬币。
余下的硬币有种,每种各有多少枚?用等式表示。
1. 把100个苹果分成6堆,要求每堆中苹果的数目中都必须含有6这个数字,你怎样分?请列出等式。
数组
1.可以存放多个数据的数据类型,我们称为数组。
2.案例
<?php
$hens[0]=3; //数组的下标是从0开始的。
$hens[1]=5;
$hens[2]=6;
$hens[3]=4;
$hens[4]=8;
$hens[5]=5;
$allweight=0;
//遍历整个数组
//为了知道某个数组共有多少个元素,可以使用系统函数count
for($i=o;$i<count($hens);$i++){
echo ‘第’($i+1)’只鸡的体重’=$hens[$i];
$allweight+=$hens[$i];
}
echo’<br/>总体重=’.$allweight.’平均体重=’.$allweight/count($hens)
?>
3.数组创建
在php中,数组就是关键字和值的集合。
①创建数组
$arr[0]=23;
$arr[1]=34;
$arr[2]=26;
[0] →下标又叫关键字(从0开始计数)
$arr →该数组的名称
$arr[0] →数组的一个元素
23 →赋给元素的值。
当值为null(空值)时,它也要占用一个空间
②直接赋值创建数组
$arr=array(值…)
③第3种方式创建数组(在默认情况下,我们的元素的下标,是从0开始编号的,但是实际上,也是可以自己指定的)
基本语法:
$arr[‘logo’]=”北京”;
$arr[‘hsp’]=123;
或者
$arr=arry(“logo”=>”北京”,”hsp”=123,…)
其对应的遍历方法为
foreach ($arr as $key=>$val){ //key、val 可以是任意取名字echo $key.”=”.$val.”<br/>”
}
foreach 遍历方法运用更加广泛。
4.数组问题
4.1在我们创建一个数组时,如果没有给某个元素指定下标,php就会自动的用目前最大的那个下标(索引:整数),加上1 作为该元素的下标(关键字)
案例
<%php
$arr=array(5=>”logo”,345,53);
echo $arr[5];
echo “<br/>”.$arr[6]; //输出345 这个值
%>
案例2
<%php
$arr=array(5=>”logo”,345,53);
$arr[5]=”yes”//体现了元素的替换规则
echo $arr[5]; //此时输出yes 这个值
echo “<br/>”.$arr[6]; //输出345 这个值
%>
4.2特殊键名
①我们用true作为键名,等同于用integer 1 作为键名;用flase作为键名,等同于
用integer0 作为键名。
②用null 做键名时等同于””
③使用小数key(关键字:键名);自动截断小数部分,使用整数部分。
4.3输出显示数组
①print_r($arr);
②var_dump($arr); 这个输出更详细
4.4数组越界
<?php
$arr=array(56,34,453);
echo $arr[3]; //数组越界
?>
4.5
<?php
$a=array(2,23)
$a[3]=56;
echo $a[3]; //当然此处你不能去访问一个不存在的键值,如$a[2].以免越界。
?>
结果可以输出56
说明php的数组是可以动态增长的。
5.一维数组的引用
基本语法
$数组名[键值]
如果你引用的键值不存在,则会报错。
6.一维数组中,使用自定义的键值(此处当然非正数了)时,注意使用单引号。
7.php数组中的重要函数
⑴使用count 函数统计数组条数,count($arr);
⑵使用is_array函数判断数组是否存在is_array($arr);
⑶print_r()和var_dump() 可以显示数组信息
⑷explode(“拆分方式”,拆分变量)
<?php
$str=”北京天津上海深圳”
$arr=explode(“”,$str); //实际开发中,涉及到的数组拆分,很重要
print_r($arr); 输出显示数组
?>
⑸使用unset 删除数组中数值(变量)
<?php
$arr[0]=34;
$arr[1]=56;
$arr[2]=98;
unset($arr[1]); //数组某个元素删除后,数组不会被重新编写
echo print_r($arr)
?>
8.我们定义了一个数组,但是没有给数组赋值,那么这个数组值的个数为0.
9.数组遍历的4个方法:for、while、do…while、foreach
前3个方法是有要求的:该数组的下标是从0开始顺序排放。
第四种语法:
foreach($arr as $k=>$v ){
echo “<br/> as $k=>$v”
}
10.数组运算符
数组加法(把右边的数组元素【除去相同键值以及与左边数组元素相同的那些元素】附加到左边数组后边):
<?php
$a=array(“a”=>”appale”,”b”=>”banana”);
$b=array(“a”=>”pear”,”b”=>”starwberry”,”c”=>”cherry”);
$c=$a+$b;
echo”\$a+\$b result<br/>”
var_dump($c); //“a”=>”appale”,”b”=>”banana” ,”c”=>”cherry”
echo”<br/>”;
$c=$b+Sa;
echo”\$b+\$a result<br/>”
var_dump($c); //“a”=>”pear”,”b”=>”starwberry”,”c”=>”cherry”
?>
11.数组小结
⑴数组可以存放任意类型的数据
⑵数组大小不必事先指定,可以动态增长。
⑶数组名可以理解为指向数组首地址的引用
⑷数组中的元素以$key=>$value 的形式存在
⑸如果没有给数组指定key ,则取当前最大的整数索引值,而新的键名将是该值加1.。