《浙江大学C颜晖原版C7》由会员分享,可在线阅读,更多相关《浙江大学C颜晖原版C7(77页珍藏版)》请在金锄头文库上搜索。
1、.,第七章数组,一维数组二维数组字符串,.,输入30个数,将它们排序后输出。,数组:相同类型数据的有序集合在内存中连续存放用数组名和下标唯一地确定数组元素每个元素都属于同一类型,s0、s1、s2、s29,.,一批相同类型的变量使用同一个数组变量名,用下标来相互区分优点:表述简洁,可读性高便于使用循环结构,.,7.1一维数组,7.1.1一维数组的定义和引用1、定义类型名数组名数组长度类型名:数组元素的类型数组名:数组变量的名称(数组),标识符数组长度:常量表达式,给定数组的大小inta10;定义一个含有10个整型元素的数组a,.,inta10;定义一个含有10个整型元素的数组a,charc200
2、;定义一个含有200个字符元素的数组cfloatf5;定义一个含有5个浮点型元素的数组f,.,2、数组元素的引用,先定义,后使用只能引用单个的数组元素,不能一次引用整个数组数组元素的引用:数组名下标下标:整型表达式取值范围:,数组长度-1inta10;10个元素:a0、a1、a9下标不要越界,不能使用a10,.,定义数组:类型名数组名数组长度引用数组元素:数组名下标数组元素的使用方法与同类型的变量相同intk,a10;,k=3;a0=23;ak-2=a0+1;scanf(%d,.,区分定义数组和引用数组元素定义数组:类型名数组名数组长度引用数组元素:数组名下标inta10;a0=a1=a9=0
3、;下标不要越界,.,main()inta10;inti;for(i=0;i10;i+)ai=i;for(i=0;i10;i+)printf(%d,ai);输出:,0123456789,.,main()inti;inta10;for(i=0;i=0;i-)printf(%d,ai);输入:12345678910,输出:1234567891010987654321,.,3、程序举例,例7.1输入10个数,求和.例7.2用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1,1,2,3,5,例7.3输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到
4、,输出相应的下标,否则,输出“NotFound”。,.,程序举例,例7.4_1输入10个数,求最小值.例7.4_2输入n(n10),再输入n个数,求最小值。例7.4_3输入n(n10),再输入n个数,输出最小值和它所对应的下标。例7.4_4输入n(n10),再输入n个数,将最小值与第一个数交换,输出交换后的n个数。例7.5输入n(n10),再输入n个数,用选择法将它们从小到大排序后输出。,.,例7.1求和,输入10个数,求和.,main()inti,a10;longsum;for(i=0;i10;i+)scanf(“%d”,.,#include“stdio.h”voidmain()inta10
5、,i;longsum=0;for(i=0;i10;i+)scanf(“%d”,.,用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1,1,2,3,5,8,13,分析:用数组计算并存放fibonacci数列的前20个数f0=f1=1fn=fn-1+fn-22n19,例7.2计算fibonacci数列,.,main()inti,fib20;fib0=fib1=1;for(i=2;i20;i+)fibi=fibi-1+fibi-2;for(i=0;i20;i+)printf(“%6d,fibi);if(i+1)%5=0)printf(“n);,.,输入5个整数,将它们存入
6、数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。,例7.3查找,.,输入:298969输出:,1,voidmain()inti,x,a5;for(i=0;i=5)printf(“NotFoundn”);,.,13,voidmain()inti,x,a5;for(i=0;i5;i+)scanf(“%d”,输入:298969输出:,.,输入:298969输出:,3,voidmain()inti,x,sub,a5;for(i=0;i5;i+)scanf(“%d”,.,输入10个数,求最小值.,main()inti,min,a10;for(i=0
7、;i10;i+)scanf(“%d”,例7.4_1求最小值,.,输入n(n10),再输入n个数,求最小值。,main()inti,min,n,a10;scanf(“%d”,例7.4_2求最小值(n个数),.,输入n(n10),再输入n个数,输出最小值和它所对应的下标。用index记录最小值对应的下标aindex就是最小值,例7.4_3求最小值(下标),.,输出最小值和它所对应的下标,N-S流程图,.,main()inti,min,n,a10;scanf(“%d”,.,输入n(na0,例7.4_4最小值交换,.,例7.5选择法排序,输入n(n10),再输入n个数,用选择法将它们从小到大排序后输出
8、。n=5,(1)15283(2)2583(3)385(4)58,.,35281(n=5)5个数(a0a4)中找最小数,与a0交换(1)15283a4a04个数(a1a4)中找最小数,与a1交换(2)12583a2a13个数(a2a4)中找最小数,与a2交换(3)12385a4a22个数(a3a4)中找最小数,与a3交换(4)12358a4a3,.,(1)n个数(a0an-1)中找最小数,与a0交换(2)n-1个数(a1an-1)中找最小数,与a1交换(n-1)2个数(an-2an-1)中找最小数,与an-2交换,(1)5个数(a0a4)中找最小数,与a0交换(2)4个数(a1a4)中找最小数,
9、与a1交换(3)3个数(a2a4)中找最小数,与a2交换(4)2个数(a3a4)中找最小数,与a3交换,.,n个数(a0an-1)中找最小数,与a0交换,N-S流程图,.,N-S流程图(选择排序),.,voidmain()inti,index,k,n,temp,a10;scanf(“%d”,.,7.1.2一维数组的初始化,定义数组时,对数组元素赋初值类型名数组名数组长度=初值表;1.对全部元素赋初值inta10=0,1,2,3,4,5,6,7,8,9;a0=0,a1=1,.a9=9静态数组、全局数组、自动型数组初始化staticintb5=1,2,3,4,5;静态存储的数组如果没有初始化,自动
10、给所有元素赋0staticintb5,.,2.部分元素初始化staticintb5=1,2,3;b0=1,b1=2,b2=3,b3=0,b4=0autointfib20=0,1;如果对全部元素都赋初值,可以省略数组长度inta=0,1,2,3,4,5,6,7,8,9;建议不要省略数组长度,.,7.2二维数组,多维数组的空间想象,二维数组:一个表格或一个平面矩阵,一维数组:一列长表或一个向量,多维数组:多维空间的一个数据列阵,三维数组:三维空间的一个方阵,.,7.2.1二维数组的定义和引用,1、定义类型名数组名行长度列长度inta32;定义1个二维数组a,3行2列,6个元素intb510;5行1
11、0列,50个元素,.,2、数组元素的引用,先定义,后使用定义:类型名数组名行长度列长度数组元素的引用:数组名行下标列下标行下标的取值范围是0,行长度-1列下标的取值范围是0,列长度-1下标不要越界,.,inta32;3行2列,6个元素表示1个3行2列的矩阵a00a01a10a11a20a21,二维数组的元素在内存中按行/列方式存放a00a01a10a11a20a21,.,遍历二维数组,行下标和列下标分别做为循环变量,通过二重循环,遍历二维数组通常将行下标做为外循环的循环变量,a00a01a10a11a20a21for(i=0;i3;i+)for(j=0;j2;j+)aij=i+j;,i=0j=
12、0i=0j=1i=1j=0i=1j=1i=2j=0i=2j=1,011223,.,输入二维数组,inta32;for(i=0;i3;i+)for(j=0;j2;j+)scanf(“%d”,输入:123456,a00a01a10a11a20a21,123456,.,按矩阵的形式输出二维数组,inta32;for(i=0;i3;i+)for(j=0;j2;j+)printf(“%d”,a00a01a10a11a20a21,.,3、程序举例,例7.6定义1个3*2的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。aij=i+j(0i2,0j1)例7.7找出矩阵中绝对值最小的元素,以及它的行下
13、标和列下标。例7.8方阵转置(行列互换),.,定义1个3*2的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。aij=i+j(0i2,0j1),例7.6,.,#includevoidmain()inti,j;inta32;for(i=0;i3;i+)for(j=0;j2;j+)aij=i+j;for(i=0;i3;i+)for(j=0;j2;j+)printf(%4d,aij);printf(n);,.,找出矩阵中绝对值最小的元素,以及它的行下标和列下标。求绝对值函数abs()或fabs()头文件math.hrow记录绝对值最小的元素的行下标col记录列下标arowcol就是绝对值最小
14、的元素,例7.7,.,#include#includevoidmain()inti,j;inta32;for(i=0;i3;i+)for(j=0;j2;j+)scanf(“%d”,.,row=col=0;for(i=0;i3;i+)for(j=0;j2;j+)if(abs(aij)abs(arowcol)row=i;col=j;printf(“a%d%d=%dn,row,col,arowcol);输入:3210-96-1,3210-96-1,.,intaNN;N是正整数数组元素aij,i和j的取值范围0,N-1用二维数组a表示N*N方阵时,对应关系:a00a01a02主对角线a10a11a12
15、上三角a20a21a22下三角,方阵,i=ji=j,.,输入一个正整数n(1n6),根据下式生成1个n*n的方阵,然后将该方阵转置(行列互换)后输出。aij=i*n+j+1(0in-1,0jn-1)inta66,例7.8,.,分析,.,#includevoidmain()inti,j,n,t;inta66;scanf(“%d”,输入3123456789,.,for(i=0;in;i+)for(j=0;jn;j+)t=aij;aij=aji;aji=t;for(i=0;in;i+)for(j=0;jn;j+)printf(%4d,aij);printf(n);,.,for(i=0;in;i+)f
16、or(j=0;jn;j+)t=aij;aij=aji;aji=t;,i=0:147256389,i=1:127458369,i=2:123456789,123456789,.,for(i=0;in;i+)for(j=0;jn;j+)if(i=j)t=aij;aij=aji;aji=t;,i=0:147256389,i=1:147258369,.,for(i=0;in;i+)for(j=0;jn;j+)if(i=j)t=aij;aij=aji;aji=t;,123456789,主对角线:i=j上三角:i=j,for(j=i;jn;j+),.,7.2.2二维数组的初始化,1、分行赋初值inta33=1,2,3,4,5,6,7,8,9;staticintb43=1,2,3,4,5;,数组a123456789,数组b123000450000,2、顺序赋初值inta33=1,