1、第第4章章 数组和字符串数组和字符串2第第4 4章章 数组数组4.1 一维数组一维数组 4.2 二维数组二维数组 4.3 字符数组字符数组 4.4 数组元素的查找和排序数组元素的查找和排序 本章内容本章内容3第第4 4章章 数组数组v构造类型数据是由一些基本类型数据按照一定的构造类型数据是由一些基本类型数据按照一定的规则组成。数组类型是构造类型数据的一种。规则组成。数组类型是构造类型数据的一种。v数组是有序数据的集合,数组中的每一个元素都数组是有序数据的集合,数组中的每一个元素都属于同一个数据类型。属于同一个数据类型。v用一个统一的数组名和下标来唯一地确定数组中用一个统一的数组名和下标来唯一地
2、确定数组中的元素。的元素。例如:例如:intint sum3;sum3;说明一个整型数组,数组名称说明一个整型数组,数组名称sumsum,共有,共有3 3个个intint型变量型变量元素:元素:sum0sum0,sum1sum1,sum2sum2v注意:注意:数组名代表该数组在内存中的首地址。数组名代表该数组在内存中的首地址。4第第4 4章章 数组数组v数组的基本概念:数组的基本概念:v所谓所谓数组数组,是若干个相同类型数据元素的有序集,是若干个相同类型数据元素的有序集合。所起的名字称为合。所起的名字称为数组名。数组名。v用对应的序号来区分这个集合中的一个个元素。用对应的序号来区分这个集合中的
3、一个个元素。序号称为数组元素的序号称为数组元素的下标下标v用一个下标来区分其元素的数组,称为用一个下标来区分其元素的数组,称为一维数组一维数组;用两个或多个下标来区分其元素的数组,称为用两个或多个下标来区分其元素的数组,称为二二维数组维数组或或多维数组多维数组5 4.1 4.1 一维数组一维数组本节内容本节内容 4.1.2 一维数组的初始化一维数组的初始化 4.1.3 一维数组元素的引用一维数组元素的引用 4.1.4 一维数组的应用举例一维数组的应用举例 4.1.1 一维数组的定义一维数组的定义64.1 4.1 一维数组一维数组v只有一个下标变量的数组叫做只有一个下标变量的数组叫做一维数组一维
4、数组。v数组是一组变量,这组变量具有相同的名字,相数组是一组变量,这组变量具有相同的名字,相同的数据类型,并且在存储器中连续存放。同的数据类型,并且在存储器中连续存放。v每一个变量称为数组的一个每一个变量称为数组的一个“数组单元数组单元”,保存,保存在其中的数据值称为在其中的数据值称为“数组元素数组元素”。用。用“下标变下标变量量”来标识来标识区分数组中的各数组元素。区分数组中的各数组元素。v数组按下标个数分类有一维数组按下标个数分类有一维二维二维三维数组等。三维数组等。一维数组的数组名后只有一对方括号,而二维数一维数组的数组名后只有一对方括号,而二维数组的数组名后面有两对方括号。组的数组名后
5、面有两对方括号。74.1.1 4.1.1 一维数组的定义一维数组的定义v一维数组的定义方式为:一维数组的定义方式为:v类型说明符类型说明符 数组名数组名 常量表达式常量表达式;v例如:例如:intint a6 a6;v如图,编译时分配连续内存单元。如图,编译时分配连续内存单元。a00145a1a2a3a4a523a8v注意事项:注意事项:数组名的命名遵循标识符命名规则。数组名的命名遵循标识符命名规则。类型说明符说明该数组中数组元素的数据类型。类型说明符说明该数组中数组元素的数据类型。数组名后是用方括号括起来的常量表达式。数组名后是用方括号括起来的常量表达式。方括号中的常量表达式表示数组中元素的
6、个数。方括号中的常量表达式表示数组中元素的个数。C C语言规定数组元素的下标从语言规定数组元素的下标从0 0开始,因此在开始,因此在intint a10 a10中的中的1010个元素,分别为个元素,分别为a0a9a0a9,不能使用,不能使用a10a10 。方括号中的常量表达式可以是常量或者符号常量,但方括号中的常量表达式可以是常量或者符号常量,但不能包含变量。不能包含变量。94.1.2 4.1.2 一维数组的初始化一维数组的初始化v数组的初始化即为数组元素赋初始值数组的初始化即为数组元素赋初始值 v用赋值语句为数组元素赋初值。例如:用赋值语句为数组元素赋初值。例如:intint a10 a10
7、;a0=0a0=0;a1=1a1=1;a2=2a2=2;v在定义数组时对数组全部元素赋初值。例如:在定义数组时对数组全部元素赋初值。例如:intint a10=0 a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;v在定义数组时对数组中一部分元素赋值。例如:在定义数组时对数组中一部分元素赋值。例如:intint a10=0 a10=0,1 1,2 2,3 3,44;v在定义数组时给数组全部元素赋值为在定义数组时给数组全部元素赋值为0 0。v为全部数组元素赋初值时,可以不指定数组长为全部数组元素赋初值时,可以不指定数组长度。例如:度。例如:intint a=0 a
8、=0,1 1,2 2,3 3,44;104.1.3 4.1.3 一维数组元素的引用一维数组元素的引用v数组元素引用的一般形式为:数组元素引用的一般形式为:v数组名数组名 下标下标 v引用数组元素的几点说明:引用数组元素的几点说明:下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如:“a0=a1+a2a0=a1+a2*a3a3a5a52”2”C C语言中数组元素的下标从语言中数组元素的下标从0 0开始,并且数组元素的下开始,并且数组元素的下标一定要小于数组的长度。标一定要小于数组的长度。C C语言规定只能逐个引用数组元素,而不能一次引用语言规定只能逐个引用数组元素,而不能一
9、次引用整个数组。整个数组。v C C语言规定,语言规定,数组名就是分配给该数组存储区的数组名就是分配给该数组存储区的首地址,即数组第一个元素存放的地址首地址,即数组第一个元素存放的地址。114.1.3 4.1.3 一维数组元素的引用一维数组元素的引用int a10;int i,max,min;printf(Please input:);for(i=0;i10;i+)scanf(%d,&ai);max=a0;min=a0;for(i=0;imax)max=ai;else if(aimin)min=ai;printf(max=%d;min=%d,max,min);124.1.4 4.1.4 一维数
10、组的应用举例一维数组的应用举例#include main()int score10;/10个评委的评分float mark;/记录最后得分int i;int max=-1;/最高分int min=101/最低分int sum=0;/10个评委评分的总和for(i=0;i10;i+)/输入10个分数printf(Please Enter the Score of No.%d:,i+1);scanf(%d,&scorei);sum=sum+scorei;134.1.4 4.1.4 一维数组的应用举例一维数组的应用举例 for(i=0;imax)max=scorei;for(i=0;i10;i+)/
11、遍历数组,找最低分 if(scoreimin)min=scorei;mark=(sum-max-min)/8.0;/求平均 printf(The mark of this singer is%4.2fn,mark);144.1.4 4.1.4 一维数组的应用举例一维数组的应用举例154.1.4 4.1.4 一维数组的应用举例一维数组的应用举例v利用数组计算利用数组计算FibonacciFibonacci数列的前数列的前1010个数个数,并按每并按每行打印行打印5 5个数的格式输出。个数的格式输出。v其中:其中:FibonacciFibonacci数列计算公式如下:数列计算公式如下:F1=1F1
12、=1,F2=1F2=1,F3=F1+F2F3=F1+F2,Fn=Fn-2+Fn-1Fn=Fn-2+Fn-1。#include void main()int i;int f10=1,1;/用数组存储Fibonacci数列,并赋初值 /f0=1,f1=1,f2=f3=f9=0 for(i=2;i10;i+)/为f2f9按计算公式重新赋值 fi=fi-2+fi-1;164.1.4 4.1.4 一维数组的应用举例一维数组的应用举例for(i=0;i10;i+)/输出10个Fibonacci数 printf(%dt,fi);if(i+1)%5=0)/i+1为当前输出的Fibonacci数的序号 prin
13、tf(n);/每输出五个数换行17 4.1 4.1 二维数组二维数组本节内容本节内容 4.2.2 二维数组的初始化二维数组的初始化 4.2.3 二维数组元素的引用二维数组元素的引用 4.2.4 二维数组的应用举例二维数组的应用举例 4.2.1 二维数组的定义二维数组的定义184.2.1 4.2.1 二维数组的定义二维数组的定义v二维数组定义的一般形式为:二维数组定义的一般形式为:v类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22;v例如,例如,“intint a23;a23;”(注意,不能写成(注意,不能写成“intint a2,3a2,3;”;”)定义了数
14、组)定义了数组a a。数组。数组a a为为3 3行行4 4列的整型数列的整型数组,即数组元素为组,即数组元素为:a00,a01,a02a00,a01,a02 a10,a11,a12a10,a11,a12194.2.1 4.2.1 二维数组的定义二维数组的定义v二维数组可以看作是由一维数组嵌套构成的。二维数组可以看作是由一维数组嵌套构成的。v我们可以把二维数组看作是一种特殊的一维数我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。组:它的元素又是一个一维数组。v例如,可以把数组例如,可以把数组a a看作一个一维数组,它有三看作一个一维数组,它有三个元素:个元素:a0a0、a1
15、a1,每一个元素又是一个包,每一个元素又是一个包含含3 3个元素的一维数组。个元素的一维数组。a0a0 a00a00a01a01a02a02a1a1 a10a10a11a11a12a12204.2.2 4.2.2 二维数组的初始化二维数组的初始化v按行分段整体初始化。按行分段整体初始化。intint a34=1,4,6,6,4,6,7,1,8,4,1,0,;a34=1,4,6,6,4,6,7,1,8,4,1,0,;v按行连续整体初始化。按行连续整体初始化。intint a34=1,4,6,6,4,6,7,1,8,4,1,0;a34=1,4,6,6,4,6,7,1,8,4,1,0;v按行分段部分
16、初始化。按行分段部分初始化。intint a34=5,7,1,8,5,2,5,6;a34=5,7,1,8,5,2,5,6;v按行连续部分初始化。按行连续部分初始化。intint a34=2,5,8,6,2,4,7,2,1,;a34=2,5,8,6,2,4,7,2,1,;v如果提供全部的初始值,在定义时可不指明第如果提供全部的初始值,在定义时可不指明第一维的长度。一维的长度。int4=4,5,0,1,3,5,7,6,1,0,2,3;int4=4,5,0,1,3,5,7,6,1,0,2,3;214.2.3 4.2.3 二维数组元素的引用二维数组元素的引用v维数组元素的表示形式为:维数组元素的表示形
17、式为:v数组名数组名 下标下标11下标下标22v下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。v要严格区分定义数组时的要严格区分定义数组时的intint a34 a34和引用元素和引用元素时的时的a34a34。v定义时,定义时,a34a34用来定义数组的维数和各维的大用来定义数组的维数和各维的大小。引用时,小。引用时,a34a34中的中的3 3和和4 4是下标值,显然引是下标值,显然引用数组用数组a a中第中第4 4行第行第5 5列位置上的的元素列位置上的的元素a34a34是是错误的,因为二维数组的下标和一维数组一样都错误的,因为二维数组的下标和一维数组一样都是从是从0 0开
18、始,即数组开始,即数组a a的下标的下标1 1的范围是的范围是0202,下标,下标2 2的范围是的范围是0303。224.2.4 4.2.4 二维数组的应用举例二维数组的应用举例#include#define N 3main()int i,j,n;int aNN,bNN;printf(please input:n);for(i=0;i=N-1;i+)/循环输入 for(j=0;j=N-1;j+)printf(a%d%d:,i,j);scanf(%d,&aij);for(i=0;i=N-1;i+)/a行列互换得到转置矩阵存入b for(j=0;j=N-1;j+)bij=aji;234.2.4 4
19、.2.4 二维数组的应用举例二维数组的应用举例for(i=0;i=N-1;i+)/输出两个矩阵 for(j=0;j=N-1;j+)/输出数组a的第i+1行 printf(%2d,aij);printf(t);/矩阵的间隔 for(j=0;j=N-1;j+)/出数组b的第i+1行 printf(%2d,bij);printf(n);244.2.4 4.2.4 二维数组的应用举例二维数组的应用举例25 4.3 4.3 字符数组字符数组本节内容本节内容 4.3.2 字符串与字符数组字符串与字符数组 4.3.3 字符数组的初始化字符数组的初始化 4.3.4 字符数组的引用字符数组的引用 4.3.1 字
20、符数组的定义字符数组的定义26 4.3 4.3 字符数组字符数组本节内容本节内容 4.3.6 常用字符串处理函数常用字符串处理函数 4.3.7 综合应用举例综合应用举例 4.3.5 字符数组的应用举例字符数组的应用举例274.3.1 4.3.1 字符数组的定义字符数组的定义v用来存放字符数据的数组是用来存放字符数据的数组是字符数组字符数组,字符数组,字符数组中的一个数组元素存放一个字符。中的一个数组元素存放一个字符。v字符数组的定义一般形式如下:字符数组的定义一般形式如下:vchar char 数组名数组名 常量表达式常量表达式 v例如例如“char c10;”char c10;”定义了一个一
21、维字符数组定义了一个一维字符数组c c,它的长度为它的长度为1010,可以存放,可以存放1010个字符或一个长度不个字符或一个长度不大于大于9 9的字符串。的字符串。v又如又如“char c35;”char c35;”定义了一个二维字符数组定义了一个二维字符数组c c,它可以存放,它可以存放1515个字符或个字符或3 3个长度不大于个长度不大于4 4的字符的字符串。串。284.3.2 4.3.2 字符串与字符数组字符串与字符数组vC C语言中有字符串常量,却没有字符串变量,通语言中有字符串常量,却没有字符串变量,通常用字符数组来存放字符串。常用字符数组来存放字符串。v字符串是以字符串是以00作
22、为结束符的字符序列作为结束符的字符序列。v当一个字符串存入字符数组时,当一个字符串存入字符数组时,C C编译系统会自编译系统会自动将结束符动将结束符00存入数组,以此作为该字符串存入数组,以此作为该字符串结束的标志,这要比用字符逐个的给字符数组赋结束的标志,这要比用字符逐个的给字符数组赋值多占一个字节来存放字符串结束标志值多占一个字节来存放字符串结束标志00。如:如:char c8=Li Chen;char c8=Li Chen;L Li i C Ch he en n00294.3.2 4.3.2 字符串与字符数组字符串与字符数组v采用采用00标志作为字符串的结束标志后,在用标志作为字符串的结
23、束标志后,在用字符串赋初值时无需指定数组的长度,可以由编字符串赋初值时无需指定数组的长度,可以由编译系统自动处理。译系统自动处理。如:如:char c=Li Chen;char c=Li Chen;在内存中占在内存中占8 8个字节,分别存储个字节,分别存储L,i,L,i,C,h,e,nC,h,e,n和和00。v字符串常量字符串常量“Li ChenLi Chen”,”,代表字符串所在内存的代表字符串所在内存的首地址,而不是字符串序列本身首地址,而不是字符串序列本身,所以只能在定义所以只能在定义数组时用字符串常量初始化,不能给已经定义好数组时用字符串常量初始化,不能给已经定义好的数组赋字符串常量。
24、的数组赋字符串常量。如不能:如不能:char c10;char c10;C10=C10=Li Chen;Li Chen;304.3.3 4.3.3 字符数组的初始化字符数组的初始化v对字符数组初始化,最容易理解的方式是用字对字符数组初始化,最容易理解的方式是用字符常量初始化字符数组。如:符常量初始化字符数组。如:char c110=I,a,m,h,a,char c110=I,a,m,h,a,p,p,y;p,p,y;v用字符串常量初始化字符数组。如:用字符串常量初始化字符数组。如:char c4=I am happy;char c4=I am happy;char c511=I am happy
25、;char c511=I am happy;v总之,对字符数组赋值可以有以下几种形式:总之,对字符数组赋值可以有以下几种形式:char c68=Li Chen;char c68=Li Chen;char c7=Li Chen;char c7=Li Chen;char c8=L,i,C,h,e,nchar c8=L,i,C,h,e,n;314.3.3 4.3.3 字符数组的初始化字符数组的初始化v区分区分00与与000=0逻辑逻辑假假0=48逻辑逻辑真真0与与0324.3.3 4.3.3 字符数组的初始化字符数组的初始化v区分区分AA与与AAAA1.1.占占1 1个字节个字节;2.2.是数值是数
26、值;3.3.格式符格式符%c c;4.4.赋值方式:赋值方式:char char chch;chch =A;A;或或char char chch=A;=A;1.1.占占2 2个字节个字节;2.2.是地址是地址;3.3.格式符格式符%s s;4.4.赋值方式:赋值方式:char schar s2;2;strcpystrcpy(s,A(s,A););或或char schar s22=A;=A;334.3.4 4.3.4 字符数组的引用字符数组的引用v字符数组的引用和前边介绍过的数组的引用是一字符数组的引用和前边介绍过的数组的引用是一样的,只不过引用字符数组中的一个元素,我们样的,只不过引用字符数组
27、中的一个元素,我们得到的是一个字符。得到的是一个字符。char c=Li Chen;char c=Li Chen;char f=c3;char f=c3;vf f的内容为的内容为:C:C344.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#include main()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(%c,ci);printf(n);354.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#include main()char diamond5=,*,*,*,*,*,*,*,*;int i,j;for(i=
28、0;i5;i+)for(j=0;j5;j+)printf(%c,diamondij);printf(n);364.3.5 4.3.5 字符数组的应用举例字符数组的应用举例v可以用可以用printfprintf()()函数和函数和scanfscanf()()函数一次性输入函数一次性输入输出一个字符串,而不必使用循环语句逐个地输输出一个字符串,而不必使用循环语句逐个地输入输出每个字符。入输出每个字符。#include main()char c10;scanf(%s,c);printf(%sn,c);374.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#include main()cha
29、r num4,name20,sex=male;int i;printf(Please input Num:);for(i=0;i4;i+)scanf(%c,&numi);printf(Please input Name:);scanf(%s,name);printf(Num:%snName:%snSex:%sn,num,name,sex);384.3.5 4.3.5 字符数组的应用举例字符数组的应用举例394.3.6 4.3.6 常用字符串处理函数常用字符串处理函数vC C语言标准库提供了丰富的字符串处理的函数,大语言标准库提供了丰富的字符串处理的函数,大致可分为字符串基本处理函数和字符串与数
30、值数致可分为字符串基本处理函数和字符串与数值数据的转换函数两类。据的转换函数两类。v字符串基本处理函数包含在头文件字符串基本处理函数包含在头文件string.hstring.h中,中,字符串与数值数据的转换函数包含在头文件字符串与数值数据的转换函数包含在头文件stdlib.hstdlib.h中。中。v使用这类函数可以大大减轻编程量。使用这类函数可以大大减轻编程量。v下面介绍几个最常用的字符串函数。下面介绍几个最常用的字符串函数。404.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.1 gets()4.3.6.1 gets()函数函数v格式:格式:vchar char*g
31、ets(chargets(char *string);string);v功能:从标准输入流中取一个字符串。功能:从标准输入流中取一个字符串。v4.3.6.2 puts()4.3.6.2 puts()函数函数v格式:格式:vintint puts(char puts(char*string);string);v功能:拷贝以空字符功能:拷贝以空字符00终结的字符串到标准输终结的字符串到标准输出流。出流。414.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include int main(void)char string80;printf(Input a string:);gets(s
32、tring);printf(The string input was:);puts(string);return 0;424.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v如果用如果用scanfscanf函数输入字符串时,空白符用于分隔函数输入字符串时,空白符用于分隔字符串,所以输入的字符串中不能包含空格。字符串,所以输入的字符串中不能包含空格。v如果用如果用getsgets函数输入字符串,当输入的字符串中函数输入字符串,当输入的字符串中含有空格时,空格是字符串中的有效字符,输出含有空格时,空格是字符串中的有效字符,输出中包含空格。表示中包含空格。表示getsgets函数并不以空格
33、作为字符函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,串输入结束的标志,而只以回车作为输入结束,并把回车转换为并把回车转换为00。v建议用建议用getsgets函数输入字符串。函数输入字符串。434.3.6 4.3.6 常用字符串处理函数常用字符串处理函数getsgets()()scanfscanf()()输入的字符串中输入的字符串中可包含空格可包含空格输入的字符串中输入的字符串中不可包含空格不可包含空格只能输入只能输入一个字符串一个字符串可连续输入可连续输入多个字符串多个字符串不可限定字符串的长度不可限定字符串的长度可限定字符串的长度可限定字符串的长度遇到遇到回车符回车符结
34、束结束遇到遇到空格符或回车符空格符或回车符结束结束444.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.3 4.3.6.3 strcatstrcat()()函数函数v格式:格式:vstrcatstrcat(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功能:字符串连接函数,把字符数组功能:字符串连接函数,把字符数组2 2中的字符串中的字符串连接到字符数组连接到字符数组1 1中字符串的后面,并删去字符串中字符串的后面,并删去字符串1 1后的串标志后的串标志00。v要注意的是,字符数组要注意的是,字符数组1 1应定义足够的长度,否则应定义足够的长度,否则不
35、能全部装入被连接的字符串。不能全部装入被连接的字符串。v本函数返回值是字符数组本函数返回值是字符数组1 1的首地址。的首地址。454.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()static char st130=My name is;char st210;printf(input your name:n);gets(st2);strcat(st1,st2);puts(st1);464.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.4 4.3.6.4 strcpystrcpy()()函数函数v格式:
36、格式:vstrcpystrcpy(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功能:把字符数组功能:把字符数组2 2中的字符串拷贝到字符数组中的字符串拷贝到字符数组1 1中。中。串结束标志串结束标志00也一同拷贝。也一同拷贝。v字符数组名字符数组名2 2,也可以是一个字符串常量。这时相,也可以是一个字符串常量。这时相当于把一个字符串赋给一个字符数组。当于把一个字符串赋给一个字符数组。v前面讲过,字符串常量是个地址,不能直接赋给一前面讲过,字符串常量是个地址,不能直接赋给一个字符数组。个字符数组。要给一个字符数组赋一个字符串常量要给一个字符数组赋一个字符串常量只能用只能用st
37、rcpystrcpy()()函数。函数。474.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()static char st115,st2=C Language;strcpy(st1,st2);/或:strcpy(st1,C Language);puts(st1);printf(n);484.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.5 4.3.6.5 strcmpstrcmp()()函数函数v格式:格式:vstrcmpstrcmp(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功
38、能:字符串比较函数,按照功能:字符串比较函数,按照ASCIIASCII码逐位比较两码逐位比较两个数组中字符串的对应位,并由函数返回值返回个数组中字符串的对应位,并由函数返回值返回比较结果。比较结果。字符串字符串1 1字符串字符串2 2,返回值,返回值0 0;字符串字符串11字符串字符串2 2,返回值,返回值00;字符串字符串11字符串字符串2 2,返回值,返回值00。本函数也可用于比较两个字符串常量,或比较数组和字本函数也可用于比较两个字符串常量,或比较数组和字符串常量。符串常量。494.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hm
39、ain()int k;static char st115,st2=C Language;printf(input a string:n);gets(st1);k=strcmp(st1,st2);if(k=0)printf(st1=st2n);if(k0)printf(st1st2n);if(k0)printf(st1st2n);504.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.6 4.3.6.6 strlenstrlen()()函数函数v格式:格式:vstrlenstrlen(字符数组名字符数组名););v功能:测字符串长度函数,测字符串的实际长度功能:测字符串长度
40、函数,测字符串的实际长度(不含字符串结束标志不含字符串结束标志0)0)并作为函数返回值。并作为函数返回值。514.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()int k;static char st=C language;k=strlen(st);printf(The lenth of the string is%dn,k);524.3.7 4.3.7 综合应用举例综合应用举例#define N 100#include main()char i,len;char stringN,c;printf(please input
41、a string:n);gets(string);printf(please input a char:n);scanf(%c,&c);for(i=0;stringi!=0;i+)/计算字符串中字符的个数 ;/循环体为空 len=i;534.3.7 4.3.7 综合应用举例综合应用举例 for(i=0;stringi!=0;i+)/在字符串中查找变量c中所存字符 if(stringi=c)break;/若找到,则退出循环 if(i+1=len)printf(found%dn,i+1);/i从0开始若找到则字符的位置应为i+1 else printf(not foundn);544.3.7 4.
42、3.7 综合应用举例综合应用举例#include#include main()char password=tcass;char p80;int time=0;do printf(Enter password:);gets(p);if(strcmp(p,password)=0)printf(OK!welcomen);break;else time+;while(time3);554.3.7 4.3.7 综合应用举例综合应用举例 if(time=3)printf(You are illegal usern);56 4.4 4.4 数组元素的查找和排序数组元素的查找和排序本节内容本节内容 4.4.2
43、 数组元素的排序数组元素的排序 4.4.1 字符元素的查找字符元素的查找574.4.1 4.4.1 字符元素的查找字符元素的查找#include void main()int a10;int i,max,min;printf(Please input:);for(i=0;i10;i+)/输入10个数存入数组a scanf(%d,&ai);max=a0;min=a0;/假定最大最小值均是a0for(i=1;imax)max=ai;/若aimax,则修改max的值else if(aimin)min=ai;/若aia1a0a1,则交换;然后比较第,则交换;然后比较第2 2个数与个数与第第3 3个数;
44、依次类推,直至第个数;依次类推,直至第n-1n-1个数和第个数和第n n个数比个数比较为止。结果最大的数被安置在最后一个元素位较为止。结果最大的数被安置在最后一个元素位置上。置上。v2.2.第二趟冒泡排序:对前第二趟冒泡排序:对前n-1n-1个数进行冒泡排序,个数进行冒泡排序,结果使次大的数被安置在第结果使次大的数被安置在第n-1n-1个元素位置。个元素位置。v3.3.重复上述过程,经过重复上述过程,经过n-1n-1趟冒泡排序后结束。趟冒泡排序后结束。v4.4.在第在第j j趟比较中,要进行趟比较中,要进行n-jn-j次两两比较。次两两比较。604.4.2 4.4.2 数组元素的排序数组元素的
45、排序for(i=0;iN;i+)输入输入ai for(j=1;jN;j+)for(i=0;iai+1 T F ai与与ai+1交换交换输出输出a0aN-1614.4.2 4.4.2 数组元素的排序数组元素的排序38 49 65 76 13 27 30 第二趟第二趟38 49 65 13 27 30 第三趟第三趟38 49 13 27 30 第四趟第四趟38 13 27 30 第五趟第五趟13 27 30 第六趟第六趟13 27 第七趟第七趟49 38 65 97 76 13 27 30 第一趟第一趟384976971397279730971376767627301365276530651313
46、4949304927382738303813 每趟结束时,不仅能挤出一每趟结束时,不仅能挤出一个最大值到最后面位置,还个最大值到最后面位置,还能同时部分理顺其它元素;能同时部分理顺其它元素;62数组元素的排序和查找数组元素的排序和查找v例例4.134.13:将:将1010个整数按照从小到大的顺序排序个整数按照从小到大的顺序排序#include#define NUM 10void main()int aNUM,i,j,temp;printf(input%d numbers:n,NUM);for(i=0;iNUM;i+)scanf(%d,&ai);for(i=1;iNUM;i+)/趟数,共趟数,共
47、NUM-1趟趟 for(j=0;jaj+1)/交换交换aj和和aj+1 temp=aj;aj=aj+1;aj+1=temp;printf(the sorted numbers:n);for(i=0;iNUM;i+)printf(%d ,ai);634.4.2 4.4.2 数组元素的排序数组元素的排序v对冒泡排序的改进对冒泡排序的改进:v在一次冒泡排序过程中如果发现在一次冒泡排序过程中如果发现没有交换操作没有交换操作,表明序列已经排好序了,便终止冒泡操作。表明序列已经排好序了,便终止冒泡操作。v为了标记在比较过程中是否发生了数据交换,在为了标记在比较过程中是否发生了数据交换,在程序中设立一个程序
48、中设立一个标志变量标志变量flagflag。在每趟比较前,。在每趟比较前,把把flagflag变量置为变量置为0 0;如果在这趟比较过程中发生了;如果在这趟比较过程中发生了交换,把变量交换,把变量flagflag的值置为的值置为1 1。在这一趟比较结束。在这一趟比较结束后判断:如果后判断:如果flagflag变量取值等于变量取值等于0 0,表示可以结束,表示可以结束排序过程,否则进行下一趟比较。排序过程,否则进行下一趟比较。64数组元素的排序和查找数组元素的排序和查找v例例4.134.13:将:将1010个整数按照从小到大的顺序排序个整数按照从小到大的顺序排序#include#define N
49、UM 10void main()int aNUM,i,j,temp,flag;printf(input%d numbers:n,NUM);for(i=0;iNUM;i+)scanf(%d,&ai);for(i=1;iNUM;i+)/趟数,共趟数,共NUM-1趟趟 for(j=0;jaj+1)/交换交换aj和和aj+1 temp=aj;aj=aj+1;aj+1=temp;flag=1;if(flag=0)break;printf(the sorted numbers:n);for(i=0;ia0aiai,则交换。第,则交换。第一趟选择排序的结果,最小的数被安置在第一个一趟选择排序的结果,最小的数
50、被安置在第一个元素位置上。元素位置上。v 2.2.将第将第2 2个数依次与第个数依次与第3 3个数、第个数、第4 4个数个数 第第n n个个数进行选择排序。第二趟选择排序的结果,次小数进行选择排序。第二趟选择排序的结果,次小的数被安置在第二个元素位置上。的数被安置在第二个元素位置上。v3.3.重复上述过程,经过重复上述过程,经过n-1n-1趟冒泡排序后结束。趟冒泡排序后结束。v4.4.在第在第j j趟比较中,要进行趟比较中,要进行n-jn-j次两两比较。次两两比较。664.4.2 4.4.2 数组元素的排序数组元素的排序for(i=0;iN;i+)输入输入ai for(j=0;jN-1;j+)