C语言课件 第07章-数组

上传人:小*** 文档编号:243137441 上传时间:2024-09-16 格式:PPT 页数:58 大小:596.50KB
返回 下载 相关 举报
C语言课件 第07章-数组_第1页
第1页 / 共58页
C语言课件 第07章-数组_第2页
第2页 / 共58页
C语言课件 第07章-数组_第3页
第3页 / 共58页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章 数 组,array,第,7,章 数 组,记录,1,个学生成绩,可用,int,s1;,记录,2,个学生成绩,可用,int,s1,,,s2;,记录,3,个学生成绩,可用,int,s1,,,s2,,,s3;,记录,100,个数,用,int,s1,s2,s100; ?,如何处理有相同属性的批量数据呢?,数组,int,score100;,代表一个元素个数为,100,的整型数组,score0,score1,score2,.,score99 100,个整型变量,数组计数从,0,开始,第,7,章 数 组,基本数据类型:,char,int,float double,一个基本数据类型的变量一次只能存储一个数值,构造数据类型,由基本数据类型通过一定的规则组合而成,亦称导出类型。,数组,就属于构造数据类型,用数组一次可以表示一批属于相同数据类型的数据。,int,score100;,定义一个数组,score100,后,内存中将开辟连续的,100,个,int,的空间单元,存储,int,变量,score0, score99,1.,一维数组的定义和引用,(p121),1,)定义,类型名 数组名,数组长度, ;,数组的大小必须在定义时给定,在程序的运行过程中它是不能被改变的,.,数组(变量)的名称,标识符,数组元素的类型,int,a10;,定义一个含有,10,个整型元素的数组,a,char c200;,定义一个含有,200,个字符元素的数组,c,float f5;,定义一个含有,5,个浮点型元素的数组,f,常量表达式,先定义,后使用,只能引用单个的数组元素,不能一次引用整个数组,数组名,下标,下标:整型表达式,取值范围:,0,,数组长度,-1,int,a10;,10,个元素:,a0,、,a1,、, a9,数组元素的使用方法与同类型的变量相同,scanf(%d, &,ai,);,printf(%d,ai,);,2,)引用,1.,一维数组的定义和引用,引用时千万不能越界,如,a10,区分数组的定义和数组元素的引用, ,内的是数组元素的下标,下标可以是一个整型表达式,下标的值不能越界,0.N,1, ,内的是数组的长度,数组长度必须是常量,(,表达式),一旦指定,就不能改变,定义数组,类型名 数组名,数组长度,;,int,a10;,引用数组元素,数组名,下标,a0 = a9 = 0;,ak, = temp;,2.,一维数组的初始化,( p122),静态数组初始化,static,int,b5 = 1, 2, 3, 4, 5;,在定义数组时,对数组元素赋初值,类型名 数组名,数组长度, = ,初值表,;,int,a10 = 1,2,3,4,5,6,7,8,9,10;,a0=1, a1=2,. a9=10,静态存储的数组如果没有初始化,所有元素自动赋,0,动态存储的数组如果没有初始化,所有元素视为随机值,.,如:,auto,int,c5;,或,int,c5;,在引用前必须赋初值。,首先考虑是否给变量赋初值是编程的好习惯!,一维数组的初始化,针对部分元素的初始化,int,b5 = 1, 2, 3;,b0 = 1, b1 = 2, b2 = 3, b3 = 0, b4 = 0,如果对全部元素都赋初值,可以省略数组长度,int,a = 0, 1, 2,等价于,int,a3 = 0, 1, 2,实际编程最好不要省略数组长度,在,TC,VC,中,其余元素实际值是被赋值为,0,例,7-2,用数组计算,fibonacci,数列的前,20,个数,并按每行打印,5,个数的格式输出。,1, 1, 2, 3, 5, 8,分析:,用数组计算并存放,fibonacci,数列的前,20,个数,int,f20;,f0 = f1 = 1,;,fn, = fn-1 + fn-2,;,2n19,3,使用一维数组编程,例,7-2,源程序,#include ,int,main(void,),int,i;,int,fib20 = 1, 1; /*,数组初始化 *,/,for (i = 2; i 20; i+),fibi, =,fibi,- 1 +,fibi,- 2;,for (i = 0; i 20; i+) ,printf(%6d,fibi,);,if (i + 1) % 5 = 0) /* 5,个数换行 *,/,printf(n,);,return 0;,例,7-3,在数组中查找一个给定的数,要求:输入,5,个互异的整数,将它们存入数组,a,中,再输入一个数,x,,,然后在数组中查找,x,,,如果找到,输出相应的下标,否则,输出“,Not Found”,。,输入:,2 9 8 1 6,9,输出:,1,输入:,2 9 8 1 6,7,输出:,Not Found,例,7-3,源程序,#include ,int main(void), int i, flag, x;,int a5;,printf(Enter 5 integers: );,for(i = 0; i 5; i+),scanf(%d, ,printf(Enter x: );,scanf(%d, ,flag = 0;,for,(i = 0; i 5; i+),if,(ai = x),printf(Index is %dn, i);,flag = 1;,break;,if(flag = 0) printf(Not Foundn);,return 0;,Enter 5 integers:,2 9 8 1 9,Enter x:,9,Index is,1,如果允许输入相同的数,Enter 5 integers:,2 9 8 1 9,Enter x:,9,Index is,1,Index is,4,输出所有满足条件的数的下标,#include ,int,main(void,),int,i,index, x;,int,a5;,printf(Enter,5 integers: );,for(i,= 0; i 5; i+),scanf(%d, &,ai,);,printf(Enter,x: );,scanf(%d, ,index = -1;,for (i = 0; i 5; i+),if (,ai, = x),index = i;,if (index != -1),printf(Index,is %,dn, index);,else,printf(Not,Foundn);,return 0;,例,7-3,思考,Enter 5 integers:,2 9 8 1 9,Enter x:,9,Index is 4,若要求输出最后一个相同数的下标,例,7-3,思考,#include ,int main(void), int i, flag, x;,int a5;,printf(Enter 5 integers: );,for(i = 0; i 5; i+),scanf(%d, ,printf(Enter x: );,scanf(%d, ,flag = 0;,for,(i = 0; i =0; i-),例,7-4,求最小值,要求:输入一个正整数,n(n, a0,a1,假设,min=a0,与,i1,n-1,所有的数进行比较, 如果,ai, min,min,=,ai,;,所有的数都比较,一共循环,n-1,次,例,7-4(1),求最小值,#include ,int main(void), int i, min, n;,int a10;,printf(Enter n: );,scanf(%d, ,printf(Enter %d integers: , n);,for (i = 0; i n; i+),scanf(%d, ,min = a0;,for (i = 1; i n; i+),if(ai min) min = ai;,printf(min is %d n, min);,return 0;,例,7-4,求最小值,(2),要求:输入一个正整数,n(n,10),,,再,输入,n,个整数,将它们存入数组,a,中。,(1),输出最小值和它所对应的下标,(2),将最小值与第一个数交换,输出交换后的,n,个数,在求最小值的过程中,,用,index,记录最小值对应的下标,aindex,就是最小值,#include ,int,main(void,),int,i,index, n;,int,a10;,printf,( Enter n: );,scanf(%d, ,printf,( Enter %d integers: , n);,for(i,= 0; i n; i+),scanf(%d, &,ai,);,index = 0;,for(i,= 1; i n; i+),if(ai, ,aindex,) index = i;,printf(min,is %,dtsub,is %,dn,aindex, index);,return 0;,例,7-4(2),求最小值及其下标,要使最小值与第一个数交换,例,7-4,求最小值,(,3,),要求:输入一个正整数,n(n,10),,,再,输入,n,个整数,将它们存入数组,a,中。,(1),输出最小值和它所对应的下标,(2),将最小值与第一个数交换,输出交换后的,n,个数,aindex, a0,temp = a0;,a0 = aindex;,aindex = temp;,temp =,aindex,;,aindex,=,ak,;,ak, = temp;,任意两个数组元素值,aindex,和,ak,的交换,5,1,5,aindex,=5,ak=1,;,temp=0;,例,7-1,选择法排序,输入,n(n10),再,输入,n,个数,用选择法将它们从小到大排序后输出。,设,n=5 3 5 2 8 1,3 5 2 8 1,(1),1,5 2 8,3,(2),2,5,8 3,(3),3,8,5,(4),5,8,选择法:每次从未排序的数中通过选择最小数进行排序。,3 5 2 8 1 (n=5),5,个数,(a0a4),中找最小数,与,a0,交换,(1),1,5 2 8 3 a4 ,a0,4,个数,(a1a4),中找最小数,与,a1,交换,(2) 1,2,5 8 3 a2 ,a1,3,个数,(a2a4),中找最小数,与,a2,交换,(3) 1 2,3,8 5 a4 ,a2,2,个数,(a3a4),中找最小数,与,a3,交换,(4) 1 2 3,5,8 a4 ,a3,选择法,(1),选择法,(2),(1) 5,个数,(a0a4),中找最小数,与,a0,交换,(2) 4,个数,(a1a4),中找最小数,与,a1,交换,(3) 3,个数,(a2a4),中找最小数,与,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-1,n,个数排序,,n-1,次找最小数以及交换操作,#include ,int,main(void,),int,i, index, k, n, temp;,int,a10;,printf,( Enter n: );,scanf(%d, ,printf,( Enter %d integers: , n);,for(i,= 0; i n; i+),scanf(%d, &,ai,);,for(k,= 0; k n-1; k+) /*,对,n,个数排序 *,/,index = k;,for(i,= k + 1; i n; i+),if(ai, ,aindex,) index = i;,temp =,aindex,;,aindex, =,ak,;,ak, = temp;,printf(After,sorted: );,for(i,= 0; i n; i+) /*,输出,n,个数组元素的值 *,/,printf(%d,ai,);,return 0;,源代码选择法排序,for(i,= 0; i n; i+),scanf(%d,ai,);,数组:相同类型数据的有序集合,在内存中连续存放,。,由数组名和下标惟一地确定每个数组元素,每个元素都属于同一类型,在数组中,一批相同类型的变量使用同一个数组变量名,用下标来相互区分。,int,a10;,40027,从高位开始逐位输出一个整数的各位数字,(,选作,),if(in,0) ,/*,先向左找到最高位的位数 *,/,power=power/10;,temp+;,k = k * 10;,power=in;,while(temp,0) ,/*,再向右计算每位数值*,/,temp -;,k = k/10;,digit = power / k;,power =,power,% k; printf(%-2d,digit);,40027,用一维数组实现,int,i,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);,二维数组,一维数组:访问单个变量元素时,由一个下标决定。,int,a6;,int,b,3,6;,一维数组用于表示一列长表,一个多维向量,访问单个变量元素时,,由两个下标同时决定。,二维数组,3,行,6,列,700,b12=700;,第,j,行、第,k,列的元素为,bjk,二维数组,二维数组常用于表示矩阵的运算,int,a32;,int,b32;,int,c32;,for (j = 0; j3; j+),for (k=0; k2; k+) ,cjk, =,ajk, +,bjk, ;,Mc = Ma + Mb,int,a6;,int,b36;,int,c1036;,访问单个变量元素时,,由三个下标同时决定。,三维数组,多维数组的空间想象,一维数组: 一列长表或一个向量,二维数组:一个表格或一个平面矩阵,4*3*3,4*5,三维数组:,三维空间的一个数据阵,多维数组: 多维空间的一个数据列阵,7.2.2,二维数组的定义和引用,1,、定义,类型名 数组名,行长度,列长度,;,数组元素的类型,数组(变量)的名称,标识符,常量表达式,,给定数组的大小,;,int,a32;,定义一个二维数组,a,,,3,行,2,列,,3*2=6,个,int,元素,float b510;,定义一个二维数组,b,,,5,行,10,列, 5*10=50,个,float,元素,下标不能越界,7.2.2,二维数组的定义和引用,先定义,后引用,2,、引用,数组元素的引用格式:,数组名,行下标, ,列下标,行下标和列下标:整型表达式,行下标的取值范围是,0,,行长度,-1,列下标的取值范围是,0,,列长度,-1,int,a32; 3,行,2,列,,3*2=6,个,int,元素,a00 a01,a10 a11,a20 a21,二维数组在内存中的存放方式,int,a32;,3,行,2,列,,6,个元素,表示,1,个,3,行,2,列的矩阵,a00 a01,a10 a11,a20 a21,二维数组的元素在内存中按先行后列的方式存放,a00,a01,a10,a11,a20,a21,7.2.3,二维数组的初始化,1,、,分行赋初值,int,a33 = 1,2,3,4,5,6,7,8,9;,int,b43 = 1,2,3,0,0,0 ,4,5;,数组,a,1 2 3,4 5 6,7 8 9,数组,b,1 2 3,0 0 0,4 5 0,0 0 0,2,、按先行后列的顺序赋初值,int,a33 = 1,2,3,4,5,6,7,8,9;,int,b43 = 1,2,3,0,0,0,4,5;,后面缺省的项均为零,3,、省略行长度,对全部元素都赋初值,,int,a 3=1,2,3,4,5,6,7,8,9;,或分行赋初值时,在初值表中列出了全部行,int,b 3=1,2,3,0,0,0,4,5,建议不要省略,数组,a,1 2 3,4 5 6,7 8 9,数组,b,1 2 3,0 0 0,4 5 0,0 0 0,7.2.3,二维数组的初始化,7.2.3,二维数组的初始化,P130,static,int,b43 = 1,2,3, , 4,5 ;,int,b43 = 1,2,3, , 4,5 ;,int,a10 = ;,7.2.4,使用二维数组编程,通常将行下标做为外循环的循环变量,列下标 内循环,利用行下标和列下标分别做为循环变量,通过二重循环,遍历二维数组,例,7-6,生成一个矩阵并输出,定义,1,个,3*2,的二维数组,a,,,数组元素的值由下式给出,按矩阵的形式输出,a,。,a ,ij, = i + j,(,0i2,,,0j1,),分析:,a00 a01,a10 a11,a20 a21,aij,0 1,1 2,2 3,int,a32;,#include ,int,main(void,),int,i, j;,int,a32;,for(i,= 0; i 3; i+),for(j,= 0; j 2; j+),aij, = i + j;,for(i,= 0; i 3; i+) ,for(j,= 0; j 2; j+),printf(%4d,aij,);,printf(n,);,return 0;,a00 a01,a10 a11,a20 a21,i = 0 j = 0,i = 0 j = 1,i = 1 j = 0,i = 1 j = 1,i = 2 j = 0,i = 2 j = 1,例,7-6,源程序,0 1,1 2,2 3,7.2,找出矩阵中最大值所在的位置,例,7-5,将,1,个,3*2,的矩阵存入,1,个,3*2,的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。,#include ,int,main(void,),int,i, j,col, row;,int,a32;,printf(Enter,6 integers:n) ;,for(i,= 0; i 3; i+),for(j,= 0; j 2; j+),scanf(%d, &,aij,);,for(i,= 0; i 3; i+),for(j,= 0; j 2; j+),printf(%4d,aij,);,printf(n,);,row =,col,= 0;,for(i,= 0; i 3; i+),for(j,= 0; j ,arowcol,) ,row = i;,col,= j;,printf(max,=,a%d%d, = %,dn, row,col,arowcol,);,return 0;,例,7-5,源程序,row,记录最大值的行下标,col,最大值的列下标,arowcol,就是最大值,二维数组的输入,例,7-5,中,,int,a32;,for(i = 0; i 3; i+),for(j = 0; j 2; j+),scanf(%d, ,a00 a01,a10 a11,a20 a21,for(j = 0; j 2; j+),for(i = 0; i 3; i+),scanf(%d, ,Enter 6 integers:,3 2 10 -9 6 -1,Enter 6 integers:,3 2 10 -9 6 -1,3 -9,2 6,10 -1,max = a20 = 10,max = a10,= 10,3 2,10 -9,6 -1,用二维数组,a,表示,N*N,方阵时,:,int,aNN; N,是正整数,aij,:,i,、,j,的取值范围,0,,,N-1,矩阵元素与二维数组元素的对应关系:,矩阵与二维数组,i=j,主对角线,i=j,下三角,a00 a01 a02,a10 a11 a12,a20 a21 a22,i+j,=N-1,副对角线,输入一个正整数,n (1n6),,,根据下式生成,1,个,n*n,的方阵,然后将该方阵转置(行列互换)后输出。,aij, = i * n + j + 1,(,0in-1,,,0jn-1,),例,7-7,方阵转置,1 2 3,4 5 6,7 8 9,1 4 7 2 5 8,3 6 9,a01 a10,a02 a20,a12 a21,aij,aji,分析:,int,a66; n=3,时,#include ,int,main(void,),int,i, j, n, temp;,int,a66;,printf(“Enter,n: );,scanf(%d, ,/*,给二维数组赋值 略,*/,/*,行列互换,*,/,for(i = 0; i n; i+),for(j = 0; j n; j+),if (,i = j,) /*,只遍历上三角阵,*,/,temp = aij; aij = aji; aji = temp;,/*,按矩阵的形式输出,a,略, */,return 0;,例,7-7,源程序,/*,行列互换,*,/,for(i = 0; i n; i+),for(j = 0; j n; j+),if,(i = j),temp = aij;,aij = aji;,aji = temp;,1 2 3 4 5 6,7 8 9,主对角线:,i = j,上三角:,i =j,i=0,1 4 7 2 5 6,3 8 9,i=1,1 4 7,2 5 8,3 6 9,例,7-7,说明,for( j = i; j n; j+),(i j),for( j = i+1; j n; j+),/*,行列互换,*,/,for(i = 0; i n; i+),for(j = 0; j n; j+),temp = aij;,aij = aji;,aji = temp;,1 2 3 4 5 6,7 8 9,例,7-7,思考,i=0,1 4 7 2 5 6,3 8 9,i=1,1 2 7,4 5 8,3 6 9,i=2,1 2 3 4 5 6,7 8 9,分析:,月,0 1 2 3 11 12,非闰年,0 31 28 31 30 31,闰年,0 31 29 31 30 31,例,7-8,日期计算,int,tab213=,0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31,0, 31, 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),返回,61,day_of_year(1981, 3, 1),返回,60,例,7-8,源程序,int,day_of_year(int,year,int,month,int,day),int,k, leap;,int,tab213=,0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31,0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31,;,leap = (year%4=0,for (k=1; kmonth; k+),day =,day,+,tableapk,;,return day;,一维字符数组,t0 t1 t4,t,H a p p y,输出数组,t,的所有元素,for(i=0; i5; i+),putchar,( ti );,char,t5=H, a, p, p, y;,char,t5;,字符串常量,:,用一对双引号括起来的字符序列,一个字符串的结束符:,0,字符串 (,P136),Happy,6,个字符,H a p p y,0,有效字符,字符串的有效长度:有效字符的个数,字符,0,,就是,ASCII,码值为,0,的字符,利用一维字符数组存储字符串常量,“Hello world!”,char str80=“Hello world!”;,char str80=,H,e,l,l,o, ,w,o,r, l, d,0,;,严格区别字符常量和字符串常量,A /*,占一个字节,char c=A */,“A” /*,占两个字节,char str2=“A” */,printf(%d,%dn,sizeof(A),sizeof(A,);,利用一维字符数组存储字符串常量,s0 s1 s5,s,H a p p y 0,t0 t1 t4,t,H a p p y,char,t5=H, a, p, p, y;,char,s6=“Happy”;,字符串是一个特殊的一维字符数组,/* “Hello world ” */,产生相同结果的字符串:,char s05 = ABCD;,char s1 = ABCD;,char s25 = A, B, C, D, 0;,char s3 = A, B, C, D, 0;,char s35=ABCDE;,字符串的存储,auto char s80= Happy;,字符串,“,Happy”,由第一个,0,前面的所有字符和,0,一起构成,0,之后的其他数组元素与该字符串常量无关,s0 s1 s5,s,H a p p y,0,?,?,利用一维字符数组对字符串进行操作或运算,例,7-9,输入一个以回车结束的字符串,(,少于,10,个字符,),,它由数字字符组成,将该字符串转换成整数后输出。,字符串转化为十进制整数(,p134),#include ,int,main(void,),int,i, n; char s10;,printf(“Enter,a string: ); /*,输入字符串 *,/,i = 0;,while( (,si, =,getchar,( ) ) != n),i+;,si, =,0,;,n = 0; /*,将字符串转换为整数 *,/,for(i,= 0;,si, !=,0,; i+),if(si, = 0),n = n * 10 + (,si, - 0);,else,break;,printf(digit,= %,dn, n);,return 0;,字符串转化为整数,=8,进制数,if(si, = 0),n = n *,7,+ (,si, - 0);,123 = (1 * 10 + 2 ) * 10 + 3,对字符串的操作,把字符串放入一维字符数组(存储),对字符串的操作,=,对字符数组的操作,普通字符数组:数组元素的个数是确定的,一般用下标控制循环,字符串:没有显式地给出有效字符的个数,只规定在字符串结束符,0,之前的字符都是字符串的有效字符,一般用结束符,0,来控制循环,循环条件,:,si != 0,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!