《C语言课件第07章-数组.ppt》由会员分享,可在线阅读,更多相关《C语言课件第07章-数组.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章数数组组array第第7章章数数组组记录记录1个学生成绩,可用个学生成绩,可用ints1;记录记录2个学生成绩,可用个学生成绩,可用ints1,s2;记录记录3个学生成绩,可用个学生成绩,可用ints1,s2,s3;记录记录100个数,用个数,用ints1,s2,s100;?如何处理有相同属性的批量数据呢?如何处理有相同属性的批量数据呢?数组数组intscore100;代表一个元素个数为代表一个元素个数为100的整型数组的整型数组score0,score1,score2,.,score99100个整型变量个整型变量数组计数从数组计数从0开始开始第第7章章数数组组基本数据类型:基本数据
2、类型:char intfloatdouble一个基本数据类型的变量一次只能存储一个数值一个基本数据类型的变量一次只能存储一个数值构构造造数数据据类类型型,由由基基本本数数据据类类型型通通过过一一定定的的规规则组合而成,亦称导出类型。则组合而成,亦称导出类型。数数组组就就属属于于构构造造数数据据类类型型,用用数数组组一一次次可可以以表表示一批属于相同数据类型的数据。示一批属于相同数据类型的数据。intscore100;定义一个数组定义一个数组score100后,内存中将开辟连续的后,内存中将开辟连续的100个个int的空间单元,存储的空间单元,存储int变量变量score0,score991.一
3、维数组的定义和引用一维数组的定义和引用(p121)1)定义)定义 类型名类型名数组名数组名数组长度数组长度;数数组组的的大大小小必必须须在在定定义义时时给给定定,在在程程序序的的运运行行过过程程中中它它是不能被改变的是不能被改变的.数组(变量)的名称,标识符数组(变量)的名称,标识符数组元素的类型数组元素的类型inta10;定义一个含有定义一个含有10个整型元素的数组个整型元素的数组acharc200;定义一个含有定义一个含有200个字符元素的数组个字符元素的数组cfloatf5;定义一个含有定义一个含有5个浮点型元素的数组个浮点型元素的数组f常量表达式常量表达式先定义,后使用先定义,后使用只
4、能引用单个的数组元素,不能一次引用整个数组只能引用单个的数组元素,不能一次引用整个数组数组名数组名下标下标下标:整型表达式下标:整型表达式取值范围:取值范围:0,数组长度,数组长度-1inta10;10个元素:个元素:a0、a1、a9数组元素的使用方法与同类型的变量相同数组元素的使用方法与同类型的变量相同scanf(%d,&ai);printf(%d,ai);2)引用)引用1.一维数组的定义和引用一维数组的定义和引用引用时千万不能越界,如引用时千万不能越界,如a10区分数组的定义和数组元素的引用区分数组的定义和数组元素的引用内的是数组元素的下标内的是数组元素的下标下标可以是一个整型表达式下标可
5、以是一个整型表达式下标的值不能越界下标的值不能越界,0.N1内的是数组的长度内的是数组的长度数组长度必须是常量数组长度必须是常量(表达式)表达式)一旦指定,就不能改变一旦指定,就不能改变定义数组定义数组类型名类型名数组名数组名数组长度数组长度;inta10;引用数组元素引用数组元素数组名数组名下标下标a0=a9=0;ak=temp;2.一维数组的初始化一维数组的初始化(p122)静态数组初始化静态数组初始化staticintb5=1,2,3,4,5;在定义数组时,对数组元素赋初值在定义数组时,对数组元素赋初值类型名类型名数组名数组名数组长度数组长度=初值表初值表;inta10=1,2,3,4,
6、5,6,7,8,9,10;a0=1,a1=2,.a9=10,静态存储的数组如果没有初始化,所有元素自动赋静态存储的数组如果没有初始化,所有元素自动赋0动动态态存存储储的的数数组组如如果果没没有有初初始始化化,所所有有元元素素视视为为随随机值机值.如:如:autointc5;或或intc5;在引用前必须赋初值。在引用前必须赋初值。首首先先考考虑虑是是否否给给变变量量赋赋初值是编程的好习惯!初值是编程的好习惯!一维数组的初始化一维数组的初始化 针对部分元素的初始化针对部分元素的初始化intb5=1,2,3;b0=1,b1=2,b2=3,b3=0,b4=0如果对全部元素都赋初值,可以省略数组长度如果
7、对全部元素都赋初值,可以省略数组长度inta=0,1,2等价于等价于inta3=0,1,2 实际编程最好不要省略数组长度实际编程最好不要省略数组长度在在TC,VC中,其余元素实际值是被赋值为中,其余元素实际值是被赋值为0例例 7-2 用用数数组组计计算算 fibonacci 数数列列的的前前20个个数数,并并按按每每行行打打印印5个个数数的的格格式式输输出出。1,1,2,3,5,8,分析:分析:用数组计算并存放用数组计算并存放fibonacci数列的前数列的前20个数个数intf20;f0=f1=1;fn=fn-1+fn-2;2n193使用一维数组编程使用一维数组编程例例 7-2 源程序源程序
8、#includeintmain(void)inti;intfib20=1,1;/*数组初始化数组初始化*/for(i=2;i20;i+)fibi=fibi-1+fibi-2;for(i=0;i20;i+)printf(%6d,fibi);if(i+1)%5=0)/*5个数换行个数换行*/printf(n);return0;例例7-3 在数组中查找一个给定的数在数组中查找一个给定的数要要求求:输输入入5个个互互异异的的整整数数,将将它它们们存存入入数数组组a中中,再再输输入入一一个个数数x,然然后后在在数数组组中中查查找找x,如如果果找找到到,输输出出相应的下标,否则,输出相应的下标,否则,输出
9、“NotFound”。输入:输入:298169输出:输出:1输入:输入:298167输出:输出:NotFound例例 7-3 源程序源程序#includeintmain(void)inti,flag,x;inta5;printf(Enter5integers:);for(i=0;i5;i+)scanf(%d,&ai);printf(Enterx:);scanf(%d,&x);flag=0;for(i=0;i5;i+)if(ai=x)printf(Indexis%dn,i);flag=1;break;if(flag=0)printf(NotFoundn);return0;Enter5intege
10、rs:29819Enterx:9Indexis1如果允许输入相同的数如果允许输入相同的数Enter5integers:29819Enterx:9Indexis1Indexis4输出所有满足条件的数的下标输出所有满足条件的数的下标#includeintmain(void)inti,index,x;inta5;printf(Enter5integers:);for(i=0;i5;i+)scanf(%d,&ai);printf(Enterx:);scanf(%d,&x);index=-1;for(i=0;i5;i+)if(ai=x)index=i;if(index!=-1)printf(Indexi
11、s%dn,index);elseprintf(NotFoundn);return0;例例 7-3 思考思考Enter5integers:29819Enterx:9Indexis4若要求输出最后一个相同数的下标若要求输出最后一个相同数的下标例例 7-3 思考思考#includeintmain(void)inti,flag,x;inta5;printf(Enter5integers:);for(i=0;i5;i+)scanf(%d,&ai);printf(Enterx:);scanf(%d,&x);flag=0;for(i=0;i=0;i-)例例7-4 求最小值求最小值 要要求求:输输入入一一个个
12、正正整整数数n(na0,a1,假假设设min=a0,与与i 1,n-1所所有有的的数数进进行行比比较较,如果如果aiminmin=ai;所有的数都比较所有的数都比较,一共循环一共循环n-1次次例例 7-4(1)求最小值求最小值#includeintmain(void)inti,min,n;inta10;printf(Entern:);scanf(%d,&n);printf(Enter%d integers:,n);for(i=0;in;i+)scanf(%d,&ai);min=a0;for(i=1;in;i+)if(aimin)min=ai;printf(minis%dn,min);retur
13、n0;例例7-4 求最小值求最小值(2)要要求求:输输入入一一个个正正整整数数n(n10),再再输输入入n个个整整数数,将它们存入数组将它们存入数组a中。中。(1)输出最小值和它所对应的下标输出最小值和它所对应的下标(2)将最小值与第一个数交换,输出交换后的将最小值与第一个数交换,输出交换后的n个数个数在求最小值的过程中,在求最小值的过程中,用用index记录最小值对应的下标记录最小值对应的下标aindex就是最小值就是最小值#includeintmain(void)inti,index,n;inta10;printf(Entern:);scanf(%d,&n);printf(Enter%di
14、ntegers:,n);for(i=0;in;i+)scanf(%d,&ai);index=0;for(i=1;in;i+)if(aiaindex)index=i;printf(minis%dtsubis%dn,aindex,index);return0;例例7-4(2)求最小值及其下标求最小值及其下标要使最小值与第一个数交换要使最小值与第一个数交换 例例7-4 求最小值求最小值(3)要要求求:输输入入一一个个正正整整数数n(n10),再再输输入入n个个整整数数,将它们存入数组将它们存入数组a中。中。(1)输出最小值和它所对应的下标输出最小值和它所对应的下标(2)将最小值与第一个数交换,输出交
15、换后的将最小值与第一个数交换,输出交换后的n个数个数aindexa0temp=a0;a0=aindex;aindex=temp;temp=aindex;aindex=ak;ak=temp;任意两个数组元素值任意两个数组元素值aindex和和ak的交换的交换515aindex=5,ak=1;temp=0;例例 7-1 选择法排序选择法排序输入输入n(n10),再输入再输入n个数个数,用选择法将它们从用选择法将它们从小到大排序后输出。小到大排序后输出。设设n=53528135281(1)15283(2)2583(3)385(4)58 选选择择法法:每每次次从从未未排排序序的的数数中中通通过过选选择
16、择最最小小数数进行排序。进行排序。35281(n=5)5个数个数(a0a4)中找最小数,与中找最小数,与a0交换交换(1)15283a4a04个数个数(a1a4)中找最小数,与中找最小数,与a1交换交换(2)12583a2a13个数个数(a2a4)中找最小数,与中找最小数,与a2交换交换(3)12385a4a22个数个数(a3a4)中找最小数,与中找最小数,与a3交换交换(4)12358a4a3选择法选择法(1)选择法选择法(2)(1)5个数个数(a0a4)中找最小数,与中找最小数,与a0交换交换(2)4个数个数(a1a4)中找最小数,与中找最小数,与a1交换交换(3)3个数个数(a2a4)中
17、找最小数,与中找最小数,与a2交换交换(4)2个数个数(a3a4)中找最小数,与中找最小数,与a3交换交换(1)n个数个数(a0an-1)中找最小数,与中找最小数,与a0交换交换(2)n-1个数个数(a1an-1)中找最小数,与中找最小数,与a1交换交换(n-1)2个数个数(an-2an-1)中找最小数,与中找最小数,与an-2交换交换an-1n个数排序,个数排序,n-1次找最小数以及交换操作次找最小数以及交换操作#includeintmain(void)inti,index,k,n,temp;inta10;printf(Entern:);scanf(%d,&n);printf(Enter%d
18、integers:,n);for(i=0;in;i+)scanf(%d,&ai);for(k=0;kn-1;k+)/*对对n个数排序个数排序*/index=k;for(i=k+1;in;i+)if(aiaindex)index=i;temp=aindex;aindex=ak;ak=temp;printf(Aftersorted:);for(i=0;in;i+)/*输出输出n个数组元素的值个数组元素的值*/printf(%d,ai);return0;源代码选择法排序源代码选择法排序 for(i=0;in;i+)scanf(%d,ai);数组:相同类型数据的有序集合,在内存中连续存放数组:相同类型
19、数据的有序集合,在内存中连续存放。l由数组名和下标惟一地确定每个数组元素由数组名和下标惟一地确定每个数组元素l每个元素都属于同一类型每个元素都属于同一类型在在数数组组中中,一一批批相相同同类类型型的的变变量量使使用用同同一一个个数数组组变变量名,用下标来相互区分。量名,用下标来相互区分。inta10;40027从高位开始逐位输出一个整数从高位开始逐位输出一个整数的各位数字的各位数字(选作选作)if(in0)/*先向左找到最高位的位数先向左找到最高位的位数*/power=power/10;temp+;k=k*10;power=in;while(temp0)/*再向右计算每位数值再向右计算每位数值
20、*/temp-;k=k/10;digit=power/k;power=power%k;printf(%-2d,digit);40027用一维数组实现用一维数组实现inti,digit10,number,temp;while(number!=0)digiti=number%10;i+;number=number/10;temp=i-1;for(i=temp;i=0;i-)printf(%-2d,digiti);二维数组二维数组一维数组:访问单个变量元素时,由一个下标决定。一维数组:访问单个变量元素时,由一个下标决定。inta6;int b 3 6;一维数组用于表示一列长表,一个多维向量一维数组用
21、于表示一列长表,一个多维向量访问单个变量元素时,访问单个变量元素时,由两个下标同时决定。由两个下标同时决定。二维数组二维数组3行6列700b12=700;第第j行、第行、第k列的元素为列的元素为bjk二维数组二维数组二维数组常用于表示矩阵的运算二维数组常用于表示矩阵的运算inta32;intb32;intc32;for(j=0;j3;j+)for(k=0;k2;k+)cjk=ajk+bjk;Mc=Ma+Mbinta6;intb36;intc1036;访问单个变量元素时,访问单个变量元素时,由三个下标同时决定。由三个下标同时决定。三维数组三维数组多维数组的空间想象多维数组的空间想象一维数组:一维
22、数组:一列长表或一个向量一列长表或一个向量二二维维数数组组:一一个个表表格格或一个平面矩阵或一个平面矩阵4*3*34*5三维数组:三维数组:三三维维空空间间的的一一个数据阵个数据阵多维数组:多维数组:多维空间的一个数据列阵多维空间的一个数据列阵7.2.2 二维数组的定义和引用二维数组的定义和引用1、定义、定义 类型名类型名数组名数组名行长度行长度列长度列长度;数组元素的类型数组(变量)的名称,标识符数组(变量)的名称,标识符常量表达式,给定数组的大小;inta32;定义一个二维数组定义一个二维数组a,3行行2列,列,3*2=6个个int元素元素floatb510;定义一个二维数组定义一个二维数
23、组b,5行行10列列,5*10=50个个float元素元素下标不能越界下标不能越界7.2.2 二维数组的定义和引用二维数组的定义和引用先定义,后引用先定义,后引用2、引用、引用数组元素的引用格式:数组元素的引用格式:数组名数组名行下标行下标列下标列下标行下标和列下标:整型表达式行下标和列下标:整型表达式行下标的取值范围是行下标的取值范围是0,行长度,行长度-1列下标的取值范围是列下标的取值范围是0,列长度,列长度-1inta32;3行行2列,列,3*2=6个个int元素元素a00a01a10a11a20a21二维数组在内存中的存放方式二维数组在内存中的存放方式inta32;3行行2列,列,6个
24、元素个元素表示表示1个个3行行2列的矩阵列的矩阵a00a01a10a11a20a21 二维数组的元素在内存中二维数组的元素在内存中按先行后列的方式存放按先行后列的方式存放a00a01a10a11a20a217.2.3 二维数组的初始化二维数组的初始化1、分行赋初值分行赋初值inta33=1,2,3,4,5,6,7,8,9;intb43=1,2,3,0,0,0,4,5;数组数组a123456789数组数组b1230004500002、按先行后列的顺序赋初值、按先行后列的顺序赋初值inta33=1,2,3,4,5,6,7,8,9;intb43=1,2,3,0,0,0,4,5;后面缺省的项均为零后面
25、缺省的项均为零3、省略行长度、省略行长度对全部元素都赋初值,对全部元素都赋初值,inta3=1,2,3,4,5,6,7,8,9;或分行赋初值时,在初值表中列出了全部行或分行赋初值时,在初值表中列出了全部行intb3=1,2,3,0,0,0,4,5建议不要省略建议不要省略数组数组a123456789数组b1 2 30 0 04 5 00 0 07.2.3 二维数组的初始化二维数组的初始化7.2.3 二维数组的初始化二维数组的初始化P130staticintb43=1,2,3,4,5;intb43=1,2,3,4,5;inta10=;7.2.4 使用二维数组编程使用二维数组编程通常将行下标做为外循
26、环的循环变量通常将行下标做为外循环的循环变量 列下标列下标 内循环内循环利利用用行行下下标标和和列列下下标标分分别别做做为为循循环环变变量量,通通过二重循环,遍历二维数组过二重循环,遍历二维数组例例7-6 生成一个矩阵并输出生成一个矩阵并输出 定定义义1个个3*2的的二二维维数数组组a,数数组组元元素素的的值值由由下式给出,按矩阵的形式输出下式给出,按矩阵的形式输出a。aij=i+j(0i2,0j1)分析:分析:a00a01a10a11a20a21aij0 11 22 3inta32;#includeintmain(void)inti,j;inta32;for(i=0;i3;i+)for(j=
27、0;j2;j+)aij=i+j;for(i=0;i3;i+)for(j=0;j2;j+)printf(%4d,aij);printf(n);return0;a00a01a10a11a20a21 i=0j=0i=0j=1i=1j=0i=1j=1i=2j=0i=2j=1例例7-6 源程序源程序0112237.2找出矩阵中最大值所在的位置找出矩阵中最大值所在的位置 例例7-5将将1个个3*2的的矩矩阵阵存存入入1个个3*2的的二二维维数数组组中中,找找出出最最大大值值以以及及它它的的行行下下标标和和列列下下标标,并输出该矩阵。并输出该矩阵。#includeintmain(void)inti,j,co
28、l,row;inta32;printf(Enter6integers:n);for(i=0;i3;i+)for(j=0;j2;j+)scanf(%d,&aij);for(i=0;i3;i+)for(j=0;j2;j+)printf(%4d,aij);printf(n);row=col=0;for(i=0;i3;i+)for(j=0;jarowcol)row=i;col=j;printf(max=a%d%d=%dn,row,col,arowcol);return0;例例7-5源程序源程序row记录最大值的行下标记录最大值的行下标col最大值的列下标最大值的列下标arowcol就是最大值就是最大值
29、二维数组的输入二维数组的输入例例7-5中,中,inta32;for(i=0;i3;i+)for(j=0;j2;j+)scanf(%d,&aij);a00a01a10a11a20a21 for(j=0;j2;j+)for(i=0;i3;i+)scanf(%d,&aij);Enter6integers:3210-96-1Enter6integers:3210-96-13-92610-1max=a20=10max=a10=10 3210-96-1用二维数组用二维数组a表示表示N*N方阵时方阵时:intaNN;N是正整数是正整数aij:i、j的取值范围的取值范围0,N-1矩阵元素与二维数组元素的对应关
30、系:矩阵元素与二维数组元素的对应关系:矩阵与二维数组矩阵与二维数组i=j主对角线主对角线i=j下三角下三角a00a01a02a10a11a12a20a21a22i+j=N-1副对角线副对角线输入一个正整数输入一个正整数n(1n6),根据下式生成,根据下式生成1个个n*n的的方阵,然后将该方阵转置(行列互换)后输出。方阵,然后将该方阵转置(行列互换)后输出。aij=i*n+j+1(0in-1,0jn-1)例7-7 方阵转置 123456789147258369a01a10a02a20a12a21aijaji 分析:分析:inta66;n=3时时#includeintmain(void)inti,
31、j,n,temp;inta66;printf(“Entern:);scanf(%d,&n);/*给二维数组赋值给二维数组赋值略略*/*行列互换行列互换*/for(i=0;in;i+)for(j=0;jn;j+)if(i=j)/*只遍历上三角阵只遍历上三角阵*/temp=aij;aij=aji;aji=temp;/*按矩阵的形式输出按矩阵的形式输出a略略*/return0;例7-7 源程序 /*行列互换行列互换*/for(i=0;in;i+)for(j=0;jn;j+)if(i=j)temp=aij;aij=aji;aji=temp;1 2 3 4 5 67 8 9主对角线:主对角线:i=j上三
32、角:上三角:i=ji=0147256389i=1147258369例7-7 说明for(j=i;jn;j+)(ij)for(j=i+1;jn;j+)/*行列互换行列互换*/for(i=0;in;i+)for(j=0;jn;j+)temp=aij;aij=aji;aji=temp;123456789例7-7 思考i=0147256389i=1127458369i=2123456789分析:分析:月月01231112非闰年非闰年03128313031闰年闰年03129313031例7-8 日期计算inttab213=0,31,28,31,30,31,30,31,31,30,31,30,310,31
33、,29,31,30,31,30,31,31,30,31,30,31自定义自定义1个函数个函数day_of_year(year,month,day),返回返回year,month和和day所对应的是该年的第几天。所对应的是该年的第几天。day_of_year(2000,3,1)返回返回61day_of_year(1981,3,1)返回返回60例7-8 源程序intday_of_year(intyear,intmonth,intday)intk,leap;inttab213=0,31,28,31,30,31,30,31,31,30,31,30,310,31,29,31,30,31,30,31,31
34、,30,31,30,31;leap=(year%4=0&year%100!=0)|year%400=0;for(k=1;kmonth;k+)day=day+tableapk;returnday;一维字符数组一维字符数组 t0 t1 t4tHappy输出数组输出数组t的所有元素的所有元素for(i=0;i5;i+)putchar(ti);chart5=H,a,p,p,y;chart5;字符串常量字符串常量:用一对双引号括起来的字符序列用一对双引号括起来的字符序列一个字符串的结束符:一个字符串的结束符:0字符串字符串(P136)Happy6个字符个字符Happy0有效字符有效字符字符串的有效长度:
35、有效字符的个数字符串的有效长度:有效字符的个数字符字符0,就是,就是ASCII码值为码值为0的字符的字符利用一维字符数组利用一维字符数组存储字符串常量存储字符串常量“Helloworld!”charstr80=“Helloworld!”;charstr80=H,e,l,l,o,w,o,r,l,d,0;严格区别字符常量和字符串常量严格区别字符常量和字符串常量A/*占一个字节占一个字节charc=A*/“A”/*占两个字节占两个字节charstr2=“A”*/printf(%d,%dn,sizeof(A),sizeof(A);利用一维字符数组存储字符串常量利用一维字符数组存储字符串常量 s0 s1
36、 s5s Happy0 t0 t1 t4t Happychart5=H,a,p,p,y;chars6=“Happy”;字符串是一个特殊的一维字符数组字符串是一个特殊的一维字符数组/*“Helloworld”*/产生相同结果的字符串:产生相同结果的字符串:chars05=ABCD;chars1=ABCD;chars25=A,B,C,D,0;chars3=A,B,C,D,0;chars35=ABCDE;字符串的存储字符串的存储autochars80=Happy;字字符符串串“Happy”由由第第一一个个0前前面面的的所所有有字字符和符和0一起构成一起构成0之后的其他数组元素与该字符串常量无关之后的
37、其他数组元素与该字符串常量无关 s0 s1 s5s H a p p y 0?利用一维字符数组利用一维字符数组对字符串进行操作或运算对字符串进行操作或运算例例7-9输入一个以回车结束的字符串输入一个以回车结束的字符串(少少于于10个字符个字符),它由数字字符组成,将,它由数字字符组成,将该字符串转换成整数后输出。该字符串转换成整数后输出。字符串转化为十进制整数(字符串转化为十进制整数(p134)#includeintmain(void)inti,n;chars10;printf(“Enterastring:);/*输入字符串输入字符串*/i=0;while(si=getchar()!=n)i+;
38、si=0;n=0;/*将字符串转换为整数将字符串转换为整数*/for(i=0;si!=0;i+)if(si=0)n=n*10+(si-0);elsebreak;printf(digit=%dn,n);return0;字符串转化为整数字符串转化为整数=8进制数进制数if(si=0)n=n*7+(si-0);123=(1*10+2)*10+3对字符串的操作对字符串的操作把字符串放入一维字符数组(存储)把字符串放入一维字符数组(存储)对字符串的操作对字符串的操作=对字符数组的操作对字符数组的操作普普通通字字符符数数组组:数数组组元元素素的的个个数数是是确确定定的的,一般用下标控制循环一般用下标控制循环字字符符串串:没没有有显显式式地地给给出出有有效效字字符符的的个个数数,只只规规定定在在字字符符串串结结束束符符0之之前前的的字字符符都都是是字字符符串串的的有有效效字字符符,一一般般用用结结束束符符0来控制循环来控制循环循环条件循环条件:si!=0