清华谭浩强C语言课件第7章数组.ppt

上传人:cn****1 文档编号:570650216 上传时间:2024-08-05 格式:PPT 页数:81 大小:641.56KB
返回 下载 相关 举报
清华谭浩强C语言课件第7章数组.ppt_第1页
第1页 / 共81页
清华谭浩强C语言课件第7章数组.ppt_第2页
第2页 / 共81页
清华谭浩强C语言课件第7章数组.ppt_第3页
第3页 / 共81页
清华谭浩强C语言课件第7章数组.ppt_第4页
第4页 / 共81页
清华谭浩强C语言课件第7章数组.ppt_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《清华谭浩强C语言课件第7章数组.ppt》由会员分享,可在线阅读,更多相关《清华谭浩强C语言课件第7章数组.ppt(81页珍藏版)》请在金锄头文库上搜索。

1、高级语言程序设计张远Tel:13696657320E-mail:程序程序=算法算法+数据结构数据结构+结构化程序结构化程序设计方法设计方法+语言工具和环境语言工具和环境第7章 数组v前面各章所使用的数据都属于前面各章所使用的数据都属于基本数据基本数据类型类型(整型、实型、字符型),(整型、实型、字符型),C C语言除语言除了提供基本数据类型外,还提供了了提供基本数据类型外,还提供了构造构造类型类型的数据,它们是的数据,它们是数组类型、结构体数组类型、结构体类型、共同体类型等类型、共同体类型等。构造数据类型是。构造数据类型是由基本数据类型的数据按照一定的规则由基本数据类型的数据按照一定的规则组成

2、,所以也称为组成,所以也称为“导出类型导出类型”。v下面简单介绍一下数组概念:下面简单介绍一下数组概念:1、数组:一组具有、数组:一组具有相同数据类型相同数据类型的的数据数据的的有序的集合。有序的集合。2、数数组组元元素素:构构成成数数组组的的数数据据。数数组组中中的的每每一一个个数数组组元元素素具具有有相相同同的的名名称称,不不同同的的下下标标,可可以以作作为为单单个个变变量量使使用用,所所以以也称为也称为下标变量下标变量。3、数数组组的的下下标标:是是数数组组元元素素的的位位置置的的一一个个索引或指示索引或指示。4、数数组组的的维维数数:数数组组元元素素下下标标的的个个数数。根根据据数数组

3、组的的维维数数可可以以将将数数组组分分为为一一维维、二二维、三维、多维数组。维、三维、多维数组。v7.1一维数组一维数组v数数组是是一一组有有序序数数据据的的集集合合,数数组中中每每一一个个元元素素的的类型型相相同同。用用数数组名名和和下下标来来唯唯一一确确定定数数组中的元素。中的元素。7.1.1一维数组的定义(一维数组的定义(先定义后使用先定义后使用)定义方式:定义方式:类型说明符类型说明符数组名数组名整型常量表达式整型常量表达式例例:inta10第7章 数组intint a10 a10 表示如下信息:表示如下信息:v定义一个数组,数组名定义一个数组,数组名a a,有有1010个元素,每个元

4、素个元素,每个元素的类型均为的类型均为intint。v这这1010个元素分别是:个元素分别是:a0a0、a1a1、a2a2、a3a3、a4a4、.、a8a8、a9a9。v各各个个数数组组元元素素是是排排成成一一行行的的一一组组下下标标变变量量,用用一一个个统统一一的的数数组组名名来来标标识识,用用一一个个下下标标来来指指示示其其在在数数组组中中的的位位置置。一一维维数数组组通通常常和和一一重重循循环环相相配配合合,对对数数组元素进行处理。组元素进行处理。v注意:注意:v1)下下标标从从0开开始始。如如:数数组组a的的第第1个个元元素素是是a0,数组的第,数组的第8个元素是个元素是a7第7章 数

5、组v注意:注意: 2 2)C C语言不允许对数组的大小做动态定义,语言不允许对数组的大小做动态定义,如:如:vintn;vscanf(%d,&n);vintan;v因因为在在编译时,C编译器根据已知数器根据已知数组大大小分配内存。小分配内存。v说明:说明:1)数数组组名名:按按标标识识符符规规则则。本本例例a就就是是数数组名。组名。2)整整型型常常量量表表达达式式:表表示示数数组组元元素素个个数数(数数组组的的长长度度)。可可以以是是整整型型常常量量或或符符号号常常量量,不不允允许许用用变变量量。整整型型常常量量表表达达式式在在说说明明数数组组元元素素个个数数的的同同时时也也确确定定了了数数组

