大学C语言程序设计基础第6章课件.ppt

上传人(卖家):三亚风情 文档编号:3042293 上传时间:2022-06-25 格式:PPT 页数:65 大小:1.17MB
下载 相关 举报
大学C语言程序设计基础第6章课件.ppt_第1页
第1页 / 共65页
大学C语言程序设计基础第6章课件.ppt_第2页
第2页 / 共65页
大学C语言程序设计基础第6章课件.ppt_第3页
第3页 / 共65页
大学C语言程序设计基础第6章课件.ppt_第4页
第4页 / 共65页
大学C语言程序设计基础第6章课件.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、 第第6 6章章 数数 组组概述概述基本数据类型基本数据类型:如整型、实型、字符型。:如整型、实型、字符型。 这些数据又这些数据又表现为常量、变量表现为常量、变量。基本数据类型中的数据之间没有任。基本数据类型中的数据之间没有任何关联,也没有任何顺序。一堆无序的且没有任何关联的数据是很难处何关联,也没有任何顺序。一堆无序的且没有任何关联的数据是很难处理的。所以,需要把数据变量理的。所以,需要把数据变量有序地关联有序地关联起来。形成起来。形成构造类型构造类型。构造类型:构造类型:由基本数据型按照一定的规则构成一些复杂的数据类型由基本数据型按照一定的规则构成一些复杂的数据类型. . 如如数组、结构体

2、、共同体数组、结构体、共同体等。等。数组定义:数组定义: 有序数据(有序数据(变量变量)的集合。)的集合。 数组中的每一个元素都属于数组中的每一个元素都属于同一数据类型;同一数据类型; 数组元素用一个统一的数组元素用一个统一的数组名和下标数组名和下标来唯一的确定。来唯一的确定。算法依赖于数据结构,选择合适的数据结构,可以简化算法算法依赖于数据结构,选择合适的数据结构,可以简化算法。程序程序=算法算法+数据结构。数据结构。 6 .1 一维数组的定义和引用一维数组的定义和引用1 1、一维数组的定义:、一维数组的定义: 类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ;例如:例如: int

3、int a10 a10;表示定义了一个含有表示定义了一个含有1010个整型元素、名称为个整型元素、名称为a a的一维数组。的一维数组。说明:说明:(1)(1) 类型说明符用来说明数组中各个数据元素的类型。在类型说明符用来说明数组中各个数据元素的类型。在 任何一个数组中,数据元素的类型都是一致的。任何一个数组中,数据元素的类型都是一致的。(2) (2) 数组名的命名规则与变量名相同,遵循标识符命名规数组名的命名规则与变量名相同,遵循标识符命名规 则则( (以字母或下划线开头,由字母、数字、下划线组以字母或下划线开头,由字母、数字、下划线组 成成) )。 注意:注意:数组名不仅是一个标识符号,它还

4、是一个数组名不仅是一个标识符号,它还是一个地址常地址常量。量。是数组第一个元素的存储地址。是数组第一个元素的存储地址。 int a10;(3) 常量表达式用方括号常量表达式用方括号 括起,不能用圆括括起,不能用圆括 号,如号,如 b(10) 是错误的。是错误的。(4) 常量表达式表示常量表达式表示数组中元素的个数,即数组数组中元素的个数,即数组 的长度的长度。例如,在。例如,在a10中,中,10 表示数组中表示数组中 有有10个元素。这个元素。这10个元素分别是:个元素分别是: a0,a1,a2,a3,a4,a5,a6, a7,a8,a9。 注意:下标从注意:下标从0开始,没有开始,没有a10

5、。(5) 常量表达式中必须是由常量表达式中必须是由常量或常量或符号常量符号常量组成的表达式,组成的表达式,不能包含变量。例如,不能包含变量。例如, (6) 由于数组元素占有连续的内存单元,因此一维数组中的由于数组元素占有连续的内存单元,因此一维数组中的各个元素按照下标规定的顺序存放在内存中。各个元素按照下标规定的顺序存放在内存中。例如,我们定义了一个整型的一维数组例如,我们定义了一个整型的一维数组 int a5;那么这个那么这个 数组中的每个元素都将占用二个字节。数组中的每个元素都将占用二个字节。 假定内存地址假定内存地址1000开始存放数组开始存放数组 a: 各元素起始地址:各元素起始地址:

6、 1000 1002 1004 1006 1008 各数组元素各数组元素 : a0 a1 a2 a3 a4(7) 定义数组只是为数组预留适当的内存空间,并未给数组定义数组只是为数组预留适当的内存空间,并未给数组元素赋值。元素赋值。int n=10;char namen; # define M 10char textM*2+17定义的作用:系统为数组开辟相应的内存定义的作用:系统为数组开辟相应的内存空间空间aa0a1a2a3a4a5a6a7a8a9例:例:int a10 ;各元素在内存中连续存放各元素在内存中连续存放数组名代表首地址数组名代表首地址2.一维数组元素的引用一维数组元素的引用 引用引

7、用 就是读出数组中某一元素的值或将数椐赋给某一数就是读出数组中某一元素的值或将数椐赋给某一数组元素。组元素。 定义了一个数组以后,怎么引用数组中的元素呢?定义了一个数组以后,怎么引用数组中的元素呢?C语言规定只能一个一个地引用数组元素而语言规定只能一个一个地引用数组元素而不能整体引不能整体引 用数组名。用数组名。引用的一般形式:引用的一般形式: 数组名数组名下标下标使用说明:使用说明: 先定义数组,再引用数组元素。先定义数组,再引用数组元素。 用指定的下标来引用数组中的元素。用指定的下标来引用数组中的元素。 下标可以是表达式。例如:下标可以是表达式。例如: x3=b11+b10; i=2; a

8、=xi+2; 一个数组含有一个数组含有 n 个元素,那么下标的取值范围为个元素,那么下标的取值范围为 0,n-1。引用数组元素时,注意下标值不要超出数组范围。引用数组元素时,注意下标值不要超出数组范围。例如:通过循环控制数组元素下标的变化,达到输入例如:通过循环控制数组元素下标的变化,达到输入10个数个数 的目的。的目的。Int a10; for(i=0;i=10;i+) scanf(%d,&ai);应该在数组定义范围内操作:应该在数组定义范围内操作:#include void main()int i,a10; for(i=0;i=9;i+) ai=i; for(i=0;i=9;i+) pri

9、ntf(“%3d”,ai);下标超界下标超界例例: 从键盘输入从键盘输入10个字符,再反序输出。程序如下:个字符,再反序输出。程序如下:#include stdio.h void main()char ch10; /*定义字符数组定义字符数组C,它含有,它含有10个字符个字符*/ int i; for(i=0;i=0;i-) /*反序输出反序输出*/ printf(%c,chi); putchar(n); getch(); (演示)(演示)3. 3. 一维数组的初始化一维数组的初始化 定义数组只是为数组元素分配了存储空间。其值是不确定的。定义数组只是为数组元素分配了存储空间。其值是不确定的。因

10、此,在引用数组元素前,还必须给下标变量赋值。因此,在引用数组元素前,还必须给下标变量赋值。 还可以在定义数组的同时给数组赋初值还可以在定义数组的同时给数组赋初值,这称为:数组的初始化这称为:数组的初始化。形式如下:形式如下: 类型说明符数组名类型说明符数组名长度长度数值表数值表;使用说明:使用说明:(1)对数组的初始化操作只能在定义数组时进行,大括号中的内容即为对数组的初始化操作只能在定义数组时进行,大括号中的内容即为 数组的初值,各项用逗号隔开。数组的初值,各项用逗号隔开。 例如,例如,int X10=0,1,2,3,4,5,6,7,8,9;定义了一个含有定义了一个含有10个整型元素的数组。

11、个整型元素的数组。X0=0、x1=1、x2=2(2) 可以只给部分数组元素赋初值。可以只给部分数组元素赋初值。 例如,例如,int a4=1,2; 定义了一个含有定义了一个含有4个整型元素的数组。个整型元素的数组。但只对前但只对前2个元素个元素a0,a1赋初值,其余的元素系统将自动赋值为赋初值,其余的元素系统将自动赋值为0。(3) 如果想将数组中的所有元素全部赋为如果想将数组中的所有元素全部赋为0时,可以写成:时,可以写成: int a10=0,0,0,0,0,0,0,0,0,0; 也可以这样写:也可以这样写:int a10=0; 虽然只给第虽然只给第0个元素赋初值,但系统会自动将剩余的数个元

