《第六章_数组-精品文档资料整理.ppt》由会员分享,可在线阅读,更多相关《第六章_数组-精品文档资料整理.ppt(97页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第一节第一节 数组的基本概念数组的基本概念 第二节第二节 一维数组一维数组 第三节第三节 二维数组二维数组 第四节第四节 字符数组字符数组 第五节第五节 应用实例应用实例C C中定义了在基本数据类型基础中定义了在基本数据类型基础上的构造数据类型上的构造数据类型(数组,结(数组,结构体,共用体等)构体,共用体等)变量先定义,再使用,如果变量个数少,且彼此独立变量先定义,再使用,如果变量个数少,且彼此独立时,可以时,可以 int a,b,c;a=5;b=10;c=23;printf(“%d,%d,%d”,a,b,c);当变量个数比较多,并且有内在的关系时,例如当变量个数比较多,并且有内在的关系时
2、,例如 :全班有:全班有3030个人,每人一个成绩个人,每人一个成绩 定义定义intint a1,a2,a1,a2,a30?a30?一组有序数据的集合一组有序数据的集合,各个元素属于同一个各个元素属于同一个类型类型,用统一的名称标用统一的名称标识这一组数识这一组数,用下标唯用下标唯一地确定这组数中的一地确定这组数中的每一个值。每一个值。6 1 数组的基本概念数组的基本概念数组的三要素数组的三要素数组是有限个相同的数据类数组是有限个相同的数据类型的数据分量的有序集合型的数据分量的有序集合相同的数据类型(定义数组时规定)相同的数据类型(定义数组时规定)有限的成员个数有限的成员个数(定义数组时规定)
3、(定义数组时规定)彼此有序的排列彼此有序的排列(引用数组元素时的下标)(引用数组元素时的下标)int a5;a0=1;a1=2;.62 一维数组的定义和使用一维数组的定义和使用 一一、一维数组的定义、一维数组的定义格式:格式:类型类型 标识符标识符 长度长度 所有元素为所有元素为同一类型同一类型变量名,变量名,即数组名即数组名数组中所含数组中所含元素的个数元素的个数int a10;由由10个整数组成的个整数组成的数组,共同拥有数组名数组,共同拥有数组名a(2)数组长度必须是)数组长度必须是整型量,整型量,可以用可以用常量表达式常量表达式int a2*3;说明:说明:(1)用方括号)用方括号(3
4、)不能不定义长度,也不能做动态定义)不能不定义长度,也不能做动态定义int an,n=10;62 一维数组的定义和使用一维数组的定义和使用 二二、一维数组元素的引用、一维数组元素的引用原则原则(1)数组必须先定义,再使用)数组必须先定义,再使用(2)数组中的元素必须逐一引用)数组中的元素必须逐一引用方法:方法:通过数组名及其元素的下标逐一引用通过数组名及其元素的下标逐一引用定义时定义时 类型类型 数组名数组名N引用时引用时 数组名数组名下标下标下标范围从下标范围从 0 到到 N-1 a0,a1,a9为数组为数组a中的所有元素中的所有元素6 2 一维数组的定义和使用一维数组的定义和使用 int
5、a10下标表示了元素在数组中的位置,可下标表示了元素在数组中的位置,可以是以是整型常量整型常量或或整型表达式整型表达式。如如 a2*3相当于相当于a6说明说明(数组中第?个元素)数组中第?个元素)三、三、一维数组的初始化一维数组的初始化 变量在使用之前使其有值变量在使用之前使其有值如果没如果没有初值?有初值?数组初始化的方法数组初始化的方法int a4可以对可以对静态静态或或外部外部存贮类存贮类型的数组进行初始化。型的数组进行初始化。6 2 一维数组的定义和使用一维数组的定义和使用 下标表示了元素在数组中的位置,可以是下标表示了元素在数组中的位置,可以是整型常量整型常量或或整型表达式整型表达式
6、。如:如:a6 a2*3 ai ai+j说明说明6 2 一维数组的定义和使用一维数组的定义和使用 练习:假定已经将数分配给以下变量:写出以下数组分量(下标变量的值):x3=x6=xa*a1=xa+a1=xc=xxa+c-a1=xxa1-xa+c-a*c=xa1-a-b=1866769818985lmain()l int i,a5;l for(i=0;i=0;i-)l printf(“%d,”,ai);l 运行结果:运行结果:5,4,3,2,1仔细观察:看运行结果有没有错误?仔细观察:看运行结果有没有错误?main()int i,a5;for(i=0;i=0;i-)printf(“%d,”,ai
7、);运行结果运行结果:4,3,2,1,0例题例题1:假设有如下数据:假设有如下数据:10,11,6,15,21,6 要求用数组类型写一程序按下列顺序输出:要求用数组类型写一程序按下列顺序输出:6,21,15,6,11,10分析:将数据的顺序倒过来分析:将数据的顺序倒过来main()int i,a6;for(i=0;i=0;i-)printf(“%d”,ai);思考?1、任意N个数呢?2、若每行输出5个数?如何修改程序?printf(%d,ai);if (i%5=0)printf(n);数据类型数据类型 数组名数组名 常量表达式常量表达式 初始化数据;初始化数据;在数组说明的同时进行初始化的一般
8、形式为:在数组说明的同时进行初始化的一般形式为:1.定义数组时,对全部元素赋值定义数组时,对全部元素赋值 int a5=1,2,3,4,5;用用 包括所有初值,包括所有初值,用逗号分隔各数值用逗号分隔各数值2 对部分元素赋值对部分元素赋值 按顺序给前按顺序给前2个元素赋值个元素赋值float x5=1.9,2.0;float x5=1.9,2.0;x0=1.9x0=1.9;x1=2.0 x1=2.0;其余元素为其余元素为 若要对数组的全部元素初始化,则可省略数组说明中的大小。若要对数组的全部元素初始化,则可省略数组说明中的大小。intint a =1,2,3,4;a =1,2,3,4;6 2
9、一维数组的定义和使用一维数组的定义和使用 要求要求*初值的个数不能超过定义的数组长度初值的个数不能超过定义的数组长度 int i,a10=1,2,3,4,5,6,7,8,9,10;for(i=0;i10;i+)printf(“%d,”,ai);运行结果:运行结果:1,2,3,4,5,6,7,8,9,10,6 2 一维数组的定义和使用一维数组的定义和使用 有一个数组有一个数组,内有内有10个数个数,求出最小的数和它的下求出最小的数和它的下标标,然后将它与数组中的第一个数对换。然后将它与数组中的第一个数对换。71332668153206512int a10a0a i a97133168265320
10、6512定义两个临时变量定义两个临时变量 min和和 k假定第一个元素就是最小的假定第一个元素就是最小的,min=a0,k=0思思路路用用min与数组中的每一个元素与数组中的每一个元素ai比较比较,若若ai比比min小小,将将ai赋给赋给min,将下标将下标i赋给赋给k,否则否则,继续比较继续比较.6 2 一维数组的定义和使用一维数组的定义和使用 2671332668153206512min=a0i=1i=2i=3i=4i=5i=6i=7i=8i=91326 min=a1 k=133 min和和k的值不变的值不变133203 min和和k的值不变的值不变11 min和和k的值不变的值不变1mi
11、n531 min和和k的值不变的值不变 121 min和和k的值不变的值不变651 min和和k的值不变的值不变min=1min=1k=5k=5ak=a0a0=min713316826532065126 2 一维数组的定义和使用一维数组的定义和使用 main()int i,a10,min,k;for(i=0;i10;i+)scanf(“%d”,&ai);min=a0;for(i=1;iai)min=ai;k=i;ak=a0;a0=min;for(i=0;i10;i+)printf(“%4d”,ai);printf(“%d,%d”,k,min);循环输入循环输入10个数个数循环找出最小的循环找出
12、最小的交换数据交换数据输出数组输出数组输出最小值和原始下标输出最小值和原始下标 C语言程序设计 第七章第七章 数组数组例例 用起泡法对用起泡法对10个数排序(由小到大)个数排序(由小到大)排序过程:排序过程:排序过程:排序过程:(1 1)比较第一个数与第二个数,若)比较第一个数与第二个数,若)比较第一个数与第二个数,若)比较第一个数与第二个数,若a0a1a0a1,则交换;然后比较第二则交换;然后比较第二则交换;然后比较第二则交换;然后比较第二 个数与第三个数;依次类推,直至第个数与第三个数;依次类推,直至第个数与第三个数;依次类推,直至第个数与第三个数;依次类推,直至第n-1n-1个数和第个数
13、和第个数和第个数和第n n个数比较为止个数比较为止个数比较为止个数比较为止 第一趟起泡排序第一趟起泡排序第一趟起泡排序第一趟起泡排序,结果,结果,结果,结果最大最大最大最大的数被安置在最后一个元素位置上的数被安置在最后一个元素位置上的数被安置在最后一个元素位置上的数被安置在最后一个元素位置上(2 2)对前)对前)对前)对前n-1n-1个数进行第二趟冒泡排序,结果使个数进行第二趟冒泡排序,结果使个数进行第二趟冒泡排序,结果使个数进行第二趟冒泡排序,结果使次大次大次大次大的数被安置在第的数被安置在第的数被安置在第的数被安置在第n-1n-1 个元素位置个元素位置个元素位置个元素位置(3 3)重复上述
14、过程,共经过)重复上述过程,共经过)重复上述过程,共经过)重复上述过程,共经过n-1n-1趟冒泡排序后,排序结束趟冒泡排序后,排序结束趟冒泡排序后,排序结束趟冒泡排序后,排序结束9 8 8 8 8 8 8 9 5 5 5 5 5 5 9 4 4 4 4 4 4 9 2 2 2 2 2 2 9 0 0 0 0 0 0 98 5 5 5 5 5 8 4 4 4 4 4 8 2 2 2 2 2 8 0 0 0 0 0 85 4 4 4 4 5 2 2 2 2 5 0 0 0 0 54 2 2 2 02 4 0 0 0 42 00 2第一轮大数沉底第一轮大数沉底 第二轮第二轮 第三轮第三轮 第四轮第四
15、轮 第五轮第五轮 此处:此处:n=6 外层循环外层循环j(1n-1)次次 内层循环内层循环i(1n-j)次次 C语言程序设计 第七章第七章 数组数组输入输入n 个数给个数给a1 到到 anfor j=1 to n-1for i=1 to n-jaiai+1真真假假aiai+1输出输出a1 到到 an#include void main()int a10,i,j,t;printf(Input 10 numbers:n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(j=0;j9;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;pr
16、intf(The sorted numbers:n);for(i=0;i10;i+)printf(%d,ai);C语言程序设计 第七章第七章 数组数组例例 用简单选择法对用简单选择法对10个数排序个数排序排序过程:排序过程:排序过程:排序过程:(1 1)首先通过)首先通过)首先通过)首先通过n-1n-1次比较,从次比较,从次比较,从次比较,从n n个数中找出最小的,个数中找出最小的,个数中找出最小的,个数中找出最小的,将它与第一个数将它与第一个数将它与第一个数将它与第一个数 交换交换交换交换第一趟选择排序第一趟选择排序第一趟选择排序第一趟选择排序,结果,结果,结果,结果最小最小最小最小的数被安
17、置在第一个元素位置上的数被安置在第一个元素位置上的数被安置在第一个元素位置上的数被安置在第一个元素位置上(2 2)再通过)再通过)再通过)再通过n-2n-2次比较,从剩余的次比较,从剩余的次比较,从剩余的次比较,从剩余的n-1n-1个数中找出关键字个数中找出关键字个数中找出关键字个数中找出关键字次小次小次小次小的记录,的记录,的记录,的记录,将它与第二个数交换将它与第二个数交换将它与第二个数交换将它与第二个数交换第二趟选择排序第二趟选择排序第二趟选择排序第二趟选择排序(3 3)重复上述过程,共经过)重复上述过程,共经过)重复上述过程,共经过)重复上述过程,共经过n-1n-1趟排序后,排序结束趟
18、排序后,排序结束趟排序后,排序结束趟排序后,排序结束初始:初始:49 38 65 97 76 13 27 i=1一趟:一趟:13 38 65 97 76 49 27 i=2二趟:二趟:13 27 65 97 76 49 38 三趟:三趟:13 27 38 97 76 49 65 四趟:四趟:13 27 38 49 76 97 65 五趟:五趟:13 27 38 49 65 97 76 六趟:六趟:13 27 38 49 65 76 97 C语言程序设计 第七章第七章 数组数组输入输入n 个数给个数给a1 到到 anfor i=1 to n-1for j=i+1 to najak真真假假k=j输
19、出输出a1 到到 ank=iaiaki!=k真真假假#include void main()int a11,i,j,k,x;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,&ai);printf(n);for(i=1;i10;i+)k=i;for(j=i+1;j=10;j+)if(ajak)k=j;if(i!=k)x=ai;ai=ak;ak=x;printf(The sorted numbers:n);for(i=1;i11;i+)printf(%d,ai);6-3 二维数组的定义和引用二维数组的定义和引用当一个一维数组中的每个元素本身又是
20、一当一个一维数组中的每个元素本身又是一个一维数组时,该数组为一个二维数组个一维数组时,该数组为一个二维数组一、二维数组的定义一、二维数组的定义 1 格式:类型格式:类型 标识符标识符长度长度1长度长度22 二维数组元素需要两个下标表示二维数组元素需要两个下标表示例:例:int a34表示数组表示数组a中有中有3行行4列共列共12个数据个数据3 二维数组在存储空间中是按行优先存储二维数组在存储空间中是按行优先存储 int a34a00 a01 a02a23.a03第一行第一行最后一最后一个元素个元素 C语言程序设计 第七章第七章 数组数组元素个数元素个数元素个数元素个数=行数行数行数行数*列数列
21、数列数列数l数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快int a32a01a10a11a20a21014523a00a00 a01a10 a11a20 a21int c23401234567.20212223c000c001c002c003c010c011c012c013c020c021c022c023c100c101c102c103c110c111c112c113c120c121c122c123二二、二维数组的引用、二维数组的引用原则:原则:逐一引用逐一引用数组名数组名下标下标1下标下标2下标下标1 1从从0 0到长度到长度1-11-1下标下标2 2从
22、从0 0到长度到长度2-12-1方法:方法:int a42a00.a31共共8个数据个数据(对本例,决不可能有元素对本例,决不可能有元素a42)6-3 二维数组的定义和引用二维数组的定义和引用l分行初始化:例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化l按元素排列顺序初始化 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12120400部分初始化 例 int a3=1,4,5;a00 a01 a02 a10 a11 a12100450第一维长度省略初始化 例 int a23=1,2,3,4,5,6;a
23、00 a01 a02 a10 a11 a12123456全部初始化 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12124000部分初始化 例 int a3=1,2,3,4,5;a00 a01 a02 a10 a11 a12123450第一维长度省略初始化三、二维数组的初始化三、二维数组的初始化88年年90年年王王张张李李王王张张李李4 5 4 3 5 3 4 3 5 4 3 3 3 5 4 3 3 5 3 5 3 5 5 3 教学教学 科研科研 文体文体 其他其他用数组定义用数组定义 int a?a111=?6-3 二维数组的定义和引用二维数组的定义和引用若定义
24、若定义int a34,则对则对a的正确引用是:的正确引用是:A)a 2 4 B)a 1,3 C)a 1+1 0 D)a(2)(1)以下二维数组说明方式中正确的是:以下二维数组说明方式中正确的是:A)int a3;B)float a(3,4);C)double a14;D)float a(3)(4);引用引用假设二维数组假设二维数组a有有m列,则计算任一元素列,则计算任一元素aij在数中的位置的公式为:在数中的位置的公式为:i*m+j+1即即a00位于数组的第一个位置上位于数组的第一个位置上i*m+j+16-3 二维数组的定义和引用二维数组的定义和引用6-3 二维数组的定义和引用二维数组的定义和
25、引用例题:不用输入,自动生成下列矩阵例题:不用输入,自动生成下列矩阵1 2 3 4 51 1 6 7 81 1 1 9 101 1 1 1 111 1 1 1 1元素值为元素值为 1按按行行递递增增main()main()intint i,j,a55;i,j,a55;k=2;k=2;for(i=0;i5;i+)for(i=0;i5;i+)/*/*按行循环按行循环*/for(j=0;j5;j+)for(j=0;j5;j+)/*/*按按列循环列循环*/if(j=i)aij=1;if(j=i)aij=1;/*/*下下三角三角*/else aij=k+;else aij=k+;/*/*上上三角三角*/
26、for(i=0;i5;i+)for(i=0;i5;i+)for(j=0;j5;j+)for(j=0;j5;j+)printf(printf(“%4d%4d”,aij);,aij);printf(printf(“nn”););/*/*输输出一行后换行出一行后换行*/二维数组程序举例 C语言程序设计 第七章第七章 数组数组例例:将二维数组行列元素互换,存到另一个数组中将二维数组行列元素互换,存到另一个数组中a=1 2 34 5 6b=1 42 53 6main()int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i=1;i+)for
27、(j=0;j=2;j+)printf(%5d,ai j);b ji=ai j;printf(n);printf(array b:n);for(i=0;i=2;i+)for(j=0;jmax真真假假max=aijrow=icolum=j输出输出:max和和row,colum 1 2 3 4 9 8 7 6-10 20 -5 2#include void main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,row=0,colum=0,max;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum
28、=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);C语言程序设计 第七章第七章 数组数组例例2:读入下表中值到数组,分别求各行、各列及表中所有数之和读入下表中值到数组,分别求各行、各列及表中所有数之和12 4 615 7 9 8 23 3 2 5 1712 4 6 2215 7 9 31 8 23 3 34 2 5 17 2437 39 35 111一维和一维和 二维数组的应用二维数组的应用#include void main()int x54,i,j;for(i=0;i4;i+)for(j=0;j3;j+)scanf(%d,&xij);for(
29、i=0;i3;i+)x4i=0;for(j=0;j5;j+)xj3=0;for(i=0;i4;i+)for(j=0;j3;j+)xi3+=xij;x4j+=xij;x43+=xij;for(i=0;i5;i+)for(j=0;j4;j+)printf(%5dt,xij);printf(n);1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 2 2
30、2 2 2 0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 2 2 2 2 2一维和一维和 二维数组的应用二维数组的应用例例3:矩阵填数矩阵填数 main()int a1010,i,j;for(i=0;i10;i+)for(j=0;j10;j+)if(i5&j=5&j=5)aij=2;else aij=0;for(i=0;i10;i+)for(j=0;j10;j+)printf(%3d,aij);printf(n);6-4 字符数组的定义和引用字符数组的定义和引用用来存放字符数据的数组是字符数组。用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。字符数组中的一个元
31、素存放一个字符。字符数组字符数组字符数组字符数组一、字符数组的定义一、字符数组的定义定义方式与前面介绍的类似。定义方式与前面介绍的类似。例:例:char c10,d23;由于字符型与整型是互相通用由于字符型与整型是互相通用的,因此也可定义的,因此也可定义 int c10;二、字符数组的初始化二、字符数组的初始化与前面介绍的类似,只是数组与前面介绍的类似,只是数组的每一个元素对应一个字符。的每一个元素对应一个字符。char c10=I,a,m,h,a,p,p,y;static char c23=,*,*,*;字符数组的初始化l逐个字符赋值l用字符串常量 C语言程序设计 第七章第七章 数组数组 例
32、例 char ch5=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3ch4 例例 char ch4=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3ch4有问题!例例 char ch5=B,o,y;ch0Boy00逐个字符赋值逐个字符赋值ch1ch2ch3ch4 例例 char ch=H,e,l,l,o;ch0Hello逐个字符赋值逐个字符赋值ch1ch2ch3ch4 例例 char diamond5=,*,*,*,*,*,*,*,*;二维字符数组初始化二维字符数组初始化*00*0*0 *00diamond0diamond1diam
33、ond2diamond3diamond46-4 字符数组的定义和引用字符数组的定义和引用三、字符数组的引用三、字符数组的引用可以引用字符数组中的一可以引用字符数组中的一可以引用字符数组中的一可以引用字符数组中的一个元素,得到一个字符。个元素,得到一个字符。个元素,得到一个字符。个元素,得到一个字符。原则:原则:逐一引用逐一引用方法:方法:数组名数组名下标下标1下标下标2下标下标1 1从从0 0到长度到长度-1-1下标下标2 2从从0 0到长度到长度-1-1a00.a31共共8个数据个数据 C语言程序设计 第七章第七章 数组数组例例 输出一个字符串输出一个字符串#include void mai
34、n()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(%c,ci);printf(n);Iamaboy0123456789字符数组的引用例例例例2 2输出一个图形输出一个图形输出一个图形输出一个图形main()char a55,i,j;for(i=0;i5;i+)for(j=0;j5;j+)if(j=0|i=j)aij=*;else aij=;for(i=0;i5;i+)for(j=0;j5;j+)printf(%c,aij);printf(n);6-4 字符数组的定义和引用字符数组的定义和引用*C语言程序设计 第七章第七章 数组数组例例:
35、输出一个钻石图形输出一个钻石图形#include void main()char diamond 5=,*,*,*,*,*,*,*,*;int i,j;for(i=0;i5;i+)for(j=0;j5;j+)printf(%c,diamondij);printf(n);运行结果:运行结果:*四、字符串和字符串结束标志四、字符串和字符串结束标志 在在C C语言中,语言中,字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。同时,为了测定字符串的实际长度,在同时,为了测定字符串的实际长度,在C C语言规定了一个语言规定了一个“字字
36、字字符串结束标志符串结束标志符串结束标志符串结束标志”(字符字符00 ).如一个字符串第如一个字符串第1010个字符为个字符为00,则此字符串的有效字符为,则此字符串的有效字符为9 9个,即在遇到第一个字符个,即在遇到第一个字符00时,表示字符串结束,由它前面时,表示字符串结束,由它前面的字符组成字符串。的字符组成字符串。系统对字符串常量也自动加一个系统对字符串常量也自动加一个0 0 作为结束符,当然在作为结束符,当然在定义字符数组时应估计实际字符串长度。定义字符数组时应估计实际字符串长度。6-4 字符数组的定义和引用字符数组的定义和引用四、字符串和字符串结束标志四、字符串和字符串结束标志 在
37、在C C语言中,语言中,字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。字符串是作为字符数组来处理的。对字符数组对字符数组初始化初始化初始化初始化,可以用字符串常量来使字符数组初始化。,可以用字符串常量来使字符数组初始化。如:如:char c=“I am happy”;或或char c=“I am happy”;此时系统自动在串尾加此时系统自动在串尾加 0。等价于:等价于:char c=I,a,m,h,a,p,p,y,0;char c=I,a,m,h,a,p,p,y;6-4 字符数组的定义和引用字符数组的定义和引用如果有:如果有:char c10=“C
38、hina”;那么数组的实际情况是那么数组的实际情况是l注意:字符数组并不是要求最后一个字符必须为注意:字符数组并不是要求最后一个字符必须为0,甚至,甚至可以不包含可以不包含0,如如 char c=C,h,i,n,a;l因此,是否需要加因此,是否需要加 0,完全根据需要,完全根据需要l只是系统对字符串常量自动加了一个只是系统对字符串常量自动加了一个 0 ,因此,通常,为,因此,通常,为了处理方式一直,便于测定字符串的实际长度以及在程序中作了处理方式一直,便于测定字符串的实际长度以及在程序中作出相应处理,在字符数组也常常认为加上一个出相应处理,在字符数组也常常认为加上一个 0如如 char c=C
39、,h,i,n,a,0;China000006-4 字符数组的定义和引用字符数组的定义和引用l用字符串常量初始化字符数组 C语言程序设计 第七章第七章 数组数组 例例 char ch6=“Hello”;char ch6=“Hello”;char ch=“Hello”;用字符串常量用字符串常量ch0Helloch1ch2ch3ch40ch5 例例 char fruit7=”Apple”,”Orange”,”Grape”,”Pear”,”Peach”;二维字符数组初始化二维字符数组初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear00
40、0Peach00五、字符数组的输入输出五、字符数组的输入输出五、字符数组的输入输出五、字符数组的输入输出输入输出有两种方式:输入输出有两种方式:逐个字符输入输出。用逐个字符输入输出。用“%c”将整个字符串一次输入输出。用将整个字符串一次输入输出。用“%s”输出应注意的问题输出应注意的问题static char c=“china”;printf(“%s”,c);输出字符不包括结束符输出字符不包括结束符0用用“%s”格式输出字符时,格式输出字符时,printf函数中的输出项是字符函数中的输出项是字符数组名,而不是数组元素名。数组名,而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到如果数
41、组长度大于字符串实际长度,也只输出到0结结束束如果一个字符数组中包含一个以上如果一个字符数组中包含一个以上0,则遇到第一个,则遇到第一个0时输出就结束。时输出就结束。输入时应注意:输入时应注意:在使用在使用scanf函数时,若输入字符串,用函数时,若输入字符串,用“%s”格式,则后面格式,则后面跟数组名,且不带跟数组名,且不带“&”符号,数组名指向该数组的起始地址。符号,数组名指向该数组的起始地址。6-4 字符数组的定义和引用字符数组的定义和引用字符数组的输入输出l逐个字符I/O:%cl整个字符串I/O:%s C语言程序设计 第七章第七章 数组数组例例 用用%s void main()char
42、 str5;scanf(“%s”,str);printf(“%s”,str);用字符数组名用字符数组名,不要加不要加&输入串长度输入串长度数组维数数组维数遇空格或回车结束遇空格或回车结束自动加自动加0用字符数组名用字符数组名,遇遇0结束结束例例 用用%c void main()char str5;int i;for(i=0;i5;i+)scanf(“%c”,&stri);for(i=0;i5;i+)printf(“%c”,stri);输入:输入:China 输出:输出:China输入:输入:Program 输出:输出:Progr C语言程序设计 第七章第七章 数组数组 H o w 0 a r
43、e 0 y o u?0#include void main()char a15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);printf(a=%sn,a);运行情况:运行情况:输入:输入:How are you?输出:输出:a=How b=are c=you?输入:输入:How are you?输出:输出:a=Howscanfscanf中中中中%s s输入时输入时输入时输入时,遇空遇空遇空遇空格或回车结束格或回车结束格或回车结束格或回车结束运行情况:运行情况:输入:输入:How are you?C语言程
44、序设计 第七章第七章 数组数组例例 若准备将字符串若准备将字符串“This is a string.”记录下来,记录下来,错误错误的输入语句为:的输入语句为:(A)char s20;scanf(“%20s”,s);(B)for(k=0;k17;k+)sk=getchar();(C)while(c=getchar()!=n)sk+=c;(D)char a5,b5,c5,d10;scanf(“%s%s%s%s”,a,b,c,d);字符串处理函数字符串处理函数包含在头文件包含在头文件 string.h 中中l1、字符串输出函数、字符串输出函数 puts格式:格式:puts(字符数组)字符数组)功能:
45、向显示器输出一个字符串(输出完,换行)功能:向显示器输出一个字符串(输出完,换行)说明:字符数组必须以说明:字符数组必须以0结束。可以包含转义字符。结束。可以包含转义字符。输出时输出时0转换成转换成n,即输出字符后换行。即输出字符后换行。C语言程序设计 第七章第七章 数组数组例:例:#include void main()char a1 =“china nbeijing”;char a2 =“china 0beijing”;puts(a1);puts(a2);puts(“WUHAN”);运行结果:运行结果:china beijing china WUHAN这里是将这里是将这里是将这里是将 0
46、0 n n 因此光标移因此光标移因此光标移因此光标移 到下行到下行到下行到下行6-4 字符数组的定义和引用字符数组的定义和引用l2、字符串输入函数、字符串输入函数gets格式:格式:gets(字符数组字符数组)功能:从键盘输入一个以功能:从键盘输入一个以回车回车结束的字符串放入字符结束的字符串放入字符 数组中,并自动加数组中,并自动加0。说明:输入串长度应小于字符数组维数说明:输入串长度应小于字符数组维数 C语言程序设计 第七章第七章 数组数组例:例:gets和和scanf输入比较输入比较#include void main()char a115,a215;gets(a1);scanf(“%s
47、”,a2);printf(“a1=%s n”,a1);printf(“a2=%s n”,a2);输入:输入:china beijing china beijing 输出:输出:a1=china beijing a2=china在在在在scanfscanf 中遇中遇中遇中遇空格空格空格空格字符串便结束了,字符串便结束了,字符串便结束了,字符串便结束了,而而而而getsgets 中,却将中,却将中,却将中,却将空格空格空格空格 作为字符存作为字符存作为字符存作为字符存入字符型入字符型入字符型入字符型 数组中。数组中。数组中。数组中。注意:注意:注意:注意:puts和和gets函数只能输入输出函数只
48、能输入输出一个字符串。一个字符串。错错错错 puts(str1,str2)gets(str1,str2)l3、字符串连接函数、字符串连接函数strcat格式:格式:strcat(字符数组字符数组1,字符数组字符数组2)功能:把字符数组功能:把字符数组2连到字符数组连到字符数组1后面后面返值:返回字符数组返值:返回字符数组1的首地址的首地址说明:说明:字符数组字符数组1必须足够大必须足够大 连接前连接前,两串均以两串均以0结束结束;连接后连接后,串串1的的0取取 消消,新串最后加新串最后加0。C语言程序设计 第七章第七章 数组数组例:例:#include void main()char str1
49、30=“Peoples Republic of“;char str2=China”;printf(“%sn”,strcat(str1,str2);str1:Peoples Republic of 0str2:china0str1:Peoples Republic of china0strcpy(字符数组字符数组1,字符串,字符串2)它是它是“字符串拷贝函数字符串拷贝函数”,作用是将字符串,作用是将字符串2拷贝到数组拷贝到数组1中去。中去。说明:说明:字符数组字符数组1必须足够大,以便容纳被拷贝的字符串。必须足够大,以便容纳被拷贝的字符串。“字符数组字符数组1”必须写成数组名形式,必须写成数组名
50、形式,“字符串字符串2”可以是字符数组可以是字符数组名,也可以是一个字符串常量名,也可以是一个字符串常量 如:如:strcpy(str1,str);strcpy(str1,China);拷贝时连同字符串后面的拷贝时连同字符串后面的0一起拷贝到字符数组一起拷贝到字符数组1中中;不能用赋值语句将一个字符串常量或字符数组直接赋给一个字不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组符数组 如:如:str1=“China”为非法为非法;可以用可以用strcpy函数将字符串函数将字符串2中前面若干个字符拷贝到字符数组中前面若干个字符拷贝到字符数组1中去中去;strcpy(str1,str2,