6、组元元素素下下标标的的范范围围,下下标标从从0开开始始整整型型常常量量表表达达式式-1(注注意意不不是是1整整型型常常量量表达式)。表达式)。vC语语言言不不检检查查数数组组下下标标越越界界,但但是是使使用用时时,一一般般不不能能越越界界使使用用,否否则则结结果果难难以以预预料料(覆覆盖盖程程序序区区-程程序序飞飞出出,覆覆盖盖数数据据区区-数数据据覆覆盖盖破破坏坏,操操作作系系统统被被破破坏坏,系系统统崩崩溃溃)。本本例例数组元素个数是数组元素个数是10个,下标从个,下标从0-9。3)C编译程序为数组分配了一片编译程序为数组分配了一片连续连续的的空间。空间。4)类类型型说说明明:指指的的是是

7、数数据据元元素素的的类类型型,可可以以是是基基本本数数据据类类型型,也也可可以以是是构构造造数数据据类类型型。类类型型说明确定了每个数据占用的内存字节数。说明确定了每个数据占用的内存字节数。一维数组:一维数组: floatfloat markmark100;100;mark0mark1mark2mark3.mark9986.592.077.552.0.94.0低地址低地址 高地址高地址每个数据元素占用的每个数据元素占用的字节数,就是字节数,就是基类型基类型的字节数的字节数一个元素占一个元素占4个个字节字节第7章 数组7 7.1.1.2 2 一维数组的初始化一维数组的初始化v初始化:在定义时初始

8、化:在定义时指定初始值指定初始值,编译器把初值,编译器把初值赋给数组变量。赋值:使用赋值语句,在程序赋给数组变量。赋值:使用赋值语句,在程序运行时把值赋给数组变量,如运行时把值赋给数组变量,如a0 = 2a0 = 2。v初始化格式:初始化格式:v数据类型数据类型 数组名数组名 常量表达式常量表达式 初值表初值表 1 1、一般初始化,例一般初始化,例: :vstatic static intint a10= 0,1,2,3,4,5,6,7,8,9 a10= 0,1,2,3,4,5,6,7,8,9vintint array10 = 1,2,3,4,5,6,7,8,9,10 array10 = 1,

9、2,3,4,5,6,7,8,9,10; 2 2、部分元素初始化,部分元素初始化,其余元素均为零其余元素均为零。 例例:static :static intint a10 = 0,1,2,3,4 a10 = 0,1,2,3,4; 仅前仅前5 5个元素赋初值,后个元素赋初值,后5 5个元素自动赋为个元素自动赋为0 0。3 3、全部元素均初始化为、全部元素均初始化为0 0,不允许不允许简写。简写。 static static intint a10 = a10 = 0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0;不能写成不能写成:inta10=0*10;第7章 数组v不

10、能简写为:不能简写为:vstatic static intint a10 = 0*10; a10 = 0*10; v注意注意:当程序不给数组指定初始值时,编:当程序不给数组指定初始值时,编译器作如下处理:译器作如下处理:v(1 1)编译器自动把静态数组的各元素初)编译器自动把静态数组的各元素初始化为始化为0 0。v(2 2)编译器不为动态数组自动指定初始)编译器不为动态数组自动指定初始值。值。 v4 4、如果全部元素均指定初值,定义中、如果全部元素均指定初值,定义中可以省可以省略元素的个数略元素的个数,例,例: :vstatic static intint a5 = 1,2,3,4,5; a5

11、 = 1,2,3,4,5;v可以写为:可以写为:vstatic static intint a = 1,2,3,4,5; a = 1,2,3,4,5;7 7.1.3 .1.3 数数组元素的引用元素的引用vC C语言规定,语言规定,不能引用不能引用整个数组,只能整个数组,只能逐逐个引用元素个引用元素,元素引用方式:,元素引用方式:v 数组名数组名 下标表达式下标表达式 例例:a0=a5+a7-a2*3 “下下标标表表达达式式”可可以以是是任任何何非非负负整整型型数数据据,取值范围是取值范围是0 0 (元素个数(元素个数-1-1)。)。v特特别别强强调调:在在运运行行C C语语言言程程序序过过程程

