




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、返回7.1 7.1 一维数组一维数组7.2 7.2 二维数组二维数组7.3 7.3 数组的应用数组的应用7.4 7.4 字符数组与字符串字符数组与字符串7.5 7.5 数组作为函数的参数数组作为函数的参数7.6 7.6 程序举例程序举例 下一页下一页1.1.数组的引入数组的引入 在前面的程序设计中,所涉及和处理的数据都非常简单,对这些数据采用C语言的基本类型(整型、实型、字符型)来描述就行,但在实际应用中,需要处理的数据往往是复杂多样的。问题:问题:输入中南大学2003级4500名学生的C语言成绩,按成绩从高分到低分排序,输出平均成绩及高于平均成绩的学生成绩。 如何编程呢?如何编程呢? 语言提
2、供了用户自定义数据的描述方法,即构造类型:由若干基本类型数据按一定的规则构成复杂数据对象。如数组类型。构造数据类型的引入,使我们能较方便地解决上面的问题。下一页下一页 第7章 数组上一页上一页2.2.数组的概念数组的概念数组:具有相同类型的数据组成的序列,是有序集合。数组:具有相同类型的数据组成的序列,是有序集合。数组中的每一个数据数组中的每一个数据称称数组元素数组元素数组分量数组分量下标变量下标变量注意注意:数组元素有序不是指元素大小顺序数组元素有序不是指元素大小顺序 第7章 数组上一页上一页返回7.1 7.1 一维数组一维数组7.1.1 一维数组的定义一维数组:只有一个下标的数组。定义格式
3、 :存储类别 类型标识符 数组名元素个数;说明:说明:1.存储类别:说明数组的存储属性,即数组的作用域与存储类别:说明数组的存储属性,即数组的作用域与生成期,可以是静态型(生成期,可以是静态型(static),自动型(自动型(auto)及外)及外部型(部型(extern)。当使用)。当使用auto型时可以省略。型时可以省略。 2.类型标识符:数组元素的类型。类型标识符:数组元素的类型。3.数组名的命名规则数组名的命名规则:与标识符的命名规则相同。与标识符的命名规则相同。4.数组数组“元素个数元素个数”:即数组长度,只能是一个整型常即数组长度,只能是一个整型常量表达式。可以是符号常量。量表达式。
4、可以是符号常量。下一页下一页 第7章 数组上一页上一页 定义了一个自动型整型数组:定义了一个自动型整型数组: 数组数组的元素为整型;数组名为的元素为整型;数组名为a a;元素个数为;元素个数为5 5; 下面是合法的数组定义下面是合法的数组定义: char str20;/* 定义一个有定义一个有20个元素的字符型数组个元素的字符型数组str */ float score8;/* 定义一个有定义一个有8个元素的浮点型数组个元素的浮点型数组score */ #define N 5long dataN; /* 定义一个有定义一个有5个元素的长整型数个元素的长整型数组组data */short z4*N
5、; /* 定义了一个有定义了一个有20个元素的短整型个元素的短整型数组数组z */其中其中的数组长度使用的是符号常量的数组长度使用的是符号常量下一页下一页 第7章 数组上一页上一页:int student35;char name20;float score35; #define student 35float n_studentstudent;int score_studentstudent*3; int person(10); int n=10, an;下面的定义是非法的:下面的定义是非法的: int n=10; char cn; /*数组长度不能使用变量数组长度不能使用变量 */下一页下一
6、页 第7章 数组上一页上一页 定义了数组以后,就可使用它了。但不能利用数组名来定义了数组以后,就可使用它了。但不能利用数组名来整体引用一个数组整体引用一个数组, ,只能单个的使用数组元素。只能单个的使用数组元素。数组元素的描述数组元素的描述 : : 由由 数组名加方括号中的下标数组名加方括号中的下标 组成组成, ,即:即: 数组名数组名 下标下标 下标:数组元素在数组中的顺序号,使用整序型表达式。下标:数组元素在数组中的顺序号,使用整序型表达式。取值范围:从取值范围:从0到元素个数到元素个数。 C语言不对下标越界作语法检查语言不对下标越界作语法检查。若有定义:若有定义: int a5int a
7、5;则数组则数组a的元素分别为的元素分别为: a0、a1、a2、a3、a4;但;但a5不是。不是。每个元素都可作为一个整型变量来使用。每个元素都可作为一个整型变量来使用。 如:如:a0=5;a3=a1+4;aD-B=3;scanf(“%d”,&a4);a5=80;a2.5=60; ?下一页下一页 第7章 数组上一页上一页#include main() int n,a15; for(n=0;n=0;n-) printf(“%4d”,an);输入:输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 输出:输出:15 14 13 12 11 10 9 8 7 6 5
8、 4 3 2 1下一页下一页 第7章 数组上一页上一页问:不问:不用数组能否完成,如何实现?假设是用数组能否完成,如何实现?假设是10001000个数据呢?个数据呢? 根据数组的有序性,往往使用循环语句来对数组进根据数组的有序性,往往使用循环语句来对数组进行处理,用循环控制变量作为数组下标,从而可以以行处理,用循环控制变量作为数组下标,从而可以以统一的方式来访问数组元素。统一的方式来访问数组元素。 1. 循环控制变量的初值、终值循环控制变量的初值、终值及控制条件。及控制条件。 2.不能整体输入不能整体输入/出数组出数组 如:如:printf(“%d”,a);学会如何对数组进行输入输出学会如何对
9、数组进行输入输出注意注意 数组变量数组变量 在内存中分配一片连续的存储单元,在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放数组元素按数组下标从小到大连续存放。a代表首地代表首地址址(数组起始地址数组起始地址),每个元素字节数相同,因此,根据每个元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。可对数组元素进行随机存取。 数组元素地址数组元素地址=数组首地址数组首地址+元素下标元素下标*sizeof(数数组类型组类型) 下一页下一页 第7章 数组上一页上一页例例 int a5; in
10、t a5; 设设a的首地址为的首地址为1000,数,数组组a存储示意图如右图所示存储示意图如右图所示内存内存1006a0a1a2a3a41000 a3的地址的地址=1000+32=1006:在定义数组的同时,对数组各元素指定初值。:在定义数组的同时,对数组各元素指定初值。 初始化是初始化是 编译阶段完成。编译阶段完成。:用赋值语句或输入语句也可给数组素指定初:用赋值语句或输入语句也可给数组素指定初值,是在运行时完成。值,是在运行时完成。下一页下一页 第7章 数组上一页上一页初始化数组格式:初始化数组格式:static static =或或 = ;说明:说明: 是用逗号分隔的数组元素的初始值是用
11、逗号分隔的数组元素的初始值( (常量)常量) 中数值的类型必须与中数值的类型必须与 一致。一致。下一页下一页 第7章 数组上一页上一页注意注意:若不对:若不对auto数组进行初始化,则其初值是不可数组进行初始化,则其初值是不可知的。若对一个知的。若对一个static或外部数组未进行初始化,则对或外部数组未进行初始化,则对数值型数组元素,初值为数值型数组元素,初值为0,而对字符型数组元素,而对字符型数组元素,初值为空字符初值为空字符0初始化初始化下一页下一页 第7章 数组上一页上一页对数组初始化的几种方法对数组初始化的几种方法在定义数组时,对全部数组元在定义数组时,对全部数组元素赋予初值。素赋予
12、初值。 例:例:int a5=0,1,2,3,4;int a5=0,1,2,3,4;在定义数组时,对部分数组元在定义数组时,对部分数组元素赋予初值。素赋予初值。例例 :int a5=1,2; int a5=1,2; 等价等价a0=1,a1=2; a0=1,a1=2; 其他赋其他赋0 0。对全部数组元素赋初值时,可对全部数组元素赋初值时,可省数组长度,系统自动确定。省数组长度,系统自动确定。例:例:int a =0,1, 2,3,4 int a =0,1, 2,3,4 ;等价于等价于int a5=0,1,2,3,4int a5=0,1,2,3,4a0a1a2a3a401234例例7.2 7.2
13、数组初始化与未初始化比较数组初始化与未初始化比较#include #include main()main()int i,a5=3,4,5,b5;int i,a5=3,4,5,b5; printf(“narray a is:”) printf(“narray a is:”) for(i=0;i5;i+) printf(“%6d”,ai); for(i=0;i5;i+) printf(“%6d”,ai); printf(“narray b is:”) printf(“narray b is:”) for(i=0;i5;i+) printf(“%6d”,bi); for(i=0;i5;i+) pri
14、ntf(“%6d”,bi); 运行结果:运行结果: array a is: 3 4 5 0 0 array b is: -32 1398 40 1170 454考虑:数组考虑:数组b 的值的含义?的值的含义?下一页下一页 第7章 数组上一页上一页#define N 5#include main( ) int i,j,k, max,min; static int a5; for (i=0;i5;i+) scanf(%d,&ai); max=min=a0; /*假定第一个元素既是最大的,也是最小的假定第一个元素既是最大的,也是最小的*/ j=k=0; /*对分别记录最大,最小元素下标的变量
15、对分别记录最大,最小元素下标的变量j,k初始化初始化 */ for (i=0;i5;i+) if (maxai) min=ai;k=i; printf(max:a%d=%d,min:a%d=%d,j,max,k,min); 若输入若输入: : 8 2 312 0 -108 2 312 0 -10输出为输出为: max:a2=312,min:a4=-10: max:a2=312,min:a4=-10 第7章 数组上一页上一页返回下一页下一页 第7章 数组上一页上一页: 存储类别存储类别 类型标识符类型标识符 数组名数组名 行数行数列数列数 ;例:例:float b53;float b53; 定义
16、了一个定义了一个5 53 3的数组的数组b,b,即数组为即数组为5 5行行3 3列,可列,可存放存放1515个实型数据。个实型数据。维数组的定义维数组的定义例:例:int a23;int a23; 定义了一个定义了一个2 23 3的数组的数组a a,即数组为,即数组为2 2行行3 3列,可列,可存放存放6 6个整型数据。个整型数据。2.2.二维数组元素的表示形式:二维数组元素的表示形式: 数组名下标下标数组名下标下标下标称下标称第一维第一维下标,下标称下标,下标称第二维第二维下标。下标。 二维数组类似于数学中的矩阵二维数组类似于数学中的矩阵 ,由行、列组成。,由行、列组成。 把所有第一维下标相
17、同的元素称为把所有第一维下标相同的元素称为行行,所有第,所有第二维下标相同的元素称为二维下标相同的元素称为列列。 数组数组a a的的6 6个个元素元素如下:如下: a00 a01 a02 a00 a01 a02 a10 a11 a12 a10 a11 a12 下一页下一页 第7章 数组上一页上一页3. 3. 多维数组的定义多维数组的定义 根据二维数组的定义,我们可以类推出多维数组的定义。根据二维数组的定义,我们可以类推出多维数组的定义。static int b223; /static int b223; /* *定义了一个维的静定义了一个维的静态整型数组态整型数组* */ /float c23
18、22float c2322;/ /* *定义了一个维浮点型数组定义了一个维浮点型数组* */ / 在数组定义时,多维数组的维从左到右第一个在数组定义时,多维数组的维从左到右第一个称第称第一维,第二个一维,第二个称第二维,依此类推。多维数组元素的称第二维,依此类推。多维数组元素的顺序仍由下标决定。下标的变化是先变最右边的,再依顺序仍由下标决定。下标的变化是先变最右边的,再依次变化左边的下标。次变化左边的下标。 三维数组三维数组b b的的1212个元素是:个元素是:b000 b001 b002 b000 b001 b002 b010 b011 b012b010 b011 b012b100 b101
19、 b102 b100 b101 b102 b110 b111 b112b110 b111 b112下一页下一页 第7章 数组上一页上一页1.1.二维数组元素的引用形式:二维数组元素的引用形式: 数组名数组名 下标下标11下标下标22下标称第一维下标(或称行),下标称第二下标称第一维下标(或称行),下标称第二维下标(或称列)。下标从开始变化,其值分别小维下标(或称列)。下标从开始变化,其值分别小于数组定义中的常量表达式与常量表达式。于数组定义中的常量表达式与常量表达式。在二维数组中,一个元素的位置由其下标决定。在二维数组中,一个元素的位置由其下标决定。对对 float a43; float a4
20、3;其其1212个元素是:个元素是:第第 ( () )行:行:a00,a01,a02a00,a01,a02第第 ( () )行:行:a10,a11,a12a10,a11,a12第第 ( () )行:行:a20,a21,a22a20,a21,a22第第 ( () )行:行:a30,a31,a32a30,a31,a32下一页下一页 第7章 数组上一页上一页v二维数组的每一个元素都可以作一个变量来使用。二维数组的每一个元素都可以作一个变量来使用。如:如: printf(“%d”,a00);printf(“%d”,a00); scanf(%d,&a11); scanf(%d,&a11)
21、; a10+=a00+3a10+=a00+3* *a01; a01; v对二维数组的输入输出多使用二层循环结构来实对二维数组的输入输出多使用二层循环结构来实现。外层循环处理各行,循环控制变量现。外层循环处理各行,循环控制变量j j作为数组元作为数组元素的第一维下标;内层循环处理一行的各列元素,素的第一维下标;内层循环处理一行的各列元素,循环控制变量循环控制变量k k作为元素的第二维下标。作为元素的第二维下标。下一页下一页 第7章 数组上一页上一页例例7.4 7.4 二维数组输入输出二维数组输入输出mainint a23; printf(”nInput array a:”); for (j=0;
22、j2;j+) for (k=0;k3;k+) scanf(“%d”, &ajk);/*输入数据到二维数组中输入数据到二维数组中*/ printf(”nOutput array a:n”); for (j=0;j2;j+) for (k=0;k3;k+) /*循环三次,输出一行共三个元素循环三次,输出一行共三个元素*/ printf(“%4d”,ajk); printf(“n”); /*输出一行后换行,再输出下一行输出一行后换行,再输出下一行*/ 输入:输入:Input array a:1 2 3 4 5 6 输出:输出:Output array a: 1 2 3 4 5 6下一页下一页
23、 第7章 数组上一页上一页 7.2.3 7.2.3 二维数组的存储结构二维数组的存储结构a00 a01a02a10a11a12第第行行第第行行第行第行B00b01b10b11b20b21第行第行第行第行系统为数组在内系统为数组在内存中分配一片连存中分配一片连续的内存空间,续的内存空间,将二维数组元素将二维数组元素按行的顺序存储按行的顺序存储在所分配的内存在所分配的内存区域。区域。数组数组a a与与b b的各元的各元素的存储顺序如素的存储顺序如右图所示右图所示 下一页下一页 第7章 数组上一页上一页设有定义设有定义 int a23; float b32;int a23; float b32;例例
24、7.5 7.5 从键盘上输入从键盘上输入9 9个整数,保存在二维数组中按个整数,保存在二维数组中按数组原来位置输出第一行和第一列的所有元素。数组原来位置输出第一行和第一列的所有元素。 第第0行行第第1行行第第2行行 0列列列列列列分析分析:1、输入数组。、输入数组。2、输出数组时要考虑不是所有、输出数组时要考虑不是所有数据都输出。数据都输出。思考思考:应该输出的数据在位置关系上有何特点?(关:应该输出的数据在位置关系上有何特点?(关键!)键!)下一页下一页 第7章 数组上一页上一页#include #include main()main() int i,j,a33; int i,j,a33;
25、for(i=for(i= 0;i3;i+) /0;i3;i+) /* *输入数组输入数组* */ /for(j=0;j3;j+)for(j=0;j3;j+) printf(a printf(a%d%d%d%d=,i,j);=,i,j); scanf(“%d”,&aij scanf(“%d”,&aij); ; for(i=0;i3;i+) /for(i=0;i3;i+) /* *输出数组输出数组* */ / for (j=0;j3;j+)for (j=0;j3;j+)if(i=1|j=1) printf(%-6d,aij);else printf(%-6c, ); printf(
26、“n”); 运运行行结结果果下一页下一页 第7章 数组上一页上一页 分行给二维数组赋初值,每个花括号内的数据对应分行给二维数组赋初值,每个花括号内的数据对应一行元素。例:一行元素。例:int a23=1,2,3,2,3,4;int a23=1,2,3,2,3,4; 将所有初值写在一个花括号内,顺序给各元素赋值。将所有初值写在一个花括号内,顺序给各元素赋值。 例:例:int a23=1,2,3,2,3,4;int a23=1,2,3,2,3,4;只对部分元素赋值,没有初值对应的元素赋只对部分元素赋值,没有初值对应的元素赋0 0值或空值或空字符(字符数组)。字符(字符数组)。 例:例:int a2
27、3=1,2,4;int a23=1,2,4;给全部元素赋初值或分行初始化时,可不指定第一给全部元素赋初值或分行初始化时,可不指定第一维大小,其大小系统可根据初值数目与列数(第二维大小,其大小系统可根据初值数目与列数(第二维)自动确定;但维)自动确定;但必须指定第二维的大小。必须指定第二维的大小。例:例:int a3=1,2,3,4,5,6;int a3=1,2,3,4,5,6;int a3=0,0,5;int a3=0,0,5;第一维的大第一维的大小为多少?小为多少? 第7章 数组1 12 23 31 14 47 74 45 56 62 25 58 87 78 89 93 36 69 9主对角
28、线主对角线下一页下一页 第7章 数组上一页上一页1 12 23 31 14 47 74 45 56 62 25 58 87 78 89 93 36 69 9转置矩阵:是将原矩阵元素按行列互换形成的矩阵转置矩阵:是将原矩阵元素按行列互换形成的矩阵例例7.6 7.6 用如下的用如下的3 33 3矩阵初始化数组矩阵初始化数组a33,a33,求求矩阵的转置矩阵。矩阵的转置矩阵。1 1:转置矩阵是将原矩阵元素按行列互换形成的。:转置矩阵是将原矩阵元素按行列互换形成的。:沿主对角线将对称位置元素互换即可。:沿主对角线将对称位置元素互换即可。程序如下:程序如下:#include #include main(
29、)main()int j,k;int j,k; int a33=1,2,3,4,5,6,7,8,9,b33; int a33=1,2,3,4,5,6,7,8,9,b33; for (j=0;j3;j+) for (j=0;j3;j+)for(k=0;k3;k+) bfor(k=0;k3;k+) bj jk k=a=ak kj j; for(j=0;j3;j+) for(j=0;j3;j+)for(k=0;k3;k+)for(k=0;k3;k+)printf(“%6d”,bjk);printf(“%6d”,bjk); printf(“n”); printf(“n”); 第7章 数组上一页上一页返
30、回 1.1.利用数组求利用数组求fiboncacifiboncaci数列的前数列的前n n项项例例7.7 7.7 求求fiboncacifiboncaci数列的前数列的前2020项:项: f f0 0=1=1 f f1 1=1=1 f fi i=f=fi-1i-1+f+fi-2i-2 (i=2, 3,n) (i=2, 3,n)将前将前2020项输出到屏幕上,每行五项。项输出到屏幕上,每行五项。分析:分析:根据这个数列的组成规律:从第三项开始,每个根据这个数列的组成规律:从第三项开始,每个数据项的值为前两个数据项的和,采用递推方法来实现。数据项的值为前两个数据项的和,采用递推方法来实现。可以用一
31、个一维整型数组可以用一个一维整型数组fib 20来保存这个数列的前来保存这个数列的前20项。项。下一页下一页 第7章 数组上一页上一页#include #include main() int i,fib20;fib0=1;fib1=1;for(i=2; i=19;i+) fibi= fibi-1+ fibi-2;printf( Fibonaci Numbers are:n);for(i=0;i20;i+) if(i%5=0)printf(n); printf(%7d,fibi); getch();Fibonaci Numbers are: 1 1 2 3 5 8 13 21 34 55 89
32、144 233 377 610 987 1597 2584 4181 6765下一页下一页 第7章 数组上一页上一页2.2.利用数组处理批量数据利用数组处理批量数据例例7.8 7.8 从键盘上输入若干学生(不超过从键盘上输入若干学生(不超过100100人)的成人)的成绩,计算平均成绩,并输出高于平均分的人数及成绩。绩,计算平均成绩,并输出高于平均分的人数及成绩。输入成绩为负时结束。输入成绩为负时结束。 分析:分析:根据题意,可以定义一个有根据题意,可以定义一个有100100个元素的一维数组个元素的一维数组scorescore,先将成绩输入到数组中,并计算平均成绩。,先将成绩输入到数组中,并计算
33、平均成绩。然后,将数组中的成绩值一个个与平均值比较,输然后,将数组中的成绩值一个个与平均值比较,输出高于平均分的成绩。出高于平均分的成绩。 下一页下一页 第7章 数组上一页上一页点击点击查看程序请查看程序请基本思想基本思想:(1)从第个位置到第个位置中选择出)从第个位置到第个位置中选择出 最小的一个最小的一个与第个位置的数交换。与第个位置的数交换。(2)从第个位置到第个位置中选择出最小的一个)从第个位置到第个位置中选择出最小的一个与第个位置的数交换。与第个位置的数交换。 (9) 从第个位置到第个位置中选择出最小的一个从第个位置到第个位置中选择出最小的一个与第个位置的数交换。与第个位置的数交换。
34、下一页下一页 第7章 数组上一页上一页 下一页下一页 第7章 数组上一页上一页#include main()int I,j,t,a10;for(I=0;I10;I+) scanf(“%d”,&aI);/*输数据到数组输数据到数组*/内循环:在内循环:在(I,10)内选内选择最小数择最小数外循环:外循环:控制选择控制选择的次数的次数for(I=0;I9;I+)for(j=I+1;jaj)t=aI;aI=aj;aj=t;printf(“n”);for(I=0;I10;I+)printf(“%6d”,aI);/*输出排序后的数输出排序后的数据据*/下一页下一页 第7章 数组上一页上一页从程序
35、可知:从程序可知:1.程序使用两重循环来实现排序。程序使用两重循环来实现排序。2.外循环控制排序趟数。若数组有外循环控制排序趟数。若数组有N个元素,则共进个元素,则共进行行N-1趟排序。第一趟,趟排序。第一趟,I=;第二趟,;第二趟,I=,3.内循环完成在内循环完成在I,的区间内选择最小数。比较次的区间内选择最小数。比较次数随趟数增大而减少。数随趟数增大而减少。4.在每一趟选择中,当后面元素较小时,马上进行交在每一趟选择中,当后面元素较小时,马上进行交换。而这种交换是不必要的。事实上,换。而这种交换是不必要的。事实上,只要记住只要记住较小元素的位置,即下标,在内循结束后做一次较小元素的位置,即
36、下标,在内循结束后做一次交换即可交换即可,这样可大大节省程序运行时间。,这样可大大节省程序运行时间。下一页下一页 第7章 数组上一页上一页改进排序过程如下:改进排序过程如下: 下一页下一页 第7章 数组上一页上一页#include #include main()main()int I,j,k,a10;int I,j,k,a10;for(I=0;I10;I+) scanf(“%d”,&aI);for(I=0;I10;I+) scanf(“%d”,&aI);for(I=0;I9;I+)for(I=0;I9;I+) k=I;k=I; for(j=I+1;j10;j+) for(j=I
37、+1;jaj)if(akaj)k=j;k=j; if( if(k!=Ik!=I)t=aI;aI=ak;ak=t;)t=aI;aI=ak;ak=t; printf(“n”);printf(“n”);for(I=0;I10;I+)printf(“%6d”,aI);for(I=0;I10;I+)printf(“%6d”,aI); 内循环内循环外循环外循环K是最小元是最小元素之下标素之下标下一页下一页 第7章 数组上一页上一页4.4.利用数组进行数据查找利用数组进行数据查找-折半查找法介绍折半查找法介绍适应情况适应情况:在一批:在一批 数据中查找某数数据中查找某数基本思想基本思想:选定这批数中居中间位
38、置的一个数与所查:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数半,从而较快地找到目的数 例例7.107.10 假设在数组假设在数组a a中的数据是按由小到大顺序排列中的数据是按由小到大顺序排列的:的:-12 0
39、6 16 23 56 80 -12 0 6 16 23 56 80 100 110 115100 110 115,从键盘上输入一个数,判定该,从键盘上输入一个数,判定该数是否在数组中,若在,输出所在序号;若不在,输数是否在数组中,若在,输出所在序号;若不在,输出相应信息。出相应信息。下一页下一页 第7章 数组上一页上一页查找过程如下:查找过程如下: 第一步:设第一步:设lowlow、midmid和和highhigh三个变量,分别指示数列中的三个变量,分别指示数列中的起始元素、中间元素与最后一个元素位置起始元素、中间元素与最后一个元素位置, , 其初始值为其初始值为low=0,high=9,mi
40、d=4low=0,high=9,mid=4,判断,判断midmid指示的数是否为所求,指示的数是否为所求,midmid指示的数是指示的数是2323,不是要找的,不是要找的8080,须继续进行查找。,须继续进行查找。 -12 0 6 16 23 56 80 100 110 115 -12 0 6 16 23 56 80 100 110 115 lowlow midmid highhigh下一页下一页 第7章 数组上一页上一页第二步:确定新的查找区间。因为第二步:确定新的查找区间。因为8080大于大于2323,所以查找范围可,所以查找范围可以缩小为以缩小为2323后面的数,新的查找区间为后面的数,
41、新的查找区间为56 80 100 56 80 100 110 115 110 115 ,low,mid,highlow,mid,high分别指向新区间的开始、中间与分别指向新区间的开始、中间与最后一个数。实际上最后一个数。实际上highhigh不变,将不变,将lowlow(low=mid+1low=mid+1)指向)指向56,mid 56,mid (mid=(low+high)/2mid=(low+high)/2)指向)指向100,100,还不是要找的还不是要找的8080,仍须,仍须继续查找。继续查找。-12 0 6 16 23 56 80 100 110 115 -12 0 6 16 23
42、56 80 100 110 115 lowlow midmid highhigh继续查找:继续查找:第四步:根据上一步的结果,第四步:根据上一步的结果,80大于大于mid指示的数指示的数56,可确,可确定新的查找区间为定新的查找区间为80,此时,此时,low与与high都指向都指向80,mid亦亦指向指向80,即找到了,即找到了80,到此为止,查找过程完成。,到此为止,查找过程完成。-12 0 6 16 23 56 80 100 110 115 low mid high下一页下一页 第7章 数组上一页上一页第三步:上一步中,所找数第三步:上一步中,所找数80比比mid指示的指示的100小,可知
43、新小,可知新的查找区间为的查找区间为56 80,low不变,不变,mid与与high的值作相应修的值作相应修改。改。mid指示的数为指示的数为56,还要继续查找。,还要继续查找。-12 0 6 16 23 56 80 100 110 115 low high mid程序为:程序为:#define M 10#includemain()static int aM=-12,0,6,16,23,56,80,100,110,115; int n,low,mid,high,found; low=0; high=M-1; found=0; printf(Input a number to be search
44、ed:); scanf(%d,&n); 若在查找过程中,出现若在查找过程中,出现lowhighlowhigh的情况,则说明,的情况,则说明,序列中没有该数,亦结束查找过程。序列中没有该数,亦结束查找过程。 下一页下一页 第7章 数组上一页上一页while(lowamid) low=mid+1; else high=mid-1; if (found=1) printf(The index of %d is %d,n,mid); else printf(There is not %d,n); 输入:输入:8080输出:输出:The index of 80 is 6The index of
45、80 is 6 第7章 数组上一页上一页返回7.4 7.4 字符数组与字符串字符数组与字符串7.4.1 字符数组的定义与初始化字符数组的定义与初始化1. 1. 字符数组的定义字符数组的定义字符数组:其元素类型为字符类型的数组,其定义与字符数组:其元素类型为字符类型的数组,其定义与前面介绍的数组定义相同。前面介绍的数组定义相同。例如:例如: char str40; char str40; 定义一个有定义一个有4040个元素的字符数组个元素的字符数组, ,每个元素相当于每个元素相当于一个字符变量。一个字符变量。下一页下一页 第7章 数组上一页上一页2. 2. 字符数组的初始化字符数组的初始化方法:
46、将字符常量以逗号分隔写在花括号中方法:将字符常量以逗号分隔写在花括号中 在定义字符数组时进行初始化在定义字符数组时进行初始化char char ch7=s,t,u,d,e,ch7=s,t,u,d,e,n,t;n,t;在对全部元素指定初值时,可省写数组长度。在对全部元素指定初值时,可省写数组长度。 char char ch=s,t,u,d,e,n,ch=s,t,u,d,e,n,t;t;下一页下一页 第7章 数组上一页上一页7.4.2 7.4.2 字符串的概念及存储字符串的概念及存储1.1.字符串的概念字符串的概念字符串:字符串: 若干有效字符的序列;若干有效字符的序列; 可包含转义字符、可包含转
47、义字符、ASCASC码表中的字符;码表中的字符;形式为:形式为: 用双引号括起来的字符序列;用双引号括起来的字符序列; 例:例:I am a student. I am a student. , Hello Hello a5=; a5=; fnfn。 字符串的结束标志:字符串的结束标志:00。注:注:C C语言无字符串类型,字符串是存放在字符数组语言无字符串类型,字符串是存放在字符数组中的。中的。下一页下一页 第7章 数组上一页上一页2. 2. 用字符串来直接初始化字符数组用字符串来直接初始化字符数组可直接把字符串写在花括号中来初始化字符数组可直接把字符串写在花括号中来初始化字符数组如:如:c
48、har chchar ch=“student”;=“student”;s t u d e n t 0 系统将双撇号括起来的字符依次赋给字符数组的系统将双撇号括起来的字符依次赋给字符数组的各个元各个元 素,素, 并自动在末尾补上字符串结束标志字并自动在末尾补上字符串结束标志字符符00。下一页下一页 第7章 数组上一页上一页()字符串结束标志()字符串结束标志00仅用于判断字符串是否仅用于判断字符串是否结束,输出字符串时不会输出。结束,输出字符串时不会输出。()在对有确定大小的字符数组用字符串初始化()在对有确定大小的字符数组用字符串初始化时,数组长度应大于字符串长度。如:时,数组长度应大于字符串
49、长度。如: char char s7=student;s7=student;是错误的是错误的. .( ()在初始化一个一维字符数组时,可以省略花括)在初始化一个一维字符数组时,可以省略花括号。如号。如: char s8=student;: char s8=student;( 4 ( 4 )不能直接将字符串赋值给字符数组。下面的)不能直接将字符串赋值给字符数组。下面的操作是错误的。操作是错误的。 s=”student”;s=”student”;下一页下一页 第7章 数组上一页上一页说明说明7.4.3 7.4.3 字符串的输入输出字符串的输入输出1.1.字符串的输出方法字符串的输出方法(1 1)用
50、)用printfprintf函数函数用用printfprintf输出字符串时,要用格式符输出字符串时,要用格式符“%s”,“%s”,输输出时从数组的第一个字符开始逐个字符输出,直出时从数组的第一个字符开始逐个字符输出,直到遇到第一个到遇到第一个00为止。为止。例:例: char st15=“I am a boy!”char st15=“I am a boy!” printf(“st=%s,%c,%c”,st,st3,st7); printf(“st=%s,%c,%c”,st,st3,st7);输出结果:输出结果: I am a boy!mbI am a boy!mb下一页下一页 第7章 数组上
51、一页上一页例例7.117.11 字符串输出示例字符串输出示例#include#includemain()main() static char str20=”How do you do ?”; static char str20=”How do you do ?”; int k; int k; printf(“%s”,str); / printf(“%s”,str); /* *输出输出strstr中的字符串中的字符串* */ / for (k=0;strk!=0;k+) for (k=0;strk!=0;k+) printf(“%c”,strk); / printf(“%c”,strk); /*
52、 *一个一个地输出字符一个一个地输出字符* */ / 输出结果为:输出结果为:How do you do How do you do ?How do you do ?How do you do ? 使用使用printfprintf()函数的()函数的“%s”%s”格式符来输出字符串,格式符来输出字符串,从数组的第一个字符开始逐个输出,直到遇到第一个从数组的第一个字符开始逐个输出,直到遇到第一个00为止。使用为止。使用”%c”%c”格式时,用循环实现每个元格式时,用循环实现每个元素的输出。素的输出。下一页下一页 第7章 数组上一页上一页(2 2)用)用putsputs函数输出字符串函数输出字符串
53、函数原型:函数原型:int put(char int put(char * * str); str); 调用格式:调用格式:puts(str);puts(str); 函数功能:将字符数组函数功能:将字符数组strstr中包含的字符串或中包含的字符串或strstr所所指示的字符串输出,同时将指示的字符串输出,同时将00转换成换行符。转换成换行符。例例: char ch=student; puts(ch); char ch=student; puts(ch); puts(Hello)puts(Hello); ; 将字符数组中包含的字符串输出,然后再输出一个将字符数组中包含的字符串输出,然后再输出一
54、个换行符。因此,用换行符。因此,用puts()puts()输出一行,不必另加换行符输出一行,不必另加换行符nn。下一页下一页 第7章 数组上一页上一页 函数函数putsputs每次只能输出一个字符串,而每次只能输出一个字符串,而printfprintf可可以输出几个:以输出几个:printf(%s%s,str1,str2);printf(%s%s,str1,str2);2. 2. 字符串的输入字符串的输入(1 1)使用)使用scanfscanf函数输入字符串函数输入字符串例:例:char st15;char st15; sacnf(“%s”,st); sacnf(“%s”,st);但:但:sc
55、anf(“%s”,&st);scanf(“%s”,&st);是错误的;是错误的; 因为因为stst就代表了该字符数组的首地址。就代表了该字符数组的首地址。注:输入时,以注:输入时,以回车回车或或空格空格作为结束标志;作为结束标志;即:用即:用scanfscanf输入的字符串中不能含有空格。输入的字符串中不能含有空格。若按如下方法输入:若按如下方法输入: How do you do? 执行语句执行语句 : scanf(%s,st) ; 则则s 的内容为的内容为: How0 使用格式字符串使用格式字符串%s%s时会自动加上结束标志时会自动加上结束标志00。第。第一个空格后的字符没有
56、输入一个空格后的字符没有输入st st中。中。下一页下一页 第7章 数组上一页上一页(2)使用函数)使用函数gets()输入字符输入字符函数原型:函数原型:char char * *gets(char gets(char * *str); str); 调用格式:调用格式:gets(str);strgets(str);str是一个字符数组或指针。是一个字符数组或指针。函数功能:从键盘读入一个字符串到函数功能:从键盘读入一个字符串到strstr中,并自动中,并自动在末尾加字符串在末尾加字符串 结束标志符结束标志符00。输入字符串时以回车结束输入,这种方式可以读入输入字符串时以回车结束输入,这种方式
57、可以读入含空格符的字符串。含空格符的字符串。如:如: char s14; gets(s);若输入的字符串为:若输入的字符串为: How do you do? 则则s 的内容为的内容为: How do you do?0下一页下一页 第7章 数组上一页上一页例例7.12 7.12 字符串输入输出示例字符串输入输出示例#include main()char s20,s120; scanf(“%s”,s); printf(“%sn”,s); scanf(“%s%s”,s,s1); printf(“s=%s,s1=%s”,s,s1); puts(“n”); gets(s); puts(s);程序运行过程
58、程序运行过程:How do you do? HowHow do you do? s=How,s1=doHow do you do? How do you do?下一页下一页 第7章 数组上一页上一页7.4.4 7.4.4 字符处理函数字符处理函数语言库函数中除了前面用到的库函数语言库函数中除了前面用到的库函数gets()gets()与与puts()puts()之外,还提供了一些常用的库函数,其函数之外,还提供了一些常用的库函数,其函数原型说明在原型说明在string.hstring.h中中1. 1. 字符串拷贝函数:字符串拷贝函数:strcpy()strcpy()调用格式:调用格式:strcp
59、y(d_str,s_str);strcpy(d_str,s_str);功功 能:将源字符串能:将源字符串s_strs_str复制到目标字符数复制到目标字符数组组d_strd_str中。中。说说 明:明:d_strd_str的的长度长度应不小于应不小于s_strs_str的长的长度度,d_str,d_str必须写成数组名形式。必须写成数组名形式。s_strs_str可以是可以是字符串字符串常量常量或或字符数组名字符数组名形式。形式。下一页下一页 第7章 数组上一页上一页例:例: char s110,s28=“student”,s36;char s110,s28=“student”,s36; st
60、rcpy(s1,s2); strcpy(s3,okey); strcpy(s1,s2); strcpy(s3,okey);将将s2s2中的中的studentstudent赋给赋给s1(s1(连同结束标志连同结束标志00), , okeyokey赋给赋给s3;s2s3;s2的值不变。的值不变。注意:不能直接使用赋值语句来实现拷贝或赋值。注意:不能直接使用赋值语句来实现拷贝或赋值。如:如: s1=s2; s1=“student”s1=s2; s1=“student”;都是不允许的;都是不允许的下一页下一页 第7章 数组上一页上一页2.2.字符串连接函数字符串连接函数strcat()strcat()调用格式:调用格式:strcat(d_str,s_str);strcat(d_str,s_st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 气罐产权转移协议书
- 老人赡养继承协议书
- 家具代工协议书范本
- 天灾救援协议书范本
- 无偿挂名房屋协议书
- 景区游乐项目协议书
- 铁路公安签约协议书
- 学校整体托管协议书
- 门面装修承包协议书
- 要求儿子赔偿协议书
- GB/T 18655-2025车辆、船和内燃机无线电骚扰特性用于保护车载接收机的限值和测量方法
- 吉林省吉林市2024-2025学年高三下学期3月三模试题 生物 含答案
- 辽宁省协作校2024-2025学年度下学期高三第一次模拟考试语文+答案
- 2025年03月中央社会工作部所属事业单位公开招聘11人笔试历年参考题库考点剖析附解题思路及答案详解
- DZ∕T 0130-2006 地质矿产实验室测试质量管理规范(正式版)
- 《新疆大学版学术期刊目录》(人文社科)
- 小班语言绘本《小蛇散步》绘本PPT
- 门诊特定病种待遇认定申请表
- 文化遗产学概论:第七讲 遗产的完整性问题
- 装修项目技术标(范本)
- 二手车营销策划方案
评论
0/150
提交评论