12、素赋初值,但系统会自动将剩余的数组元素赋值组元素赋值 0。 (4) 对全部数组元素赋初值时,可以不指定数组的大小。对全部数组元素赋初值时,可以不指定数组的大小。 int a=1,2,3,4,5; 省略数组的大小后,系统能够根据初值的个数自动定义省略数组的大小后,系统能够根据初值的个数自动定义决定数组的长度为决定数组的长度为 5。 因此这个数组定义语句相当于:因此这个数组定义语句相当于: int a5=1,2,3,4,5;例例1: 键盘输入键盘输入10数,输出其中最小的数。数,输出其中最小的数。 用数组用数组a10存放存放10个数,通过循环控制数组元素的下标读入。第个数,通过循环控制数组元素的下

13、标读入。第1个个数数a0作为比较的目标。从第二个数作为比较的目标。从第二个数a1开始直到开始直到a9 ,每一个数与,每一个数与min进行比较。如果大于进行比较。如果大于min,则放弃此数并读入下一个数,否则将此小数,则放弃此数并读入下一个数,否则将此小数赋值给赋值给min。通过次比较后,。通过次比较后,min就是最小数。就是最小数。-打擂台法打擂台法#include void main() int i,a10,min; printf(input 10 number:); for(i=0;i=9;i+) scanf(%d,&ai); min=a0; for(i=1;iai) min=ai; pr

14、intf(nmin= %d,min); (演示)(演示)14例例2:求求Fibonacci数列数列:1,1,2,3,5,8,的前的前20个数个数. 公式为公式为: F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n=3)#include void main() int i,f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%10d,fi); printf(n); 算法简单,占内存多算法简单,占内存多#include main() int f1,f2,f3,

15、i; f1=1;f2=1; printf(“%10d%10dn” ,f1,f2 ); for(i=1;i=18;i+) f3=f1+f2; printf(“%10d”,f3); if(i%2=0)printf(“n”); f1=f2; f2=f3; 15例例3:用冒泡法对:用冒泡法对n个数排序。个数排序。 (由小到大)(由小到大)思想思想: : 让大数逐步让大数逐步“沉入沉入”数组的底部数组的底部, ,让小数象气泡似的让小数象气泡似的“冒起冒起”到数组的顶点。到数组的顶点。做法:做法:将将相邻相邻两个数比较,将小的调到前头。两个数比较,将小的调到前头。第第1轮:共进行轮:共进行4小次两两比较,

16、最大的数向后移到了小次两两比较,最大的数向后移到了a5(最后)最后)第第2轮:只对前轮:只对前4个数进行个数进行3次两两比较,挑出这次两两比较,挑出这4个数中最大的一个,放到个数中最大的一个,放到a4(次后次后)第第3轮:只对前轮:只对前3个数进行个数进行2次两两比较,挑出这次两两比较,挑出这3个数中最大的一个,放到个数中最大的一个,放到a3第第4轮:只对前轮:只对前2个数进行个数进行1次两两比较,挑出这次两两比较,挑出这2个数中最大的一个,放到个数中最大的一个,放到a216比较的轮数:比较的轮数:n-1第第i轮比较的次数:轮比较的次数:j=n-i# define N 5main( ) int

17、 aN+1, k, i, j, temp; printf(input %d number:n,N); for(k=1;k=N;k+) scanf(%d,&ak); for(i=1;i=N-1;i+)for(j=1;jaj+1) temp=aj; aj=aj+1; aj+1=temp; for(k=1;ka2 j=2: a2a3 j=3: a3a4 j=4: a4a5i=2: j=1: a1a2 j=2: a2a3 j=3: a3a4 i=3: j=1: a1a2 j=2: a2a3i=4: j=1: a1a2双重循环执行过程双重循环执行过程6.2 6.2 二维数组的定义和引用二维数组的定义和引

18、用 到目前为止,我们问题分析的还只是一维数组。如果需到目前为止,我们问题分析的还只是一维数组。如果需要描述类似矩阵这样的数据,该如何实现呢?考虑一个要描述类似矩阵这样的数据,该如何实现呢?考虑一个3*4的矩阵的矩阵M: 0 1 2 3 4 5 6 7 8 9 11 12Mi,j 指的是第指的是第i行第行第j列的元素,其中列的元素,其中i 的范围是的范围是1-3,j 的范围的范围 是是1-4。例如,例如,M3,2指的是第指的是第3行第行第2列的元素,其值为列的元素,其值为9。 在在C语言中对类似矩阵这样的数据可以用一个语言中对类似矩阵这样的数据可以用一个二维数组二维数组来来表示。表示。C语言允许

19、使用多维数组,二维数组是最简单的多维语言允许使用多维数组,二维数组是最简单的多维数组。数组。一、一、 二维数组的定义二维数组的定义1)二维数组的定义形式二维数组的定义形式 类型说明符类型说明符 数组名数组名常量表达式常量表达式 常量表达式常量表达式;其中其中: 类型说明符用来说明数组中各个数据元素的类型。类型说明符用来说明数组中各个数据元素的类型。 第第1个常量表达式说明了这个数组有几行。第个常量表达式说明了这个数组有几行。第2个常量个常量表达式说明了每行有几个元素,或说明了几列。数组表达式说明了每行有几个元素,或说明了几列。数组元素的个数是两个常量表达式的乘积。元素的个数是两个常量表达式的乘