12、中中,系系统统并并不不自自动动检检验验数数组组元元素素的的下下标标是是否否越越界界。因因此此在在编编写写程程序序时时,保保证证数数组组下下标标不不越越界界是是十十分分重重要要的。的。v1 1个个数数组组元元素素,实实质质上上就就是是1 1个个变变量量,它它具具有有和和相相同同类类型型单单个个变变量量一一样样的的属属性性,可可以以对对它它进进行行赋值和参与各种运算。赋值和参与各种运算。v在在C C语语言言中中,数数组组作作为为1 1个个整整体体,不不能能参参加加数数据据运算,只能对运算,只能对单个的元素单个的元素进行处理。进行处理。 例例6.1 6.1 使数组元素使数组元素a0a0a9a9的值为

13、的值为0 09 9,然后逆序输出。,然后逆序输出。vmain()main()v vintint i,a10; i,a10;vfor (i=0;i=9;i+)for (i=0;i=0; i-)for(i=9;i=0; i-)vprintf(%dprintf(%d ,ai); ,ai);v v运行输出:运行输出:9 8 7 6 5 4 3 2 1 09 8 7 6 5 4 3 2 1 07 7.1.4 .1.4 一维数组的应用一维数组的应用例例7.3输输入入10个个数数,用用“冒冒泡泡法法”对对10个个数数排排序序(由由小小到到大)。大)。v冒冒泡泡法法的的基基本本思思想想:通通过过相相邻邻两两个

14、个数数之之间间的的比比较较和和交交换换,使使排排序序码码(数数值值)较较小小的的数数逐逐渐渐从从底底部部移移向向顶顶部部,排排序序码码较较大大的的数数逐逐渐渐从从顶顶部部移移向向底底部部。就就像像水水底底的的气气泡泡一一样样逐逐渐渐向上冒向上冒,故而得名。,故而得名。v“冒冒泡泡法法”算算法法:以以六六个个数数9、8、5、4、2、0为例。为例。v第第1趟比较(下图趟比较(下图1)第第2趟比较(下图趟比较(下图2)v第第1 1趟比较后,剩趟比较后,剩5 5个数未排好序;两两比个数未排好序;两两比较较5 5次次v第第2 2趟比较后,剩趟比较后,剩4 4个数未排好序;两两比个数未排好序;两两比较较4

15、 4次次v第第3 3趟比较后,剩趟比较后,剩3 3个数未排好序;两两比个数未排好序;两两比较较3 3次次v第第4 4趟比较后,剩趟比较后,剩2 2个数未排好序;两两比个数未排好序;两两比较较2 2次次v第第5 5趟比较后,全部排好序;两两比较趟比较后,全部排好序;两两比较1 1次次v算法结论算法结论:对于:对于n n个数的排序,需进行个数的排序,需进行n-n-1 1趟比较,第趟比较,第j j趟比较需进行趟比较需进行n-jn-j次两两比次两两比较。较。v程序流程图:(用两层嵌套循环实现)程序流程图:(用两层嵌套循环实现)v程序:设需排序的数有程序:设需排序的数有1010个,定义数组大小为个,定义

16、数组大小为1111,使用,使用a1a1a10a10存放存放1010个数,个数,a0a0不用。不用。vmain()vvinta11;/*用用a1a10,a0不用不用*/vinti,j,t;/*i,j作循环变量,作循环变量,t作临变作临变*/vprintf(input10numbers:n);vfor(i=1;i11;i+)vscanf(%d,&ai);/*输入输入10个整数个整数*/vprintf(n);vfor(j=1;j=9;j+)/*第第j趟比较趟比较*/vfor(i=1;i ai+1) /* if (ai ai+1) /* 交换大小交换大小 */ */v t = ai;t = ai;v

17、ai = ai+1; ai = ai+1; v ai+1 = t; ai+1 = t;v v printf(theprintf(the sorted numbers:n); sorted numbers:n);v for(i=1;i11;i+) for(i=1;i11;i+)vprintf(%d,aiprintf(%d,ai););v 程序运行结果如下:程序运行结果如下:input 10 numbers:input 10 numbers:1 0 4 8 12 65 -76 100 -45 1231 0 4 8 12 65 -76 100 -45 123the sorted numbers:th

18、e sorted numbers:-76 -45 0 1 4 8 12 65 100 123-76 -45 0 1 4 8 12 65 100 1237 7.2 .2 二二维数数组 v二二维维数数组组:数数组组元元素素是是双双下下标标变变量量的的数数组。组。v二二维维数数组组的的数数组组元元素素可可以以看看作作是是排排列列为为行行列列的的形形式式(矩矩阵阵)。二二维维数数组组也也用用统统一一的的数数组组名名来来标标识识,第第一一个个下下标标表表示示行行,第二个下标表示列。下标第二个下标表示列。下标从从0 0开始。开始。7 7、2 2、1 1 二维数组的定义二维数组的定义 v类类型型说说明明符符

19、 数数组组名名11行行常常量量表表达达式式11列列常常量量表表达达式式1, 1, 数组名数组名22行常量表达式行常量表达式22列常量表达式列常量表达式2;2;例例: :intint a34; a a34; a为为34(334(3行行4 4列列) )的数组的数组 float b510;b float b510;b为为510(5510(5行行1010列列) )的数组的数组v二维数组的理解:二维数组的理解:v二维数组二维数组a34理解为:理解为:有三个元素有三个元素a0、a1、a2,每一个元素是每一个元素是一个包含一个包含4个元素的数组。个元素的数组。v二维数组的元素在内存中的存放顺序:二维数组的元

20、素在内存中的存放顺序:v按行存放,即:先顺序存放按行存放,即:先顺序存放第一行第一行的元素,再的元素,再存放第二行的元素。(存放第二行的元素。(最右边最右边的下标变化最快,的下标变化最快,第一维的下标变化第一维的下标变化最慢)。最慢)。地址地址地址地址值值值值数组元素数组元素数组元素数组元素b b0000b b0101b b0202b b1010b b1111b b1212b b2020b b2121b b22223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E

21、 EH H30301010H H例如:例如:整型数组整型数组b33=1,2,3,4,5,6,7,8,9;123456789v再一次说明:再一次说明:1)二二维维数数组组中中的的每每个个数数组组元元素素都都有有两两个个下下标标,且且必必须须分分别别放放在在单单独独的的“”内内。如如:a3,42)二二维维数数组组定定义义中中的的第第1个个下下标标表表示示该该数数组组具具有有的的行行数数,第第2个个下下标标表表示示该该数数组组具具有有的的列列数数,两两个个下下标标之之积积是是该该数数组组具具有有的的数数组元素的组元素的个数个数。(3)二二维维数数组组中中的的每每个个数数组组元元素素的的数数据据类类型

