收藏 分享(赏)

第10章数组与字符串处理.ppt

上传人:dzzj200808 文档编号:3334299 上传时间:2018-10-14 格式:PPT 页数:56 大小:355.50KB
下载 相关 举报
第10章数组与字符串处理.ppt_第1页
第1页 / 共56页
第10章数组与字符串处理.ppt_第2页
第2页 / 共56页
第10章数组与字符串处理.ppt_第3页
第3页 / 共56页
第10章数组与字符串处理.ppt_第4页
第4页 / 共56页
第10章数组与字符串处理.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

1、教学内容:10.1 数组的概念 10.2 一维数组10.3 多维数组 10.4 字符数组与字符串 10.5 字符串处理函数10.6 数组作为函数参数,第10 章 数组与字符串处理,教学要求:1掌握数组的定义,及其数组元素的下标表示方法。 2掌握数组的初始化方法。掌握数组元素的引用,数组数据输入/输出方法。3掌握数组在程序设计中的应用,以及有关的算法,例如排序算法等。4掌握字符数组的应用方法。5掌握字符串处理函数的使用。,第10 章 数组与字符串处理,数组是最简单的一种构造类型。构造类型是由基本类型按一定规则构造而成的,一个构造类型数据可以分解为多个构造元素,这些元素可以是基本类型,也可以是构造

2、类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本类型或是构造类型。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。,10.1 数 组 的 概 念,在实际应用中,人们不可避免的要遇到“批量数据的存储和处理”问题。例如:在学生成绩管理系统中,可能需要对一个班 30 名学生的成绩进行输入,计算出平均分,然后输出所有高于平均分的成绩。为了便于处理,对于这样一组有着内在联系、具有相同性质的数据,可以按顺序组织起来,共用一个统一的名字,即:数组名。数组中各个数据的区分用数组名带下标的形式表示。我们可以为 30 名学生的成绩建立一个名为 s 的数组,30 个成

3、绩顺序存放在 s0s29这 30 个带下标的变量中,,1一维数组的定义 定义的语句形式: 类型说明符 数组名 常量表达式 (1)“数据类型”是指数组元素的数据类型。 (2) 数组名定名规则和变量名相同。 (3) 常量表达式, 必须用方括号括起来。它是一个整型值, 指定数组元素的个数,即数组的长度。 常量表达式其中可以包含常数和符号常量,但不能包含变量。,10.2 一 维 数 组,例如: int a10; 上述说明语句,定义了一个整型一维数组。数组名称:a ,有10个数组元素;系统分配10个连续的存储单元。数组的数据类型是:int 每一个数组元素的存储单元占用2个字节, 存放一个整型值。(4)

4、数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。上述数组的数组元素为:a0, a1, a2, a9,没有a10。,(5)数组名表示的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素按其下标顺序占用一段连续的存储单元. a 表示数组起始地址,(7) 数组说明语句一次可定义几个数组, 形式如下:数据类型 数组名常量表达式, 数组名2常量表达式2;例如: int a1 4 , a2 5 ;上述说明语句,定义了两个整型一维数组。数组名为:, a2 a1 一维数组有4个数组元素:a10, a11, a12, a13a2 一维数组有5个数组元素:a20, a21, a2

