第四章数组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++不允许对数组的大小作动态的定义,即数组的大小不能是变量,必须是常量。如果要根据不同的数值改变数组的大小,可用常量表达式。如:二、一维数组的引用一般情况下,我们都用下标来访问数组格式为:数组名[下标]『说明』:1、数组下标不允许超越所定义的下标下界和上界。2、数组是一个整体,数组名是一个整体的标识,要对数组进行操作,必须对其元素操作。数组元素可以象同类型的普通变量那样作用。如:a[2]=34;是对数组a中第三个下标变量赋以34的值,cina[4];是从键盘读入一个数到数组a第5个元素中去。我们现在来完成实例4.1。程序如下:#includeiostreamusingnamespacestd;intmain(){inttot=0,a[100];for(inti=1;i=50;i++){cina[i];tot+=a[i];}#defineSIZE50voidmain(void){intart[SIZE];......}三、数组的基本操作数组的的基本操作包括四、一维数组应用示例三、数组的基本操作1、数组的读入数组的读入分为两种。第一种对数组中的一部分元素列举初值,未赋值的部分是0.第二种是程序执行的时候读入。inta[10]={0,1,2,3,4,5};inta[10]={0,1,2,3,4,5,0,0,0,0};#includeiostreamusingnamespacestd;intmain(){inta[6];for(inti=0;i=5;i++)cina[i];return0;}2、数组的输出3、数组的插入例如:数组a中保存了1、2、4、5、7五个元素,现在要在a数组里面第三个位置插入数字8,怎么做呢?a数组初始状态如下:1245712457要想在第三个位置插入数字8,只能从最后面开始,每一位向后移动一位,腾出一个空间放入数字8.『核心程序如下』:#includeiostreamusingnamespacestd;intmain(){inta[6]={1,2,3,4,5,6};for(inti=0;i=5;i++)couta[i]’‘;return0;}4574、数组的删除例如:数组a中保存了1、2、4、5、7五个元素,现在要在a数组里面删除第三个元素4,怎么做呢?124571257如上演示,要删除一个数,只要从这个数开始后面每一位向前移一位覆盖前面的数就可以了。『代码如下』for(inti=4;i=2;i--)a[i+1]=a[i];a[2]=8;75#includeiostreamusingnamespacestd;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++)couta[i]'';return0;}5、数组的查找因为数组是顺序存储,要在数组中查找一个数,只要把数组从头到尾扫描一遍就可以了。#includeiostreamusingnamespacestd;intmain(){inta[11],b,c=-1;for(inti=0;i10;i++)cina[i];cinb;for(inti=0;i10;i++)if(a[i]==b){c=i;break;}if(c==-1)coutnothisdigit;elsecoutc;return0;}输入10个整数要查找的数b假如当前的元素是整数b就就保存下标,并跳出循环。向前平移覆盖四、数组的应用实例『实例4.3』输入10个数,要求程序按输入时的逆序把这10个数打印出来。也就是说,请你按输入相反顺序打印这10个数。分析:我们可定义一个数组a用以存放输入的50个数,然后将数组a内容逆序输出。源程序如下:#includeiostreamusingnamespacestd;intmain(){找不到就输出提示找到就输出下标inta[10];for(inti=0;i=9;i++)cina[i];for(inti=9;i=0;i--)couta[i]'';return0;}『实例4.4』求S=x1*y1+x2*y2+x3*y3……x10*y10。其中x1到x10分别为1,3,5,7……17,19y1到y10的值为21,22,23,……29,30.分析:此题需要两个数组分别存储xi和yi的值。源程序如下:#includeiostreamusingnamespacestd;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];}couts;return0;}『实例4.5』将数组a[1..10]中第一个元素移到数组的末尾,其余数据依次往前平移一个位置。分析:先将a[1]保存起来,然后从a[2]开始数组的其他元素前移,最后把a[1]送入a[n]中。源程序如下:#includeiostreamusingnamespacestd;intmain(){inta[10];for(inti=0;i10;i++)cina[i];inttemp=a[0];for(inti=0;i9;i++)a[i]=a[i+1];a[9]=temp;for(inti=0;i10;i++)couta[i]'';return0;}『实例4.6』从键盘中输入一段字符,以星号“*”为结束标志,存储到数组中(不包括星号),然后将字符串显示出来。假设字符串的长度不超过100个字符。『分析』:因为输入的是字符而且长度不确定,所以我们必须定义一个长度为100的字符数组来保存字符串。#includeiostreamusingnamespacestd;intmain(){chara[101],ch;intlen=0;//len用于指示字符串的当前长度cinch;while(ch!='*'){a[len]=ch;//将新录入的字符添加到字符数组的末尾cinch;len++;}for(inti=0;ilen;i++)couta[i];return0;}『实例4.7』对于数组a[1..10](元素递增排列),输入一个测试数据x,如果x存在于数组a,则把x元素删除;否则将x插在相应的位置,要求数组仍然有序。分析:①查找是否存在x需要进行搜索,可以顺序查找或二分查找。②如果从数组中删除x,相当于将x后的元素向前平移,插入x则相当于将x插入点的元素依次向后平移。源程序如下:#includeiostreamusingnamespacestd;intmain(){inta[100],x;for(inti=0;i10;i++)cina[i];cinx;while(a[i]x&&i10)i++;if(a[i]==x)//找到x,删除{for(intj=i;j9;j++)//数据前移a[j]=a[j+1];for(intj=0;j9;j++)顺序查找couta[j]'';}Else//没找到x,插入{for(intj=10;ji;j--)//数据后移a[j]=a[j-1];a[i]=x;for(intj=0;j11;j++)couta[j]'';}return0;}『实例4.8』输入十个正整数,把这十个数按由小到大的顺序排列。将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。分析:要把十个数按从小到大顺序排列,则排完后,第一个数最小,第二个数次小,……。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它小的,则与之交换,比较结束后,则第一个数已是最小的数。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次小的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。于是十个数的顺序排列结束。例如下面对5个进行排序,这个五个数分别为829105。按选择排序方法,过程如下:初始数据:829105289105259108258109258910对于十个数,则排序要进行9次。源程序如下:#includeiostreamusingnamespacestd;intmain(){inta[100],x;for(inti=1;i=10;i++)//读入10个初始数据cina[i];for(inti=1;i10;i++)//进行9次排序for(intj=i+1;j=10;j++)//将第i个数与其后所有数比较if(a[j]a[i])//若有比a[i]小,则与之交换{inttemp=a[i];a[i]=a[j];a[j]=temp;}for(inti=1;i=10;i++)//输出排序后数据couta[i]'';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)2289244……1222……0211……025……122……121……00……1标准类型中,长整型的范围是-2147483647~2147483647,而二进制数10000000000的十进制值仅为1024,因此这里要使用数组存储二进制数的各位。源程序如下:#includeiostreamusingnamespacestd;intmain(){intbin[100],x,k=0;for(inti=1;i100;i++)bin[i]=0;cinx;while(x0){bin[k]=x%2;x=x/2;k++;}for(inti=k-1;i=0;i--)coutbin[i];return0;}『巩固练习』1.输入10个数,要求程序按输入时的逆序把这10个数打印出来。也就是说,请你按输入相反顺序打印这10个数。(y1.cpp)2.借助一维数组,生成菲波那契数列的前20项(从第3项开始每项是前两项之和):(y2.cpp)1123581321345589144233377…3.从键盘读入10个正整数,输出其中的奇数项及它们的和,输出偶数项及它们的平均数。例如,(y3.cpp)输入:1