22、型均均相相同同。二二维维数数组组的的存存放放规规律律是是“按按行排列行排列”。(4)二二维维数数组组可可以以看看作作是是数数组组元元素素为为一一维维数组数组的数组。的数组。7 7.2.2.2 2 二维数组的初始化二维数组的初始化1、分行赋值分行赋值,如:如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;2、全部数据全部数据写在一个大括号内,如写在一个大括号内,如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;3、部分元素赋值,如部分元素赋值,如:staticinta34=1,5,9;仅仅对对a00、a10、a20赋赋值值,其其

23、余余元元素素未未赋赋值值(编编译译器器自自动动为为未未赋赋值值元元素指定素指定初值初值0。v教教材材p137还还列列举举了了一一些些部部分分元元素素赋赋初初值值的例子,请自行阅读。的例子,请自行阅读。4、如如果果对对全全部部元元素素赋赋初初值值,则则第第一一维维的的长长度度可可以不指定以不指定,但必须指定,但必须指定第二维第二维的长度。的长度。例例:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;与下面定义等价:与下面定义等价:staticinta4=1,2,3,4,5,6,7,8,9,10,11,12;7 7.2.2.2 2 二维数组元素的引用二维数组元素的引

24、用v用用数组名和下标数组名和下标引用元素。例引用元素。例:floata23;有有6个元素,按如下方式引个元素,按如下方式引用各元素:用各元素:a00、a01、a02、a10、a11、a12(下标从下标从0始)始)v注意注意:数组:数组floata23中无元素中无元素a23。7 7、2 2、3 3 二维数组应用举例二维数组应用举例v二维数组的遍历访问(扫描),一般都二维数组的遍历访问(扫描),一般都采用采用双重循环处理双重循环处理(行循环,列循环)。(行循环,列循环)。例例7.4将一个二维数组行和列交换,存到将一个二维数组行和列交换,存到另一个二维数组中。例如另一个二维数组中。例如:v算法算法:

25、 bji = aijbji = aijv程序:程序:vmain()vvstaticinta23=1,2,3,4,5,6;vstaticintb32,i,j;vprintf(arraya:n);vfor(i=0;i=1;i+)/*01行行*/vvfor(j=0;j=2;j+)/*02列列*/vvprintf(%5d,aij);vbji=aij;/*行、列交换行、列交换*/vv vprintf(nprintf(n);/*);/*输出一行后换行输出一行后换行 */ */vvprintf(arrayprintf(array b:n); b:n);vfor(i=0;i=2;i+)for(i=0;i=2;

26、i+)vvfor(j=0;j=1;j+)for(j=0;jmax,把把aij作为作为新的临时新的临时最大最大值,并值,并记录记录下其下标下其下标i和和j。当全部元素比当全部元素比较完后,较完后,max是整个矩阵全部元素的最是整个矩阵全部元素的最大值。大值。流程:流程:v程序:程序:vmain()main()v vintint i,j,row=0,colum=0,max; i,j,row=0,colum=0,max;vstatic static intint a34=1,2,3,4,9,8,7,6, a34=1,2,3,4,9,8,7,6,-10,10,-5,2; -10,10,-5,2; vm

27、ax = a00; max = a00; vfor(i=0; i=2; i+) /* for(i=0; i=2; i+) /* 用两重循环遍用两重循环遍历全历全 部元素部元素 */ */vfor(j=0; j=3; j+)for(j=0; j max ) max )v max = max = aijaij;vrow = i;row = i;vcolumcolum = j; = j;vvprintf(maxprintf(max=%d, row=%d, =%d, row=%d, columcolum=%=%dn,max,row,columdn,max,row,colum););v 注意注意:本例中

28、得到的行列值从:本例中得到的行列值从0 0始。始。7 72 25 5多维数组多维数组v当当数数组组元元素素的的下下标标在在2 2个个或或2 2个个以以上上时时,该该数数组组称为多维数组。其中以称为多维数组。其中以2 2维数组最常用。维数组最常用。v定定义义多多维维数数组组:类类型型说说明明 数数组组名名 整整型型常常数数1 1 整型常数整型常数2 2 整型常数整型常数kk;例如:例如:intint a233; a233;v定定义义了了一一个个三三维维数数组组a a,其其中中每每个个数数组组元元素素为为整型。总共有整型。总共有2 2x3x3=18x3x3=18个元素。个元素。v说明:说明:1 1

29、)对对于于三三维维数数组组,整整型型常常数数1 1,整整型型常常数数2 2,整整型型常常数数3 3可可以以分分别别看看作作“深深”维维(或或:“页页”维维)、“行行”维维、“列列”维维。可可以以将将三三维维数数组组看看作作一一个个元元素素为为二二维维数数组组的的一一维维数数组组。三三维维数数组组在在内内存存中中先先按页、再按行、最后按列存放按页、再按行、最后按列存放。2 2)多多维维数数组组在在三三维维空空间间中中不不能能用用形形象象的的图图形形表表示示。多多维维数数组组在在内内存存中中排排列列顺顺序序的的规规律律是是:第第一一维维的的下标变化最慢,最右边的下标变化最快。下标变化最慢,最右边的

30、下标变化最快。3 3)多多维维数数组组的的数数组组元元素素的的引引用用:数数组组名名 下下标标1 1 下下标标2 2 下下标标kk。多多维维数数组组的的数数组组元元素素可可以以在在任任何何相相同同类类型型变变量量可可以以使使用用的的位位置置引引用用。只只是是同样要注意同样要注意不要越界不要越界。三维数组的元素排列顺序三维数组的元素排列顺序 a000a000a001a001a002a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103

31、a103 a110 a110a111a111a112a112a113a113 a120 a120a121a121a122a122a123a1237 7.3 .3 字符数组字符数组v字符数组:存放字符数组:存放字符数据字符数据的数组,每一个的数组,每一个元元素素存放一个存放一个字符字符。一、程序中定义字符数组一、程序中定义字符数组v例、例、charc10;/*定义定义c为字符数组,包含为字符数组,包含10个元素个元素*/vc0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;v注意:注意:v字符型与整型字符型与整型可以通用可以通用,但有区别:,但有区别:

32、 char c10; /* char c10; /* 在内存中占在内存中占1010字节字节 */ */ intint c10; /* c10; /* 在内存中占在内存中占2020字节字节 */ */二、字符数组的初始化二、字符数组的初始化1 1、逐个逐个元素初始化元素初始化vstatic char c10 = I,static char c10 = I, ,a,m,a,m, ,h,a,p,p,y;,h,a,p,p,y;2 2、初始化数据少于数组长度初始化数据少于数组长度, ,多余多余元素自动为元素自动为“空空”(0,0,二进制二进制0 0)。)。vstatic char c10 = stati