5、2, a23 , a24数组元素的数值类型均为: 整型(int )a1, a2, 分别代表各自数组的起始地址&a10 &a11 &a12 &a13 为各数组元素的地址,2. 数组元素的引用引用数组元素的形式:数组名下标表达式(1) “下标表达式”可以是任何非负整型数据,取值范围是0(元素个数-1)。int a8; 数组元数:a0 a7 (2)在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理。(3)下标不能越界。 (4)下标变量和我们前面的简单变量具有相同的地位和作用,可以象使用简单变量一样使用。,例10.1 数组元素的引用。main() int i,a10;for(i=

6、0;i=0;i-)printf(“%d“,ai);本例中第一个循环语句给a数组各元素赋值,然后用第二个循环语句,输出数组元素a9 a0的各个数值。输出结果:9 8 7 6 5 4 3 2 1 0,数组元素引用可以用变量,定义数组,元素个数不能用变量,例10.2 数组元素引用 main( ) int a4; float b3;a0=3; a1=4; a2=a1*14; a3=23;scanf(“%f%f%f”, ,3 4 56 23,a0 a1 a2 a3,a,定义数组, 元素个数不能用变量,说明: (1)根据存储类型的不同,数组有静态数组(static)和动态数组(auto)之分;(2)根据定

7、义的位置不同: 在函数内部定义的数组,称为内部数组。 在函数外部定义的数组,称为外部数组。(3)赋值语句和输入语句均可使数组中的元素赋初值,但占用运行时间。简捷的方法是在程序运行之前使数组初始化。,3. 一维数组元素的初始化格式数据类型 数组名常量表达式初值表;(1)只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。例如: int a10=0,1,2,3,4;表示只给a0a45个元素赋值,而后5个元素自动赋0值。(2)只能给元素逐个赋值,不能给数组整体赋值。 例如给十个元素全部赋1值,只能写为:int a10=1,1,1,1,1,1,1,1,1,1; 而不能写为:int

8、a10=1;,(3)如不给数组赋初值,则元素值不确定,对于static型的数组,系统会自动赋以0或0。 (4)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数,编译系统根据初值个数确定数组长度。例如: int a5=1,2,3,4,5; 可写为:int a=1,2,3,4,5; (5)若花括弧中提供的初值个数大于数组长度,则按语法错误处理。,例10.3 求数组中8个数的最大值 # include main( ) int i, max, a8=2, 5, 9, 6, 35, 7, 67, 49;for ( i=0; imax ) max=ai;printf( “max=%dn”,max

9、);,例10.4 求Fibonaci数列的前20项#include main() int i, fb20;fb0=1; fb1=1;for( i=1; i19; i+)fbi+1 = fbi+fbi-1;for( i=0; i20; i+) if ( i%5=0) printf(“n“);printf(“%7d“,fbi); ,Fibonaci数列的前20项:1 1 2 3 5 8 13 21 34 5589 ,排序过程算法: (1)比较第一个数与第二个数,若为逆序a1a2,则交换;然后比较第二个数与第三个数;依次类推,直至第9个数和第10个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一

10、个元素位置上。 (2)对前9个数进行第二趟冒泡排序,结果使次大的数被安置在第9个元素位置。 (3)重复上述过程,共经过9趟冒泡排序后,排序结束。,例10.5用冒泡法对个数由小到大排序。排序的N-S图如图10.2所示。,ai ai+1,图 10.2,main( ) int i, j, t, a11;printf(“input 10 numbers :n”);for ( i=1; iai+1 ) t=ai; ai=ai+1; ai+1= t; printf(“the sorted numbers :n”);for (i=1; i11; i+) printf(“%d”,ai); ,10.3 多 维

11、数 组,1. 二维数组的定义(1)语句形式:类型说明符 数组名常量表达式1 常量表达式2例如:float a34;定义a是一个3x4 (3行4列)的数组,即a数组有12个元素。但不得写成:float a3,4;(2) 二维数组中元素的排列顺序为按行按列。即存放完第1 行的元素后再接着存放第 2 行的元素,依次类推。a00 a01 a03 a03 a10 a11 a12 a13 a20 a21 a22 a23,我们可把二维数组看作是一种特殊的一维数组,它的元素又是一个一维数组。例如:a34可看成a0-a00 a01 a02 a03a a1-a10 a11 a12 a13a2-a20 a21 a2

12、2 a23 a0 a2每个元素又是一个包含4个元素的一维数组。 数组名: a 代表整个数组的首地址 a 0:数组第0行的首地址 即第1个元素地址,2. 二维数组元素的引用形式为: 数组名行下标表达式列下标表达式 (1) “行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。 (2) “行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。 假设有数组x34,则可用的行下标范围为02,列下标范围为03。 (3) 对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。,3. 二维数组的初始化(1) 按行给二维数组赋初值。如:static int a34

13、=1,2,3,4,5,6,7,8,9,10,11,12; 这种方法比较直观,一行对一行,不易遗漏,易于检查。(2) 顺序按行按列给二维数组赋初值。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3) 可以对部分元素赋初值。如:static int a34=1,5,9;static int a34=1,0,6,0,0,11;static int a34=1,5,6;static int a34=1, ,9;注意:所赋给的值是按行按列对号入座的。,(4) 对二维数组的全部元素赋初值时,可以不指定第一维的长度,但不得省去第二维的长度。如:static int

14、 a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成:static int a 4=1,2,3,4,5,6,7,8,9,10,11,12;同样,static int a 4=0,0,3, ,0,10; 也是正确的。,例10.6 给一个23的2维数组各元素赋值,并输出全部元素的值。 #include “stdio.h“main() int i, j, a23; /*定义数组array*/for( i=0; i2; i+ ) /*外循环控制行数*/for( j=0; j3; j+) /*内循环控制列数*/scanf( “%d”, ,例10.7 输出一个3 4数组中每行中的最大元

15、素之值及其位置。 main( ) int i, j, c, max ;static int a34=6,-5,11,3,8,9,4,7,2,13,1,-10;for (i=0; imax) max=ai j; c=j;printf(“max=%2d,row=%d,colum=%dn”,max,i+1,c+1); ,输出结果:max=11, row=1, colum=3max= 9, row=2, colum=2max=13, row=3, colum=2,1字符数组的定义一维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样。二维字符数组,用于同时存储和处理多个字符串,其定义格式