20、积。例如:例如: int a34; 表示定义一个二维数组表示定义一个二维数组a,它有,它有3行行4列,共列,共12个元素,个元素,其中每个元素为整型。其中每个元素为整型。可以将二维数组可以将二维数组 a 看成由看成由 3 个一维数组组成,一维数组个一维数组组成,一维数组名分别是:名分别是: ; 每个一维数组中又含有每个一维数组中又含有4个元素个元素,例如第一个一维数组,例如第一个一维数组a0的各个元素表示为:的各个元素表示为: a00、a01、a02、a03。整个整个a数组可以描述成如下形式:数组可以描述成如下形式:这种对二维数组的描述方式对第这种对二维数组的描述方式对第10章学习用章学习用指

21、针处理数指针处理数组组时将非常有用。时将非常有用。 a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 2) 二维数组的存储二维数组的存储C语言规定,二维数组中的元素排列的顺序是语言规定,二维数组中的元素排列的顺序是按行优按行优先先,即存储时先存放第一行的数据,再存放第二行的数,即存储时先存放第一行的数据,再存放第二行的数据,以此类推。例如,二维数组据,以此类推。例如,二维数组a34在内存中的存放顺在内存中的存放顺序为:序为: a00a01a02a10a11a12a20a21a22。21二维数组二维数组

22、a a在内存中存放形式在内存中存放形式二维数组是按行存放的。二维数组是按行存放的。即:先存放第一行的元素即:先存放第一行的元素;再存放第二行的元素再存放第二行的元素;.。二、二、 二维数组元素的引用二维数组元素的引用 定义数组,引用元素。定义数组,引用元素。 引用格式为:引用格式为: 数组名数组名下标下标下标下标 例如例如: int a22 共定义了共定义了4个元素,分别为:个元素,分别为: a00,a01,a10,a11二维数组的引用使用两个下标。另外要注意:二维数组的引用使用两个下标。另外要注意: int a45; 定义数组定义数组 b=a34; 引用元素,将元素引用元素,将元素a34赋值

23、给变量赋值给变量 b。 ?能用?能用 b=a45给变量赋值吗?给变量赋值吗? 三、二维数组的初始化三、二维数组的初始化二维数组初始化的方法有以下几种方法:二维数组初始化的方法有以下几种方法: 将所有的数值顺序列在一对大括号中将所有的数值顺序列在一对大括号中: int a34=1,2,3,4,5,6,7,8,9,10,11,12; (太不直观。)(太不直观。) 分行给二维数组赋初值。将初始值按行排列,每行用大分行给二维数组赋初值。将初始值按行排列,每行用大括号括起来,括号括起来, 各行之间用逗号分隔。例如:各行之间用逗号分隔。例如: int a34=1,2,3,4,5,6,7,8,9,10,11

24、,12; (比较直观,)比较直观,) 可以只给每行的前面部分数组元素赋初值。可以只给每行的前面部分数组元素赋初值。 int a34=1,4,3,1,2; 这种赋值方式相当于这种赋值方式相当于: int a34=1,0,0,0,4,3,0,0,1,2,0,0; (系统自动将没有赋值的元素赋(系统自动将没有赋值的元素赋0。)。) 可以对各行的某一元素赋初值。可以对各行的某一元素赋初值。 int a34=1,0,6,0,0,11; 这种赋值方式相当于这种赋值方式相当于: int a34=1,0,0,0,0,6,0,0,0,0,11,0; 可以只对部分行赋初值。可以只对部分行赋初值。 int a34=

