资源预览内容
第1页 / 共118页
第2页 / 共118页
第3页 / 共118页
第4页 / 共118页
第5页 / 共118页
第6页 / 共118页
第7页 / 共118页
第8页 / 共118页
第9页 / 共118页
第10页 / 共118页
亲,该文档总共118页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章 数组和指针,数组: 是按一定格式排列起来的一系列具有同一属性的项目。 例如: 向量、矩阵、立体矩阵等。 a11 a12 a13 a21 a22 a23 a31 a32 a33 数组名: 表示群体的共性(具有同一种数据类型) 下标: 表示个体的个性(各自占有独立的单元),7.1 数组及数组元素7.1.1 一维数组,一维数组的定义方式: 类型说明符 数组名常量表达式; 数组名遵循标识符命名规则 常量表达式表示元素的个数,即数组长度。 例如:int a10; 数组元素的表示形式:数组名下标 其中,下标:是整型常量或整型表达式。对于任何数组,下标都从0开始。,例7.1用气泡法完成对10个数从小到大排序。 第一趟扫描找到了最小的数存入a0,其过程如下: a1 a2 a3 a4 a5 a6 a7 a8 a9 a10,4 5 3 1 2 6 9 7 8 0,4 5 3 1 2 6 9 0 7 8,4 5 3 1 2 6 9 7 0 8,4 5 3 1 2 6 0 9 7 8,4 5 3 1 2 6 9 0 7 8,4 5 3 1 2 6 9 7 0 8,4 5 3 1 2 6 0 9 7 8,4 5 3 1 2 0 6 9 7 8,4 5 3 1 2 0 6 9 7 8,4 5 3 1 0 2 6 9 7 8,4 5 3 1 0 2 6 9 7 8,4 5 3 0 1 2 6 9 7 8,4 5 3 0 1 2 6 9 7 8,4 5 0 3 1 2 6 9 7 8,4 5 0 3 1 2 6 9 7 8,4 0 5 3 1 2 6 9 7 8,4 0 5 3 1 2 6 9 7 8,0 4 5 3 1 2 6 9 7 8,第二趟扫描找到第二小的数存入a2,直到第九趟扫描,便可找到最大的数存入a10,其过程如下: a1 a2 a3 a4 a5 a6 a7 a8 a9 a10,0 1 4 5 3 2 6 7 9 8,0 1 2 4 5 3 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,main() int a11,i,j,t; printf(“input ten numbers:n”); for(i=1;ii;j-) if(aj-1aj) t=aj;aj=aj-1;aj-1=t; printf(“the sorted numbers:n”); for(i=0;i11;i+) printf(“%d”,ai); ,7.1.1一维数组,上述程序有许多值得改进的地方。 (1)在9趟由底向上的扫描中,可能最后几趟已无任何交换发生,程序应能做到,一旦发现某趟扫描中无任何交换时就会终止; (2)在每趟扫描中,上趟扫描中最后一次交换的位置k是至关重要的,因为当jk时,将再也没有任何交换发生,从而应该在此结束此趟扫描; (3)为使算法具有对称性,扫描的方向有两种可能的选择,一是使轻气泡上浮,一是使重气泡下沉。,7.1.1一维数组,例:用选择法排序。即先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换;每比较一轮,找出一个未经排序的数中最小的一个。共应比较9轮。,int a10,i,j,k,t; 初始化数组 i=0;i9; k=i; j=i+1;j9;,ajak?,Y,N,k=j,t=ak;ak=ai;ai=t;,共比9轮,记住该换的位置,寻找第k小的数aj,7.1.2 二维数组,二维数组的一般定义形式为: 类型说明符 数组名常量表达式常量表达式; 例如:float a34; 二维数组元素的表示形式为: 数组名下标1下标2 下标1:称为行下标/下标2:称为列下标,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,例7.2将44的矩阵转置并输出。,main() float a44,t; int i,j for(i=0;i4;i+) for(j=0;j4;j+) scanf(“%f”, ,0.0 0.1 0.2 0.3 1.0 1.1 1.2 1.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 3.3,0.0 1.0 2.0 3.0 0.1 1.1 2.1 3.1 0.2 1.2 2.2 3.2 0.3 1.3 2.3 3.3,7.1.3 多维数组,多维数组:多于二维的数组。 多维数组的定义、数组元素的引用:与二维数组类似,只是需要相应维数的下标。 例如: int cube564; /*三维数组*/ float data3492;/*四维数组*/ cube013=20; data1051=0.0;,1.同一个数组中的所有元素占用一组连续的存储空间; 2.数组的存储分配按行进行; 3.数组名字表示该数组的首元素地址。 对于一维数组而言,各元素按下标次序依次存放, 如a0,a1,a2,等等。且有: a0 a00 a01 a02 a03 a- a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 二维数组元素aij的地址可以这样得到: ,a000a001a002a003 a010a011a012a013 a020a021a022a023,a100a101a102a103 a110a111a112a113 a120a121a122a123,给出三维数组数组元素的地址计算公式。,7.3 数组的初始化,语言规定只有静态存储类(static)和外部存储类(extern)的数组才能初始化。例如:static int a10=0,1,2,3,4,5,6,7,8,9; 这里必须将各数组元素的初值放在一对花括号内。编译程序按数组元素的存放顺序依次对其赋值。 也可以对数组中的部分元素初始化,对静态数组而言,没有初始化的数组元素,系统会将它自动置0。,在对全部数组元素初始化时,可以不指定数组的长度。例如: static int a5=1,2,3,4,5; 可以写成:static int a=1,2,3,4,5; 在第二种写法中,花括号中有5个数,系统就会据此自动定义数组a的长度是5。 若是二维数组。则在定义数组时对第一维的长度可以不指定,但第二维的长度不能省略.,7.3 数组的初始化,对二维数组的初始化可以分行进行,如: static int a34=1,2,3,4,5,6,7,8,9,10,11,12; static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 另一种办法是将所有数据写在一个花括号内,如: static int a34=1,2,3,4,5,6,7,8,9,10,11,12; static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 按数组中各元素的排列顺序依次赋值。,7.3 数组的初始化,例 7.3 用数组来求斐波那契数列。 main() int i; static int a20=1,1; for(i=2;i20;i+) ai=ai-2+ai-1; for(i=0;i20;i+) printf(“%d”,ai); ,7.3 数组的初始化,7.4 数组作为函数参数7.4.1 函数参数的传递方式,函数参数传递方式:“值传递”和“地址传递” “值传递”:把计算出的实参的值赋给形参.形参和实参在存储空间上是分开的。数组元素可以作为函数的实参,其效果与简单变量相同。 “地址传递”:把实际参数的地址传递给形式参数,这样形参与实参共享同一存储空间,对形参的修改实质就是对实参的修改,语言虽不直接提供“地址传递”,但可以借助指针来模拟实现。,7.4.2 数组名作为函数的参数,在语言中允许数组名作函数的参数,此时实参与形参都用数组名。 fun(x) main() int x; int a=1,2; int t; fun(a); t=x0; printf(“%d,”,a0); x0=x1; printf(“%dn”,a1); x1=t; 结果: 2,1,说明: 1.语言中形参数组名是变量,而实参数组名是常量. 2.在用数组名作实参时,应注意与形参数组的类型相一致。 3.形参数组可以定义大小,也可以不指定大小。 4.若是二维数组,可以省略第一维的大小,但不能省略第二维的大小,否则无法进行下标变量的地址变换。 5.若在形参数组定义中没有明确数组元素的个数,可以借助另一个形参来完成。,7.4.2 数组名作为函数的参数,例7.4平台问题。设有序数组中值相同的元素构成一个平台,平台中元素的个数是平台的长度。设计一个函数,求有序整型数组中最长平台之长。,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,1,1,1,2,2,2,3,2,3,4,4,4,4,4,5,i,i,i,i,i,i,i,i,len=2,len=3,i,i,i,i,i,int fun(a,n) int a,n; int len,i; for(len=i=1;in;i+) if(ai=ai-len)len+; return(len); ,main() int b=1,1,1,2,2,2,2, 3,3,4,4,4,4,4,5; printf(%d,fun(b,15); ,7.5 字符串变量,7.5.1 字符串变量的表示 在中,用一维字符数组来表示字符串变量. 例如: char str10,str130; 这里定义了两个字符串变量: str、str1 为了描述字符串的有效长度,采用0作为字符串的结束标志,扫描整个数组,直到碰见字符0。,字符串变量中存放的字符个数数组长度减1。 可以用字符串常量对字符型数组进行初始化。例如: static char c=“I am a boy”; 也可以省略花括号,直接写成 static char c=“I am a boy”; 注意:不能用赋值方式给字符串变量赋值!,7.5.1 字符串变量的表示,例7.5 把一个字符串中的大写字母改为小写字母,其余不变。 strlwr(s) char s; int i; for(i=0;si!=0;i+) if(si=A ,7.5.1 字符串变量的表示,7.5.2 字符串数组,考虑: char s510; s是一个二维数组,每个元素是一个字符。 s又是一个特殊的一维数组,访问某个字符串i,可以用si。,0 0 0 0 0, 例 7.6 输出某月份的英文名字。 main() int n; static char month14= “illegal month”, “January”, “February”, “March”, “December”; scanf(“ %d ”, ,month0 month1 month2 month3 month12 ,7.5.2 字符串数组,7.5.3 常用字符串处理函数,1. puts(字符串) 将给定字符串输出到标准输出设备上。在输出时将字符串结束标志0转换成n,即输出完字符串后换行。 2. gets(字符串) 从标准输入设备上读入一个字符串到字符数组中,并且返回一个函数值,该函数值是字符数组的起始地址。,3. strlen(字符串) 用以测试字符串的长度。函数值是字符串中字符的个数,不包括0在内。 4. strcpy(字符串
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号