16、与2维数值数组一样。char s18, s2312;2字符数组的初始化字符数组的初始化,可以通过为每个数组元素指定初值字符来实现。例如:char s38= ” asdfggh ” ;,10.4 字符数组与字符串,char s48= a, b, c, d, e ;static char d33 = , , , , ,; 3字符串及其结束标志字符串,是指若干有效字符的序列。C语言中的字符串,可以包括字母、数字、专用字符、转义字符等。C语言规定:以 0 作为字符串结束标志 。 0 代表ASCII码为0的字符,表示一个空操作,只起一个标志作用。在 0 前面的字符的个数为该字符串的有效长度。,说明:由于

17、系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。结束标志在字符数组中也要占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。 字符数组并不要求它的最后一定要加0。是否加0,完全视需要而定。,4.字符数组的输入输出 (1)用“%c”格式符逐个的输入或输出字符数组的字符。for(i=0;i11;i+) scanf( “%s“, ai ); for(i=0;i11;i+)printf( “%c“,ai );输出数组单个元素的数值,要指出元素的下标。(2)用“%s”格式符将整个字符串一次输入或输出。 printf(“%s”,c); 中c是字符数组名

18、,不是数组元素名。scanf( “%s“, ai );输入或输出时,并不输入或输出结束符0。,(3)字符数组的输出在用printf函数输出字符串时,当遇到0时就停止输出,系统不输出字符的定界符。 如果字符数组的长度大于字符串的实际长度,也只输出到0为止。如果字符数组中有多个0 ,则遇到第一个0时停止输出。 puts( )函数将一个以0结束的字符串输出到终端,且字符串中可以包含转义字符。如:static char str = “ChinanBeijing”;puts(str); 输出:ChinaBeijing,(4)字符数组的输入scanf( “%s”,c ); c为字符数组名,输入一个字符串,

19、以回车键而不必以结束符0结束输入,系统会自动加上一个结束符0。同时字符数组名 c 前也不再加地址符&。若用一个scanf 函数输入多个字符串,则以空格作为字符串之间的分隔。函数:gets(字符数组)功能:从标准输入设备(stdin)键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中,例10.8 多种方法输入输出字符串 #include main() char str13, str23, str33;int i;for(i=0;i3;i+)scanf(“%c“, ,例10.9 二维字符数组的改变 #include #include main() int i;char a74=“sun

20、“,“mon“,“tue“,“wed“,“thu“,“wen“,“sat“;printf(“Result is:n“); a03=,a,10.5 字符串处理函数,字符串标准函数的原型在头文件string.h中。 1输入字符串gets()函数 (1)调用方式:gets(字符数组) (2)函数功能:从标准输入设备(stdin)键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去。 (3)使用说明1)gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。2)该函数输入的字符串中允许包含空格,而scanf()函数不允许。,2输出字符串puts()函

21、数 (1)调用方式:puts(字符数组) (2)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用n取代字符串的结束标志0。用puts()函数输出字符串时,不要求另加换行符。 (3)使用说明 1)字符串中允许包含转义字符,输出时产生一个控制操作。 2)该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。,例10.10 统计字符串中字母的个数 int isalp(char c) if (c=a,3拷贝字符串 strcpy()函数 (1)调用方式:strcpy(字符数组, 字符串)其中“字符串”可以是串常量或字符数组。 (2)函数功能:将“字符

22、串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。 (3)使用说明 1)字符数组必须定义得足够大,以便容纳复制过来的字符串。连同结束标志0一起复制。 2)不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。,#include main( ) int i;char name16=“pear“;char name213=“Apple ,例10.11 字符拷贝函数 strcpy ()进行字符串复制,将name1中的字符串连同0一 起复制到name2,运行结果如下:,Result is: 1:name1-pear 2:name2-Apple&Banana

23、3:name1-pear 4:name2-pear 5:name1- pear &Banana,4连接字符串strcat()函数 (1)调用方式:strcat(字符数组, 字符串) (2)函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。 (3)使用说明:1)由于没有边界检查,要保证“字符数组”定义得足够大,以便容纳连接后的目标字符串2)连接前两个字符串都有结束标志0,连接后“字符数组”中存储的字符串的结束标志0被舍弃,只在目标串的最后保留一个0。,例10.12 字符串连接。