25、1,1;这种赋值方式相当于这种赋值方式相当于: int a34=1,0,0,0,0,0,0,0,1,0,0,0; 如果将数组的所有元素全部赋值的话,在定义数组时可如果将数组的所有元素全部赋值的话,在定义数组时可以省略第一维的长度,但注意以省略第一维的长度,但注意。如:如: int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 一共定义了一共定义了12个数据,系统会根据总个数自动确定第一个数据,系统会根据总个数自动确定第一维的长度(数据总数除以第二维的长度)。维的长度(数据总数除以第二维的长度)。 这种赋值方式相当于:这种赋值方式相当于: int a34=1,2,3,4,5,6

26、,7,8,9,10,11,12;也可以在对部分数组元素赋初值时省略第一维的长度。也可以在对部分数组元素赋初值时省略第一维的长度。 int a 4=1,1;因为有因为有3个逗号分隔的大括号,所以第一维的长度就是个逗号分隔的大括号,所以第一维的长度就是3。四、二维数组程序举例四、二维数组程序举例例例: 输出一个矩阵的转置矩阵。输出一个矩阵的转置矩阵。 数组数组a: 2 4 5 换成换成 数组数组b: 2 3 3 7 8 4 7 5 8#includevoid main()int a23=2,4,5,3,7,8; int b32,i,j;printf(array a:n);for(i=0;i=1;i

27、+) for(j=0;j=2;j+) printf(%5d,aij); printf(n); (演示)(演示)printf(array b:n);for(i=0;i=2;i+) for(j=0;jmax,把,把aij作为作为 新的临时最大值,新的临时最大值,并记录下其行下标并记录下其行下标 I 和列和列 j 。当全部元素比较完。当全部元素比较完 后,后,max是整个矩阵全部元素的最大值。下面给出程序。是整个矩阵全部元素的最大值。下面给出程序。#includevoid main()int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6,-10,10,

28、-5,2; max=a00; for(i=0;i=2;i+) /* 用二重循环遍历全部元素用二重循环遍历全部元素 */ for(j=0;jmax ) max=aij;row=i;colum=j; printf(max=%d, row=%d, colum=%dn,max,row,colum); 运行结果:运行结果:max=10, row=2, colum=1 (演示)(演示)例:输入例:输入6个学生、每人个学生、每人5门课的成绩,统计每个学生的总成门课的成绩,统计每个学生的总成绩。绩。#includevoid main() int s65,sum6,i,j; printf(“please inp

29、ut 5 score :n”); for(i=0;i6;i+) printf(“%-4d:”,i+1); for(j=0;j5;j+) sacnf(“%d”,&sij; for(i=0;i6;i+) sumi=0; for(j=0;j5;j+) sumi+=sij); for(j=0;j6;j+) printf(“student%-4d %-6.2f”, j+1,sumj); 如何统计每门课的平均成如何统计每门课的平均成绩绩?另定义一个另定义一个 sum15for (j=0;j5;j+) sum1j=0; for(i=0;i6;i+) sum1j+=sij;for(i=0;i5;i+) pri

30、ntf(“subject:%-4d %-6.2f”,i+1 ,sumj);例例打印出以下的杨辉三角形打印出以下的杨辉三角形(要求打印出要求打印出10行行)。11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1问题分析问题分析 这是一个这是一个10*10的矩阵,该矩阵的特点是对角线的矩阵,该矩阵的特点是对角线上方的元素全上方的元素全 为为0,是一个下三角矩阵。杨辉三角形各行,是一个下三角矩阵。杨辉三角形各行系数有如下规律:系数有如下规律:(1)各行第一个数都是)各行第一个数都是1。(。(ai1=1)(2)各行最后一个数都是)各行最后一个数都是1。(aii=1) (3) 从

31、第从第3行起,其余各数是上一行同列和前一列两个数行起,其余各数是上一行同列和前一列两个数 之和。之和。 aij=ai-1j+ai-1j-1,(,(其中其中i为行数为行数j为列数。)为列数。)例例#include #define N 11void main() int i,j,aNN; for(i=1;iN;i+) aii=1; ai1=1; for(i=3;iN;i+) for(j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; (演示)(演示)for(i=1;iN;i+) for(j=1;j=i;j+) printf(%5d,aij); printf(n); printf(n)