33、c char c10 = c,p,r,o,g,r,a,mc,p,r,o,g,r,a,m;/* ;/* 9 */ 9 */ 3、指定初值时,若未指定数组长度,则指定初值时,若未指定数组长度,则长度等长度等于初值个数(不加于初值个数(不加0)。vstaticcharc=I,a,m,h,a,p,p,y; /* 10 */ ; /* 10 */ 三、字符数组的引用三、字符数组的引用v引用一个引用一个元素元素,得到一个,得到一个字符字符。例例7.2.1输出一个字符串。输出一个字符串。vmain()vstaticcharc10=I,a,m,a,b,o,y;vinti;vfor(i=0;i10;i+)vpr

34、intf(%c,ci);vprintf(n);vv输出结果:输出结果:Iamaboy例例6.7输出一个钻石图形。输出一个钻石图形。vmain()vstaticchardiamond5=v,*,v,*,*,v*,*,v,*,*,v,*;vinti,j;vfor(i=0;i5;i+)vfor(j=0;j5;j+)vprintf(%c,diamondij);vprintf(n);vv输出结果输出结果:四、字符串四、字符串v字符串例子:字符串例子: I am a boyI am a boy1 1、C C语言中,字符串作为字符数组处理。语言中,字符串作为字符数组处理。字符数组可以用字符数组可以用字符串字

35、符串来初始化,例来初始化,例: : static char c = I am happy; static char c = I am happy; 也可以这样初始化:(也可以这样初始化:(不要大括号不要大括号) static char c = I am happy; static char c = I am happy; 2 2、字符串在存储时,系统自动在其后加上字符串在存储时,系统自动在其后加上结束结束标志标志00(占一字节,其值为二进制(占一字节,其值为二进制0 0)。)。但字符数组但字符数组并不要求并不要求其最后一个元素其最后一个元素必须必须是是00,例,例:static char c

36、= China;:static char c = China; vstatic char c5 = China;static char c5 = China;vstatic char c10 = China;static char c10 = China;五、字符数组的输入输出五、字符数组的输入输出两种方法:两种方法:1、用、用“%c”格式符格式符逐个逐个输入输出。输入输出。2、用、用“%s”格式符按格式符按字符串字符串输入输出。输入输出。例例:staticcharc6;scanf(%s,c);printf(%s,c);v注意:注意:1 1)输出时,)输出时,遇遇00结束结束,且输出字符中,且

37、输出字符中不包不包含含00。2 2)“%“%s”s”格式输出字符串时,格式输出字符串时,printfprintf()()函数函数的输出项是的输出项是字符数组名字符数组名,而不是元素名。,而不是元素名。staticcharc6=China;printf(%s,c);printf(%c,c0);printf(%s,c0);3)“%s”格式输出时,即使数组长度大于格式输出时,即使数组长度大于字符串长度,字符串长度,遇遇0也结束。也结束。例例:staticcharc10=China;printf(“%s”,c);/*只输出只输出5个个字符字符*/4)“%s”格式输出时,若数组中包含一个格式输出时,若数

38、组中包含一个以上以上0,遇,遇第一个第一个0时结束。时结束。5 5)输入时,遇)输入时,遇回车键回车键结束,但获得的字符结束,但获得的字符中中不包含回车键不包含回车键本身本身,而是在字符串末而是在字符串末尾尾添添00。因此,定义的字符数组必。因此,定义的字符数组必须有足够的长度,以容纳所输入的字符。须有足够的长度,以容纳所输入的字符。如如: :输入输入5 5个字符,定义的字符数组至少个字符,定义的字符数组至少应有应有6 6个元素个元素。6)一个)一个scanf函数输入多个字符串,输入函数输入多个字符串,输入时以时以“空格空格”键作为字符串间的分隔。键作为字符串间的分隔。例例:staticcha

39、rstr15,str25,str35;scanf(%s%s%s,str1,str2,str3);输入数据:输入数据:Howareyou?str1、str2、str3获得的数据见下图。获得的数据见下图。例例:static char str13;:static char str13; scanf(%s,strscanf(%s,str););v输入:输入:How are you?How are you?v结果:仅结果:仅“How”How”被输入数组被输入数组strstrv如要想如要想strstr获得全部输入(包含空格及其获得全部输入(包含空格及其以后的字符),程序应设计为:以后的字符),程序应设计为

