您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第四章 数组的应用 C++
第四章数组的应用教学目标:理解数组的概念,掌握一维数组和二维数组的定义、初始化和使用方法;掌握数值型数组的应用,包括实现起泡法排序、选择法排序和折半查找等功能的程序设计方法。C++数据类型基本数据类型非基本数据类型短整型short整型int长整型long浮点型float双精度型double长双精度型longdouble字符型char布尔型bool数组指针引用类结构联合枚举C++内部预定义的类型由基本数据类型构造出来的类型c++数据结构回顾§4.1数值型数组应用如果有100个互不关联的数据,可以分别把他们存放到100个变量中;但如果这些数据是有内在内在联系的,是具有相同属性的呢?这些例子都是将数据组合在一个特定的类别中(姓名、学号、成绩),所有这些都可以用数组来表示。比如:某个单位中100位雇员的姓名;名字可能是张三、李四、王五……西南交通大学某个班级100位学生的学号;学生的学号可能是001、002、003……某年级100个学生的成绩;学生的成绩可能是89、75、96……4.1数组的概念数组是具有一定顺序关系的若干相同类型数据的集合体,数组用数组名来标识。一个数组名用来表示一组同类型的数据,这批同类型的数据被称为数组元素或分量。数组描述的是顺序数据结构,即数组元素在逻辑上相邻,在物理上也相邻,即在内存中它们是连续存放的。数组和变量一样,必须先定义,后使用。有n个学生参加某门课程的考试,把高于平均成绩的学生学号和成绩输出出来。[例4.1]分析:对于学生的信息用数组表示。用一维数组num表示学生的学号;用一维数组元素num[i]表示第i个学生的学号。用一维数组s表示学生的某门课程的考试成绩;用一维数组元素s[i]表示第i个学生某门课程的考试成绩。源程序清单:#includeiostreamusingnamespacestd;voidmain(){inti,n;floatnum[50],s[50],sum=0.0,ave;cinn;for(i=0;in;i++)cinnum[i]s[i];for(i=0;in;i++)sum=sum+s[i];ave=sum/n;for(i=0;in;i++)if(s[i]ave)coutnum[i]s[i]endl;}定义两个一维数组输入数组元素的值对数组元素进行操作1.数组的定义数组的定义格式如下:类型数组名[下标表达式1][下标表达式2]……其中:数组名为一标识符下标表达式为常量表达式(只能是整型数值或符号常量),不能是变量表达式。有一个下标表达式,则该数组叫做一维数组;有两个下标表达式,则该数组叫做两维数组;有N个下标表达式,则该数组叫做N维数组。数据元素个数和下标范围?数组数据类型的选择?数组通常用于表示解决问题中同类型的一组数据。如果同类型的一组数据是数值型的,那么,我们用数值型数组去表示。如果同类型的一组数据是字符型的或是字符串型的,那么,我们用字符型数组去表示。数组维数的选择?在数组表示同类型的一组数值型数据时,应掌握:同类型的一组数据是线性关系的,那么,用一维数组去表示;同类型的一组数据是行列关系的,那么,用二维数组去表示。一维数组的声明与引用一维数组的声明类型说明符数组名[常量表达式];例如:inta[10];表示a为整型数组,有10个元素:a[0]...a[9]引用必须先声明,后使用。数组不能以整体的形式参加数据处理,参加数据处理只能是数组元素例如:a[0]=a[5]+a[7]-a[2*3]数组名的构成方法与一般变量名相同。1.一维数组的定义(续)注意点:用常量:constintnum=20;intscore[num];能否用变量?intnum=20;intscore[num];!数组的大小在编译时必须确定,在程序执行过程中不能改变。2、一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组a,在内存中的存放次序如下:数组名字是数组首元素的内存地址。数组名是一个地址常量,不能被赋值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a3.一维数组的初始化在声明数组的同时可以对数组元素赋以初始值例如:inta[5]={0,1,2,3,4};可以只给一部分元素赋初值(至少一个),当没有为数组中每个元素提供初始值时,C++将未初始化的元素赋值为默认值。例如:inta[5]={0,1,2};(a[3]=0,a[4]=0)如果没有赋任何一个初值,C++不能自动初始化元素,数组元素将包含垃圾数据。在对全部数组元素赋初值时,可以不指定数组长度.例如:inta[]={1,2,3,4,5}(数组长度为5)静态一维数组声明静态一维数组时,在前面加上关键字static例如:staticinta[5];若未对静态数组进行初始化,则数组的所有元素将自动获取初始值0。如上例中定义的数组a的5个元素均为0。静态数组的初始化是在编译时完成的,以后执行该函数时将不再重新赋值,而是直接使用原有值。4、数组必须先定义后使用#includeiostreamusingnamespacestd;voidmain(void){inta[5],sum;//定义数组a和变量suma[0]=3;a[1]=1;a[2]=7;a[3]=4;a[4]=8;sum=a[0]+a[1]+a[2]+a[3]+a[4];coutsum=sumendl;}虽然数组定义和数组元素的引用形式类似,但它们含义不同:inta[5];是定义有5个元素的数组a。而表达式:a[4]表示数组中下标为4的元素。4.一维数组的使用①使用数组中某一个元素的格式:数组名[下标表达式]例如:inta[10];a[0]=1,a[9]=2;下标的取值应该满足:0=下标的值=常量表达式的值-14.一维数组的使用(续)②越界问题若一个数组含有n个元素,访问元素时,必须保证下标表达式的值是从0到n-1之间的整数。如果表达式的值超出该范围,这种现象称为越界。例如:inta[5];a[5]=3;a[0]a[1]a[2]a[3]a[4]a[5]3数组存储空间之外的内存单元错误!4.一维数组的使用(续)③两个数组的相互赋值inta[5]={1,2,3,4,5},b[5];b=a;for(inti=0;i5;i++)b[i]=a[i];//错:数组之间不能直接相互赋值。4.一维数组的使用(续)④如何输入数组?intscore[5];cinscore;intscore[5];for(inti=0;i5;i++)cinscore[i];数组名字是数组首元素的内存地址,是一个常量,不能被赋值。4.一维数组的使用(续)⑤如何输出数组?inta[5]={1,2,3,4,5};couta;inta[5]={1,2,3,4,5};for(inti=0;i5;i++)couta[i];5.一维数组的应用举例:Fibonacci数列1202年,意大利数学家斐波那契出版了他的《算盘全书》。他在书中提出了一个关于兔子繁殖的问题:如果一对兔子每月能生一对小兔(一雄一雌),而每对小兔在它出生后的第三个月里,又能开始生一对小兔,假定在不发生死亡的情况下,由一对出生的小兔开始,10个月后会有多少对兔子?时间(月)初生兔子(对)成熟兔子(对)兔子总数(对)11012011311241235235635875813881321913213410213455在第一个月时,只有一对小兔子,过了一个月,那对兔子成熟了,在第三个月时便生下一对小兔子,这时有两对兔子。再过一个月,成熟的兔子再生一对小兔子,而另一对小兔子长大,有三对小兔子。如此推算下去,便发现一个规律:分析由此可知,从第一个月开始以后每个月的兔子总数是:1,1,2,3,5,8,13,21,34,55,…若把上述数列继续写下去,得到的数列便称为斐波那契数列。数列中每个数便是前两个数之和,而数列的最初两个数都是1。若设F0=1,F1=1,F2=2,F3=3,F4=5,F5=8,F6=13...则:当n>1时,Fn+2=Fn+1+Fn,且F0=F1=1。Fibonacci数列#includeiostream#includeiomanipusingnamespacestd;voidmain(){intfib[20]={1,1};//定义数组,并初始化for(inti=2;i20;i++)//通过循环依次访问数组元素fib[i]=fib[i-2]+fib[i-1];//置当前元素为前两元素之和for(i=0;i20;i++)//输出前20个斐波那契数{if(i%5==0)coutendl;//输出,每行5个数coutsetw(5)fib[i];}//设置输出宽度为12}用数组来处理求Fibonacci数列前20项用数组来处理求Fibonacci数列问题运行结果:11235813213455891442333776109871597258441816765例、求数组元素的平均值#includeiostreamusingnamespacestd;voidmain(){doublegrade[10]={68.5,87.4,83.1,98.5,93.5,76.9,98.1,62.4,54.6,91.7},aver=0;for(intj=0;j10;j++)aver=aver+grade[j];aver=aver/10;coutaver=averendl;}例、求一维数组中最大、最小元素#includeiostreamusingnamespacestd;voidmain(){doublearray[10]={68.5,87.4,83.1,98.5,93.5,76.9,98.1,62.4,54.6,91.7},big,small;big=small=array[0];for(inti=0;i10;i++){if(array[i]big)big=array[i];if(array[i]small)small=array[i];}coutbig=big,small=smallendl;}if(a[i]==x)c++;if(a[i]%2==0)couta[i];课堂练习1、C++中各种数据类型的变量在定义后会被自动初始化为0值。2、定义数组时可以用变量来定义数组的大小,但不能用表达式。3、定义一个数组后,该数组的最小下标取值为0。4、数组是C++的基本数据类型。5、同一数组的所有数组元素在内存中是连续存放的。6、在C++中数组是具有一定顺序关系的若干相同类型变量的集合体。√√√×××课堂练习1、下列定义数组的语句,正确的是()Ainta(10);Bintn=10;inta[n];Cintn;cinn;inta[n]Dconstintn=10;inta[n];2、inta[]={0,1,2},执行后数组元素个数是()A1个B2个C3个D5个读程序,写结果{inta[4],i,j,k;for(i=0;i4;i++)a[i]=0;k=2;for(i=0;ik;i++)for(j=0;jk;j++)a[j]=a[i]+3;couta[1]@@@a[3]endl;}9@@@0数组的应用--查找给定一个值K,在长度为n的顺序表中找出关键字等于给定值K的项。若找到,则查找成功,返回该项的信息或该项在表中的位置;否则查找失败,返回相关的指示信息。顺序表是相同类型值的集合,因为所有的值是相同类型的,所以可以用数组来方便地存储顺序表,特别是一维数组。1.顺序查找2.折半查找问题:查找是否在以上的顺序表中?1、顺序查找从数组的首元素开始,逐个元素与待查找的关键字进行比较,直到找到相等的。若整个数组中没有与待查找关键字相等的元素,则查找不成功。35122718451638li
本文标题:第四章 数组的应用 C++
链接地址:https://www.777doc.com/doc-3135745 .html