32、; 6.3 6.3 字符串与字符数组字符串与字符数组在前面的学习中,我们学习了整型、实型、字符型变在前面的学习中,我们学习了整型、实型、字符型变量,没有见到字符串变量,量,没有见到字符串变量,C语言中字符串存放在何处呢?语言中字符串存放在何处呢?原来原来 就是就是,字符数组的每一个元素字符数组的每一个元素(下标下标变量)存放一个字符。变量)存放一个字符。一、字符串常量一、字符串常量 所谓字符串常量就是用双引号括起来的字符组合。所谓字符串常量就是用双引号括起来的字符组合。例如,例如, I am a boy “ 就是一个字符串。就是一个字符串。 字符串在内存中存放时,系统会在字符串结束处自动字符串

33、在内存中存放时,系统会在字符串结束处自动 加上字符串结束标志加上字符串结束标志 0。(。(ASCII码为码为0)。)。 系统通过字符串结束标志系统通过字符串结束标志0,判断字符串是否结束,并得,判断字符串是否结束,并得 到字符串的长度。到字符串的长度。二、字符数组的定义二、字符数组的定义字符数组用来存放字符串,字符数组的说明形式如下:字符数组用来存放字符串,字符数组的说明形式如下:char 数组名数组名常量表达式常量表达式 常量表达式常量表达式 ;例如例如: char a3; a0=Y;a1=O;a2=U;这里定义这里定义a为字符数组,包含为字符数组,包含3个元素。个元素。 我们知道,系统是用

34、字符对应的我们知道,系统是用字符对应的ASCII码来处理字符码来处理字符的,于是字符和的,于是字符和0255间的整数是等价的。他们可以通间的整数是等价的。他们可以通用。但有区别:用。但有区别: char c10; /* 在内存中占在内存中占10字节字节 */ int c10; /* 在内存中占在内存中占20字节字节 */三、字符数组的初始化三、字符数组的初始化(1) 逐个元素初始化。比如:逐个元素初始化。比如: char c10=I, ,a,m, ,h,a,p,p,y; 这里把这里把10个字符分别赋给个字符分别赋给c0到到c910个元素。个元素。(2) 初始化数据少于数组长度初始化数据少于数组

35、长度,多余元素自动为多余元素自动为“空空”。 比如:比如: char c12= I , ,a,m, ,h,a,p,p,y;在这个初始化语句中,共写了在这个初始化语句中,共写了10个字符(含空格),还有个字符(含空格),还有2个数组元素我们没有给出初值,根据前面所讲的,对没有给个数组元素我们没有给出初值,根据前面所讲的,对没有给出初值的数组元素,系统自动对它们赋值出初值的数组元素,系统自动对它们赋值0(或或0)。这样。这样上上面这个数组初始化完毕后,如下所示:面这个数组初始化完毕后,如下所示:(3) 如果提供的初值个数与预定的数组长度相同,在定义时如果提供的初值个数与预定的数组长度相同,在定义时

36、可以省略数组长度,系统会根据初值个数确定数组长度。可以省略数组长度,系统会根据初值个数确定数组长度。 char c = I , ,a,m, ,h,a,p,p,y,0; (4) 初始化字符数组时,也可以写成如下形式:初始化字符数组时,也可以写成如下形式: char a=I am happy; 等价于:等价于:char c=I, ,a,m, ,h,a,p,p,y,0;系统自动在字符串尾加上一个系统自动在字符串尾加上一个:0 此此0不需要人为书写。但是输出时不显示这不需要人为书写。但是输出时不显示这个个0. 程序是依据标志来程序是依据标志来0来确定字符串是否结束及其长度。来确定字符串是否结束及其长度

37、。 所以,数组所以,数组 c 在内存中的长度在内存中的长度是是11,而不是,而不是10。应人工加上应人工加上0在不确定字符数组长度情况下,逐个字符赋值要注意在不确定字符数组长度情况下,逐个字符赋值要注意:例例#include void main()int i,j; char c=I am happy; char d=I, ,a,m, ,h,a,p,p,y; puts(c); puts(d); i=sizeof(c);j=sizeof(d); printf(%d %dn,i,j);运行结果:运行结果: I am happy I am happy #$. 10 11 如何解决如何解决? (应加上尾

