第四章 数组.docx
- 文档编号:8259625
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:72.43KB
第四章 数组.docx
《第四章 数组.docx》由会员分享,可在线阅读,更多相关《第四章 数组.docx(22页珍藏版)》请在冰豆网上搜索。
第四章数组
第四章数组
4.1一维数组
『实例4.1』:
输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩。
分析:
在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求学生的总分,进而求出平均分。
但因为只有读入最后一个学生的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把50个学生的成绩都保留下来,然后逐个和平均分比较,把高于平均分的成绩打印出来。
如果,用简单变量a1,a2,…,a50存放这些数据,可想而知程序要很长且繁。
那么有快捷的方法解决这些数据的存储问题呢?
一、一维数组的定义
类型说明符数组名[常量表达式];
如:
inta[4];//表明a数组由4个int型元素组成,分别是a[0]、a[1]、a[2]、a[3];
『注释』:
数组的下标序号从0开始。
类型说明符是指数组元素的类型,如:
int、bool、char。
例如:
50位学生某门课程的成绩可以定义为:
intstudent[50];
『注释』数组student有50个元素,a[0]、a[1]、a[2]、a[3]、……a[49]分别存放第1位到第50位学生的成绩。
『关于下标』:
必须是从0开始。
『实例4.2』:
定义如下数组:
(1)表示20种商品的价格;
(2)表示30件邮件的安全邮递情况;
定义如下:
floatprice[20];
boolmail[30];
如下数组的定义是错误的:
intn;
intc[n];
『注释』:
C++不允许对数组的大小作动态的定义,即数组的大小不能是变量,必须是常量。
#defineSIZE50
voidmain(void)
{intart[SIZE];
......
}
如果要根据不同的数值改变数组的大小,可用常量表达式。
如:
二、一维数组的引用
一般情况下,我们都用下标来访问数组格式为:
数组名[下标]
『说明』:
1、数组下标不允许超越所定义的下标下界和上界。
2、数组是一个整体,数组名是一个整体的标识,要对数组进行操作,必须对其元素操作。
数组元素可以象同类型的普通变量那样作用。
如:
a[2]=34;是对数组a中第三个下标变量赋以34的值,cin>>a[4];是从键盘读入一个数到数组a第5个元素中去。
我们现在来完成实例4.1。
程序如下:
#include
usingnamespacestd;
intmain()
{
inttot=0,a[100];
for(inti=1;i<=50;i++)
{
cin>>a[i];
tot+=a[i];
}
intave=tot/50;
for(inti=1;i<=50;i++)
if(a[i] cout<<"No."< return0; } 三、数组的基本操作 数组的的基本操作包括 四、一维数组应用示例 三、数组的基本操作 1、数组的读入 数组的读入分为两种。 第一种对数组中的一部分元素列举初值,未赋值的部分是0. inta[10]={0,1,2,3,4,5}; inta[10]={0,1,2,3,4,5,0,0,0,0}; 第二种是程序执行的时候读入。 #include usingnamespacestd; intmain() { inta[6]; for(inti=0;i<=5;i++) cin>>a[i]; return0; } 2、数组的输出 #include usingnamespacestd; intmain() { inta[6]={1,2,3,4,5,6}; for(inti=0;i<=5;i++) cout< return0; } 3、数组的插入 例如: 数组a中保存了1、2、4、5、7五个元素,现在要在a数组里面第三个位置插入数字8,怎么做呢? a数组初始状态如下: 1 2 4 5 7 7 5 4 1 2 4 5 7 要想在第三个位置插入数字8,只能从最后面开始,每一位向后移动一位,腾出一个空间放入数字8. 『核心程序如下』: for(inti=4;i>=2;i--) a[i+1]=a[i]; a[2]=8; 4、数组的删除 5 7 例如: 数组a中保存了1、2、4、5、7五个元素,现在要在a数组里面删除第三个元素4,怎么做呢? 1 2 4 5 7 1 2 5 7 如上演示,要删除一个数,只要从这个数开始后面每一位向前移一位覆盖前面的数就可以了。 『代码如下』 #include usingnamespacestd; intmain() { inta[6]={1,2,4,5,7},j; for(inti=2;i<=3;i++) a[i]=a[i+1]; for(inti=0;i<=3;i++) cout< return0; } 5、数组的查找 因为数组是顺序存储,要在数组中查找一个数,只要把数组从头到尾扫描一遍就可以了。 #include usingnamespacestd; intmain() { inta[11],b,c=-1; for(inti=0;i<10;i++) cin>>a[i]; cin>>b; for(inti=0;i<10;i++) if(a[i]==b) { c=i; break; } if(c==-1) cout<<"nothisdigit"; else cout< return0; } 四、数组的应用实例 『实例4.3』输入10个数,要求程序按输入时的逆序把这10个数打印出来。 也就是说,请你按输入相反顺序打印这10个数。 分析: 我们可定义一个数组a用以存放输入的50个数,然后将数组a内容逆序输出。 源程序如下: #include usingnamespacestd; intmain() { inta[10]; for(inti=0;i<=9;i++) cin>>a[i]; for(inti=9;i>=0;i--) cout< return0; } 『实例4.4』求S=x1*y1+x2*y2+x3*y3……x10*y10。 其中x1到x10分别为1,3,5,7……17,19 y1到y10的值为21,22,23,……29,30. 分析: 此题需要两个数组分别存储xi和yi的值。 源程序如下: #include usingnamespacestd; intmain() { intx[11],y[11],s=0; for(inti=1;i<=10;i++) { x[i]=2*i-1; y[i]=20+i; s+=x[i]*y[i]; } cout< return0; } 『实例4.5』将数组a[1..10]中第一个元素移到数组的末尾,其余数据依次往前平移一个位置。 分析: 先将a[1]保存起来,然后从a[2]开始数组的其他元素前移,最后把a[1]送入a[n]中。 源程序如下: #include usingnamespacestd; intmain() { inta[10]; for(inti=0;i<10;i++) cin>>a[i]; inttemp=a[0]; for(inti=0;i<9;i++) a[i]=a[i+1]; a[9]=temp; for(inti=0;i<10;i++) cout< return0; } 『实例4.6』从键盘中输入一段字符,以星号“*”为结束标志,存储到数组中(不包括星号),然后将字符串显示出来。 假设字符串的长度不超过100个字符。 『分析』: 因为输入的是字符而且长度不确定,所以我们必须定义一个长度为100的字符数组来保存字符串。 #include usingnamespacestd; intmain() { chara[101],ch; intlen=0;//len用于指示字符串的当前长度 cin>>ch; while(ch! ='*') { a[len]=ch;//将新录入的字符添加到字符数组的末尾 cin>>ch; len++; } for(inti=0;i cout< return0; } 『实例4.7』对于数组a[1..10](元素递增排列),输入一个测试数据x,如果x存在于数组a,则把x元素删除;否则将x插在相应的位置,要求数组仍然有序。 分析: ①查找是否存在x需要进行搜索,可以顺序查找或二分查找。 ②如果从数组中删除x,相当于将x后的元素向前平移,插入x则相当于将x插入点的元素依次向后平移。 源程序如下: #include usingnamespacestd; intmain() { inta[100],x; for(inti=0;i<10;i++) cin>>a[i]; cin>>x; 顺序查找 while(a[i] i++; if(a[i]==x)//找到x,删除 { for(intj=i;j<9;j++)//数据前移 a[j]=a[j+1]; for(intj=0;j<9;j++) cout< } Else//没找到x,插入 { for(intj=10;j>i;j--)//数据后移 a[j]=a[j-1]; a[i]=x; for(intj=0;j<11;j++) cout< } return0; } 『实例4.8』输入十个正整数,把这十个数按由小到大的顺序排列。 将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。 分析: 要把十个数按从小到大顺序排列,则排完后,第一个数最小,第二个数次小,……。 因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它小的,则与之交换,比较结束后,则第一个数已是最小的数。 同理,第二步,将第二个数与其后各个数再依次比较,又可得出次小的数。 如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。 于是十个数的顺序排列结束。 例如下面对5个进行排序,这个五个数分别为8 2 9 10 5。 按选择排序方法,过程如下: 初始数据 : 8 2 9 10 5 2 8 9 10 5 2 5 9 10 8 2 5 8 10 9 2 5 8 9 10 对于十个数,则排序要进行9次。 源程序如下: #include usingnamespacestd; intmain() { inta[100],x; for(inti=1;i<=10;i++)//读入10个初始数据 cin>>a[i]; for(inti=1;i<10;i++)//进行9次排序 for(intj=i+1;j<=10;j++)//将第i个数与其后所有数比较 if(a[j] { inttemp=a[i]; a[i]=a[j]; a[j]=temp; } for(inti=1;i<=10;i++)//输出排序后数据 cout< return0; } 『实例4.9』将一个十进制整数转化为二进制数。 分析: 十进制与二进制互化的方法如下: (1)二进制转十进制 方法: “按权展开求和” 例: (1011.01)2=(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10 =(8+0+2+1+0+0.25)10 =(11.25)10 (2)十进制转二进制 ·十进制整数转二进制数: “除以2取余,逆序输出” 例: (89)10=(1011001)2 289 244……1 222……0 211……0 25……1 22……1 21……0 0……1 标准类型中,长整型的范围是-2147483647~2147483647,而二进制数10000000000的十进制值仅为1024,因此这里要使用数组存储二进制数的各位。 源程序如下: #include usingnamespacestd; intmain() { intbin[100],x,k=0; for(inti=1;i<100;i++) bin[i]=0; cin>>x; while(x>0) { bin[k]=x%2; x=x/2; k++; } for(inti=k-1;i>=0;i--) cout< return0; } 『巩固练习』 1.输入10个数,要求程序按输入时的逆序把这10个数打印出来。 也就是说,请你按输入相反顺序打印这10个数。 (y1.cpp) 2.借助一维数组,生成菲波那契数列的前20项(从第3项开始每项是前两项之和): (y2.cpp) 1123581321345589144233377… 3.从键盘读入10个正整数,输出其中的奇数项及它们的和,输出偶数项及它们的平均数。 例如,(y3.cpp) 输入: 1281954672113 输出: 195711345 12846232 4.求S= 。 (y4.cpp) 5.读入n个数,打印其中的最大数、最小数及其位置号。 (y5.cpp) 6.将数组a[1..10]中第一个元素移到数组的末尾,其余数据依次往前平移一个位置。 7.将数组a[1..10]中最后一个元素移到数组的头部,其余数据依次往后平移一个位置。 8.对于数组a[1..10](元素递增排列),输入一个测试数据x,如果x存在于数组a,则把x元素删除;否则将x插在相应的位置,要求数组仍然有序。 (y8.cpp) 9.输入十个正整数,把这十个数按由小到大的顺序排列。 (选择排序)(y9.cpp) 10.输入一个十进制整数(最大不超过长整型),将其转化为二进制数。 (y10.cpp) 11.输入一个二进制整数(最大不超过10位),将其转化为十进制数。 (y11.cpp) 12.用筛法求100以内的素数(质数)。 每行输出10个数。 (y13.cpp) 13.将1~9这9个数字分成三组(每个数字只能使用一次),分别组成三个三位数,且这三个三位数的值构成1: 2: 3的比例,试求出所有满足条件的三个三位数。 (y14.cpp) 14.输入一串小写字母(以"."为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出)。 (y14.cpp) 例: 输入: aabaabbbccca. 输出: a: 5 b: 4 c: 3 15.有一个数组(设有n个),例如数组元素为: (y15.cpp) 3,6,11,45,23,70,67,34,26,89,90,15,56,50,20,10 编一程序交换这组数中任意指定的两段不重合数据。 输入: 第一行: 一个数n,表示这个数组的大小; 第二行: n个整数。 第一行: 两个数,标识第一段数据的开始和结束位置; 第二行: 两个数,标识第二段数据的开始和结束位置。 输出: 交换后的数组元素 输出: 370672361145342689901556502010 输入: 16 37…2010 24 67 16.输入一个由10个整数组成的序列,其中序列中任意连续三个整数都互不相同,求该序列中所有递增或递减子序列的个数。 (y16.cpp) 例如: 输入: 1 10 8 5 9 3 2 6 7 4 输出: 1 10 {对应的递增或递减子序列为} 10 8 5 5 9 9 3 2 2 6 7 7 4 6{共有多少个递增或递减序列} 17.设数组a是一个有n个元素的整数数组,从中找出最大和的连续子序列。 (y17.cpp) 输出: 8012020 输入: 10 10-29302440-1008012020-50 输出: 9: 1 8: 1 … 7 18.已知数组a中含n个整型元素,求a中有多少个最大数? 多少个次大数? …,多少个互不相同的数? 编程实现之。 (y18.cpp) 输入: 10 3148004293 4.2二维数组 j i 一维数组在编程中多用于描述线性的关系: 如一组数;一组成绩;一组解答等。 数组元素只有一个下标,表明该元素在数组中的位置。 二维数组在编程中多数用于描述二维的关系: 如地图、棋盘、城市街道、迷宫等等。 而二维数组元素有两个下标: 第一个下标表示该元素在第几行,第二个下标表示在第几列。 二维数组的定义格式如下: inta[5][8]; 其中: a是数组名,由程序员自定,中括号中的两个范围表示二维数组共有多少行、多少列(第一个表示行数,第二个表示列数);定义了一个二维数组a,共有5行8列。 0 1 2 3 4 5 6 7 0 a[0,0] a[0,1] a[0,2] a[0,3] a[0,4] a[0,5] a[0,6] a[0,7] 1 a[1,0] a[1,1] a[1,2] a[1,3] a[1,4] a[1,5] a[1,6] a[1,7] 2 a[2,0] a[2,1] a[2,2] a[2,3] a[2,4] a[2,5] a[2,6] a[2,7] 3 a[3,0] a[3,1] a[3,2] a[3,3] a[3,4] a[3,5] a[3,6] a[3,7] 4 a[4,0] a[4,1] a[4,2] a[4,3] a[4,4] a[4,5] a[4,6] a[4,7] 二维数组的格式为: 类型说明符数组名[常量表达式][常量表达式]; 使用二维数组要注意: 一、数组元素的引用: 数组名[行号][列号]。 其中行号、列号都是以0开始。 如第三行第四个元素: a[2,3]。 注意下标不能越界,对上面的a数组,a[5,9]是错误的。 对某一行进行处理。 如累加第4行的数据。 则固定行号为3。 如: for(inti=0;i<7;i++)s+=a[3][i]; 对某一列进行处理。 如累加第4列的数据。 则固定列号为3。 如: for(inti=0;i<5;i++)s+=a[i][3]; 二、二维数组的输入输出: 1、输入可以定义时输入如: inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2、通过两重循环控制输入输出: for(inti=0;i<5;i++){————控制行数} for(intj=0;j<8;j++) cin>>a[i][j];{————第一行读入8个元素} {————最常用的方法: 从键盘读入数据初始化二维数组} for(inti=0;i<5;i++) for(intj=0;j<8;j++) a[i][j]: =0; {————最常用的方法: 将二维数组清0} for(inti=0;i<5;i++) { for(intj=0;j<8;j++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四章 数组 第四