40、:vstatic char c13;static char c13;vintint i; i;vfor(i=0;i13;i+) ci = for(i=0;i13;i+) ci = getchargetchar();();7 7) C C语言中,数组名代表该数组的起始地址,语言中,数组名代表该数组的起始地址,因此,因此,scanfscanf()()函数中函数中不需要不需要地址运算符地址运算符& &。例例:static char str13;:static char str13; scanf(%s,strscanf(%s,str);); scanf(%s,scanf(%s,& &strstr);)

41、;8 8)不能采用不能采用赋值语句赋值语句将一个字符串直接赋将一个字符串直接赋给一个数组。给一个数组。例:例:char c10;c=“good”;char c10;c=“good”;v但是但是可以初始化可以初始化:如:如:char c = char c = “good”;“good”;六、字符串处理函数六、字符串处理函数v在在C C的的函数库函数库中,提供了一些字符串处理中,提供了一些字符串处理函数。字符串输入、输出函数:函数。字符串输入、输出函数:v在调用字符串输入、输出函数时,在程在调用字符串输入、输出函数时,在程序前面通常应设置一个相关的文件包含序前面通常应设置一个相关的文件包含预处理命

42、令(有关预处理命令将在第预处理命令(有关预处理命令将在第9 9章章介绍),即介绍),即v include include 1 1、puts()puts()函数:输出字符串(以函数:输出字符串(以00结尾)。结尾)。v例、例、static char c6=“China”; static char c6=“China”; printf、puts均以均以0结尾结尾.printf(%sn,c);printf需要格式控制符需要格式控制符%sputs(c);看书上例题(看书上例题(p146)puts不需要不需要格式控制符,且自动换行格式控制符,且自动换行2、gets()函数:输入字符串到数组。函数:输入字

43、符串到数组。v例例:staticcharstr12;gets(str);v注意:注意:gets()、puts()一次只能输入输出一次只能输入输出一个一个字符串。而字符串。而scanf()、printf()可以输可以输入输出入输出几个几个字符串。字符串。3、strcat():连接字符串。连接字符串。vstrcat(字符串字符串1,字符串字符串2);v功能:把功能:把“字符串字符串2”连接到连接到“字符串字符串1”的后面。从的后面。从str1原来的原来的0(字符串结(字符串结束标志)处开始连接。束标志)处开始连接。 注意:注意:v字字符符串串1 1一一般般为为字字符符数数组组,要要有有足足够够的的

44、空空间间,以确保连接字符串后,以确保连接字符串后不越界不越界;v字字符符串串2 2可可以以是是字字符符数数组组名名,字字符符串串常常量量或指向字符串的或指向字符串的字符指针(地址)字符指针(地址)。v( (p147)p147)例题例题4、strcpy():字符串拷贝。字符串拷贝。vstrcpy(字符串字符串1,字符串字符串2);v功功能能:将将“字字符符串串2”为为首首地地址址的的字字符符串串复复制制到到“字字符符串串1”为为首首地地址址的的字字符符数数组组中中。即即把把“字字符符串串2”的值拷贝到的值拷贝到“字符串字符串1”中。中。v例如:例如:vstaticcharstr110,str2=

45、“china”;vstrcpy(str1,str2);v执行后执行后str1的状态为:的状态为: C h i n a 0 0 0 0 0注意:注意:vstr1-一一般般为为字字符符数数组组,要要有有足足够够的的空空间间,以以确确保保复制字符串后不越界;复制字符串后不越界;vstr2-可可以以是是字字符符数数组组名名,字字符符串串常常量量或或指指向向字字符符串的字符指针(地址)。串的字符指针(地址)。v字字符符串串(字字符符数数组组)之之间间不不能能赋赋值值,但但是是通通过过此此函函数,可以数,可以间接达到赋值间接达到赋值的效果。的效果。5、strcmp():字符串比较字符串比较。vintstr

46、cmp(字符串字符串1,字符串字符串2);v比较比较“字符串字符串1”、“字符串字符串2”,v例例:strcmp(str1,str2);strcmp(China,Korea);strcmp(str1,Beijing);v比较规则:比较规则:逐个字符比较逐个字符比较ASCII码码,直到,直到遇到遇到不同字符或不同字符或0,比较结果是该函,比较结果是该函数的返回值。数的返回值。v字符串字符串1字符串字符串2,strcmp()返回值返回值字符串字符串2,strcmp()返回值返回值0v长度不同的字符串也可以进行比较,比较长度不同的字符串也可以进行比较,比较结果当然是结果当然是“不同不同”。v长度不同

47、的字符串也可以进行比较,比长度不同的字符串也可以进行比较,比较结果当然是较结果当然是“不同不同”。v注意注意: :字符串只能用字符串只能用strcmpstrcmp函数比较,函数比较,不不能用关系运算符能用关系运算符“=”“=”比较。比较。v例例:if (strcmp(str1,str2)= 0) :if (strcmp(str1,str2)= 0) printf(yes);printf(yes); if (str1 = str2) if (str1 = str2) printf(yes); printf(yes); 6 6、求字符串的长度函数求字符串的长度函数strlen(strstrlen(

48、str) )v功功能能:统统计计strstr为为起起始始地地址址的的字字符符串串的的长长度度(不不包包括括“字字符符串串结结束束标标志志”),并并将其作为函数值返回。将其作为函数值返回。v注意:注意:在调用字符串处理函数时,在程在调用字符串处理函数时,在程序前面应设置一个相关的文件包含预处序前面应设置一个相关的文件包含预处理命令,理命令,即即# #include include 7.3.4 7.3.4 字符数字符数组应用用举例例例例7.8输入一行字符,统计其中有多少个单输入一行字符,统计其中有多少个单词(单词间以空格分隔)。词(单词间以空格分隔)。v比如,输入比如,输入“Iamaboy.,有有

49、4个单个单词。词。v算法:算法:单词的数目由单词的数目由空格出现的次数空格出现的次数决定(连决定(连续出现的空格记为出现一次;一行开头的空格续出现的空格记为出现一次;一行开头的空格不算。)。应逐个检测每一个字符是否为空格。不算。)。应逐个检测每一个字符是否为空格。用用num表示单词数(初值为表示单词数(初值为0)。)。word=0表示前一字符为空格,表示前一字符为空格,word=1表示前一字符表示前一字符不是空格,不是空格,word初值为初值为0。如果前一字符是空。如果前一字符是空格,当前字符不是空格,说明出现新单词,格,当前字符不是空格,说明出现新单词,num加加1。v框图如下:框图如下:v

50、程序:程序:#includestdio.h/*gets()函数在该头文件定义函数在该头文件定义*/vmain()vvcharstring81;vinti,num=0,word=0;vcharc;vgets(string);vfor(i=0;(c=stringi)!=0;i+)vif(c=)word=0;velseif(word=0)vv第7章 数组vword=1;vnum+;vvprintf(Thereare%dwordsinthelinen,num);v例例7.9输入三个字符串,并找出其中最大输入三个字符串,并找出其中最大者。者。v分析:用分析:用strcmp()函数函数比较字符串的大比较字

51、符串的大小。首先比较前两个,把小。首先比较前两个,把较大者拷贝给较大者拷贝给字符数组变量字符数组变量string(用用strcpy()函数拷函数拷贝),再比较贝),再比较string和第三个字符串。和第三个字符串。v程序:设字符串最长为程序:设字符串最长为19个字符。个字符。v#includestring.h/*strcmp、strcpy函数均在函数均在string.h中定义中定义*/vmain()vcharstring20;/*存最大字符串存最大字符串*/vcharstr320;/*三个字符串三个字符串*/vinti;vfor(i=0;i0)strcpy(string,str0);velse

52、vstrcpy(string,str1);vif(strcmp(str2,string)0)strcpy(string,str2);vprintf(nthelargeststringis:n%sn,string);vv小结:小结:数组是程序设计的数组是程序设计的常用数据结构常用数据结构,字符串,字符串(字符数组)在现代程序中也用得相当普遍,应(字符数组)在现代程序中也用得相当普遍,应掌握它们的意义和用法。掌握它们的意义和用法。1、数组(、数组(一维和二维一维和二维,多维)名、数组元素的,多维)名、数组元素的概概念。念。一维数组常与一重一维数组常与一重循环配合循环配合、二维数组常与、二维数组常与二重循环配合,对数组元素依次进行处理。二重循环配合,对数组元素依次进行处理。2、数组必须先、数组必须先定义后使用定义后使用,数组的初始化方法。,数组的初始化方法。3、数组元素在内存中的、数组元素在内存中的存储顺序存储顺序。4、数据排序算法。(、数据排序算法。(冒泡冒泡排序法)排序法)5、字符串的特点(、字符串的特点(作为字符数组作为字符数组处理、处理、最后一字节加最后一字节加0)。)。6、字符串处理函数的应用。、字符串处理函数的应用。v作业:作业:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号