38、标志(应加上尾标志0) 演示演示四、字符数组的输入输出四、字符数组的输入输出 C语言提供了两组实现字符串输入输出操作的函数。语言提供了两组实现字符串输入输出操作的函数。一组是一组是 scanf()(), 函数函数printf()一组是一组是 gets (数组名数组名), puts (数组名数组名)。1、 使用格式函数输入输出使用格式函数输入输出将字符数组逐个字符输入输出(将字符数组逐个字符输入输出(格式符格式符“%c” )。)。将整个字符串的内容一次输入输出(将整个字符串的内容一次输入输出(格式符格式符“%s”) 。 (1) 采用采用 格式符格式符%c逐个字符输入输出逐个字符输入输出, .vo

39、id main()char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n); getch(); 运行结果:运行结果: I am a boy (2) 采用采用格式符格式符%s将整个字符串一次输入输出将整个字符串一次输入输出, .#include stdio.h void main()char c10 ; scanf(%s,c); printf(%sn,c); 输入:输入:china 输出:输出:china其中其中, scanf(“%s”, c); 表示将键盘输入的内容按字符串的方表示将键盘输入的内容

40、按字符串的方式送到数组式送到数组 c 中。中。这里注意在数组名这里注意在数组名 c 前不要加引用符号前不要加引用符号&,因为因为 对于对于printf( )输出字符串应注意:输出字符串应注意: 不输出字符串结束符号不输出字符串结束符号0 输出项只能是数组名,不能是具体的数组元素。输出项只能是数组名,不能是具体的数组元素。 printf(“% s”,c2);是错误的。是错误的。 数组定义长度大于实际长度时,输出到数组定义长度大于实际长度时,输出到0符为止。符为止。如:如: char c10=”china”; printf(“%s”,c); 只输出只输出 china 对于用对于用scanf() 输

41、入字符串应注意:输入字符串应注意: 输入的数组名此前应定义。输入的数组名此前应定义。 数组名前不要加取地址符号数组名前不要加取地址符号 & ,数组名就是数组的,数组名就是数组的地址。地址。 键入的串长度应小于定义的长度。键入的串长度应小于定义的长度。 利用一个利用一个scanf( )函数输入多个串时,各个串之间用函数输入多个串时,各个串之间用 空格空格 分隔。分隔。 如:如:char c15,c25,c35; scanf(“%s%s%s”,c1,c2,c3); 可输入数据:可输入数据: How are you? 当遇到分隔符时就认为字符串输入完毕当遇到分隔符时就认为字符串输入完毕, 同时将分隔

42、符前同时将分隔符前 面的字符以及字符串结束字符面的字符以及字符串结束字符0一并存入数组中。如:一并存入数组中。如: char c15 scanf(“%s”,c); 若输入:若输入:How are you? 则字符串则字符串C中只能得到中只能得到 How,余下的位置填,余下的位置填0 2、使用、使用 (数组名数组名)和和(数组名数组名)输入和输出输入和输出 字符串输出函数字符串输出函数 形式:形式:(字符数组或字符串字符数组或字符串) 功能:将一个字符串输出到屏幕上,同时将字符串结功能:将一个字符串输出到屏幕上,同时将字符串结束标志束标志0换成换成 n ,即输出完字符串后换行。,即输出完字符串后

43、换行。例例J7-9:#include void main( )static char a1 = chinanbeijing; static char a2 = china0beijing; puts(a1); puts(a2); puts(WUHAN);getch(); 运行结果:运行结果: china beijing china WUHAN (演示)(演示) 字符串输入函数字符串输入函数 从键盘输入一个字符串到字符数组保存,字符数组名就是保存的地址。从键盘输入一个字符串到字符数组保存,字符数组名就是保存的地址。形式:形式:gets (字符数组字符数组)功能:从键盘输入一个字符串到字符数组。在

44、输入过程中,遇功能:从键盘输入一个字符串到字符数组。在输入过程中,遇“ ”回回 车符结束,并将其转换为车符结束,并将其转换为0存入字符串尾部,存入字符串尾部, 特殊地:特殊地:。例例J7-10: 用用gets和和scanf 函数分别输入字符串,函数分别输入字符串,#includevoid main( )char a115, a215 ; gets(a1); scanf(%s,a2); printf (a1=%sn,a1); printf (a2=%sn,a2); 输入:输入:china beijing china beijing 输出:输出:a1=china beijing a2=china五