24、,运行结果:,5字符串比较strcmp()函数 (1)调用方式:strcmp(字符串1 ,字符串2) 其中“字符串”可以是串常量,也可以是1维字符数组。 (2)函数功能:比较两个字符串的大小。 如果:字符串1= =字符串2,函数返回值等于0;字符串1字符串2,函数返回值正整数。 (3)使用说明 1)如果一个字符串是另一个字符串从头开始的子串,则母串为大。 2)不能使用关系运算符“”来比较两个字符串,只能用strcmp() 函数来处理。,例10.13 gets 函数和 strcmp 函数的应用。 #include “stdio.h“ main() char passstr80; int i=0;

25、 while(1) clrscr(); printf(“请输入密码n“);gets(passstr); /*输入密码*/if (strcmp(passstr,“password”)!=0) printf(“口令错误,按任意键继续“);else break; /*输入正确的密码,中止循环*/getch(); i+;if(i=3) exit(0); /*输入三次错误密码退出程序*/fun(); /*输入正确密码所进入的程序段*/,字符串长度函数strlen格式:strlen(字符数组) 作用:测试字符串长度函数值:为字符串的实际长度,不包括0在内。例如: strlen(“china”); 结果是5

26、。若改成:char str10=“china”;strlen(str);结果也是5,不要误认为是10或是6。,字符串小写函数strlwr格式:strlwr(字符串) 作用:将字符串的大写字母转换成小写字母。请给出下面程序结果。main() char str1=“CHINA“;printf(“n%s“,strlwr(str1); 运行结果:china字符串大写函数strupr格式:strupr(字符串) 作用:将字符串中的小写字母转换成大写字母。,1.数组元素作函数参数用数组元素作实参时,由于数组元素与普通变量具有相同的地位和作用;对数组元素的处理是和普通变量一样的。,10.6 数组作为函数参数

27、,例10.14c 数组元素作为实参#include float fun( float a,float b,float c);main() float b3; float ave;b0=21.3; b1=b0/3; b2=8.2;printf(“b0=%4.1fn b1=%4.1fn” ,b0, b1);printf(“ b2=%4.1fn”, b2 );ave=fun( b0, b1, b2 );printf(“ ave=%4.1fn“,ave);printf(“b0=%4.1fnb1=%4.1fn”,b0,b1);printf(“ b2=%4.1fn”,b2);getch();,实参为数 组

28、元素作,float fun(float a,float b,float c) float sum, aver;sum=a+b+c; a=a+5.5b=b+5.5; c=c+5.5;aver=sum/3.0;printf(“ a=%4.1fn” ,a );printf(“ b=%4.1fn” ,b );printf(“ c=%4.1fn” ,c );return (aver);,用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。,2. 数组名作函数参数在用数组名作函数参数时,不是把实参数组的每一个元素的值都赋予

29、形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。 因为数组名就是数组的首地址,所以在数组名作函数参数时是把实参数组的首地址赋予形参数组名(即地址传递)。,使用说明: (1)数组名作为函数的形参和实参,应该在调用函数和被调用函数中分别定义数组,要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明,否则结果将出错。 (2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。,例10.15 数组名作为实参 #include mai

30、n() float Expfun2(float a4);float s4=88.5,90.5,70,71; float ave;printf(“s0=%4.1fns1=%4.1fn”,s0,s1 );printf(“ s2=%4.1fn s3=%4.1fn“,s2,s3);ave=Expfun2( s );printf(“ ave=%4.1fn“,ave);printf(“ s0=%4.1fn s1=%4.1fn”,s0,s1); printf(“ s2=%4.1fn s3=%4.1fn“,s2,s3);getch();,实参为数组名s,代表整个数组的首地址(一个地址常量),float Exp

31、fun2( float a4 ) float sum, aver;sum=a0+a1+a2+a3;aver=sum/4.0;a0=a0/10;a1=a1/10; a2=a2/10; a3=a3/10;printf(“ %4.1fn %4.1fn %4.1fn %4.1fn“,a0,a1,a2,a3);return (aver); ,数组名s为实参,数组首地址传递给形参数组a,数组a和数组s在内存中是同一存储单元,例10. 16 反向显示字符串 #include #include void backwards(char s,int index); /* 函数声明*/void main() cha

32、r str80; int index = 0;strcpy(str,“Show this string.“); /*字符串拷贝*/backwards(str,index); /*函数调用*/ void backwards(char s,int index) /*函数定义*/ if (sindex) printf(“%c“,sindex); /*输出字符*/backwards(s,index+1) ; /* 递归调用*/printf(“%c“,sindex); /* 输出字符*/ ,例10.17 已知某个学生5门课程的成绩,求平均成绩 Float aver( float a ) /*求平均值函数*/ int i; float av, s=a0; for(i=1;i5;i+) s += ai;av = s/5; return av; void main() float sco5, av; int i;printf(“n input 5 scores:n“);for(i=0;i5;i+) scanf(“%f“, ,同 学 们 再 见,程 序 设 计 基 础,

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报