45、、字符串处理函数五、字符串处理函数 除了输入输出字符串函数外,在除了输入输出字符串函数外,在C语言的函数库中还提语言的函数库中还提供了一些专门的字符串处理函数。这些函数是:供了一些专门的字符串处理函数。这些函数是: 字符串连接函数:字符串连接函数: strcat字符串拷贝函数:字符串拷贝函数: strcpy 字符串比较函数:字符串比较函数: strcmp求字符串长度函数:求字符串长度函数: strlen 大小写字母转换函数:大小写字母转换函数: strlwr 和和 strupr 同样:在使用这些库函数前必须在文件开始处用同样:在使用这些库函数前必须在文件开始处用: include命令命令将相关

46、的头文件包含到源程序中。将相关的头文件包含到源程序中。 字符串连接函数字符串连接函数形式:形式:strcat (字符数组字符数组1,字符数组,字符数组2)功能:连接两个数组中的字符串。把字符数组功能:连接两个数组中的字符串。把字符数组2中的内容中的内容(串串2)连接连接到字符数组到字符数组1的后面,结果存放到字符数组的后面,结果存放到字符数组1中,中,strcat 函数值得函数值得到字符数组到字符数组1的地址。的地址。例例: (演示)(演示)#includevoid main( ) char a11=I ; char b11=am a boy; printf(%sn, strcat(a,b);

47、 printf(%dn,sizeof(a); getch(); 执行结果如下:执行结果如下: I am a boy 11说明:说明:(1) 函数应有两个参数,参数函数应有两个参数,参数1变量是字符数组名,但字符变量是字符数组名,但字符 数组也可以是字符串。数组也可以是字符串。(2) 定义字符数组定义字符数组1 时必须考虑有容纳两个字符串的空间。时必须考虑有容纳两个字符串的空间。(3) 连接后字符串中原有的连接后字符串中原有的0被字符串的第一个字被字符串的第一个字 符替代,新串中保留了字符串中的符替代,新串中保留了字符串中的0,作为新串,作为新串 的结束标志。的结束标志。 如:如: char s

48、tr130=World“; str212=“ Cup; printf(%sn,strcat (str1,str2); 执行结果为:执行结果为:World Cup字符串拷贝函数字符串拷贝函数形式:形式:strcpy(字符数组字符数组1,字符数组,字符数组2)功能:将字符串功能:将字符串2(也可以是字符数组也可以是字符数组2的部分内容的部分内容)拷贝到拷贝到 字符数组字符数组1中,字符数组中,字符数组1中原来的内容被覆盖。中原来的内容被覆盖。例例: (演示)(演示)#include void main( )char a18, a2 = china, a3 = wuhan ; strcpy(a1,a

49、2); strcpy(a2,a3); strcpy(a3, hubei); printf(a1=%sna2=%sna3=%sn, a1,a2,a3); getch(); 运行结果:运行结果: a1=china a2=wuhan a3=hubei说明:说明:(1) “字符数组字符数组1”必须写成数组名的形式,必须写成数组名的形式,“字符数组字符数组2”可以可以是字符数组名,也可以是一个字符串。是字符数组名,也可以是一个字符串。(2) 拷贝时连同字符串后面的拷贝时连同字符串后面的0一起拷贝到字符数组一起拷贝到字符数组1中。中。(3) 字符串拷贝不能用赋值语句,如字符串拷贝不能用赋值语句,如: 。(

50、4) 注意字符数组注意字符数组1要足够大,以放下字符数组要足够大,以放下字符数组2中的字符串。中的字符串。(5)可以只将字符串数组可以只将字符串数组2的部分内容拷贝到字符串数组的部分内容拷贝到字符串数组1中。中。 如:如:strcpy(str1,str2,3); 将将str2中前中前3个字符复制到个字符复制到str1中。中。 字符串比较函数字符串比较函数形式:形式:strcmp (字符串字符串1,字符串,字符串2)功能:比较两个字符串,比较时按功能:比较两个字符串,比较时按AscII码值从左码值从左向右逐个比较,直到出现不同字符或遇到向右逐个比较,直到出现不同字符或遇到0为止。为止。比较的结果

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(大学C语言程序设计基础第6章课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|