C语言课件第10章数组与字符串处理.ppt

上传人:小飞机 文档编号:5426537 上传时间:2023-07-05 格式:PPT 页数:56 大小:203KB
返回 下载 相关 举报
C语言课件第10章数组与字符串处理.ppt_第1页
第1页 / 共56页
C语言课件第10章数组与字符串处理.ppt_第2页
第2页 / 共56页
C语言课件第10章数组与字符串处理.ppt_第3页
第3页 / 共56页
C语言课件第10章数组与字符串处理.ppt_第4页
第4页 / 共56页
C语言课件第10章数组与字符串处理.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《C语言课件第10章数组与字符串处理.ppt》由会员分享,可在线阅读,更多相关《C语言课件第10章数组与字符串处理.ppt(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,a13 a2 一维数组有5个数组元素:a20,a21,a22,a23,a24 数组元素的数值类型均为:整型(int)

5、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=0;i=0;i-)printf(%d,ai);本例中第一个循环语句给a数组各元素赋值,然

6、后用第二个循环语句,输出数组元素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)根据定义的位置不同:在函数内部定义的数组,称为内部数组。在函数外部定义的数组,称为外部数组。(3)赋值语句和输入语句均

7、可使数组中的元素赋初值,但占用运行时间。简捷的方法是在程序运行之前使数组初始化。,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 a10=1;,(3)如不给数组赋初值,则元素值不确定,对于static型的数组,系统会自动赋以0或0。(4)如给全部元素赋

8、值,则在数组说明中,可以不给出数组元素的个数,编译系统根据初值个数确定数组长度。例如: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);,例10.4 求Fibonaci数列的前20项#include main()int i,fb20;fb0=1;fb1=1;for(i=1;i19;i+)fbi+1=

9、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 55 89,排序过程算法:(1)比较第一个数与第二个数,若为逆序a1a2,则交换;然后比较第二个数与第三个数;依次类推,直至第9个数和第10个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。(2)对前9个数进行第二趟冒泡排序,结果使次大的数被安置在第9个元素位置。(3)重复上述过程,共经过9趟冒泡排序后,排序结束。,例10.5用冒泡法对个数由小到大排序。排序的N-S图如图10.2所示

10、。,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 多 维 数 组,1.二维数组的定义(1)语句形式:类型说明符 数组名常量表达式1 常量表达式2 例如:float a34;定义a是一个3x4(3行4列)的数组,即a数组有12个元素。但不得写成:float a3,4;(2)二维数组中元素的排列顺序为按行按列。即存放

11、完第1 行的元素后再接着存放第 2 行的元素,依次类推。a00 a01 a03 a03 a10 a11 a12 a13 a20 a21 a22 a23,我们可把二维数组看作是一种特殊的一维数组,它的元素又是一个一维数组。例如:a34可看成 a0-a00 a01 a02 a03 a a1-a10 a11 a12 a13 a2-a20 a21 a22 a23a0 a2每个元素又是一个包含4个元素的一维数组。数组名:a 代表整个数组的首地址a 0:数组第0行的首地址 即第1个元素地址,2.二维数组元素的引用形式为:数组名行下标表达式列下标表达式(1)“行下标表达式”和“列下标表达式”,都应是整型表达

12、式或符号常量。(2)“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x34,则可用的行下标范围为02,列下标范围为03。(3)对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。,3.二维数组的初始化(1)按行给二维数组赋初值。如:static int a34=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 a

13、34=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 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维数组各元素赋值,并输出全部元素的值。#i

14、nclude stdio.h main()int i,j,a23;/*定义数组array*/for(i=0;i2;i+)/*外循环控制行数*/for(j=0;j3;j+)/*内循环控制列数*/scanf(“%d”,例10.7 输出一个3 4数组中每行中的最大元素之值及其位置。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=

15、3 max=9,row=2,colum=2 max=13,row=3,colum=2,1字符数组的定义 一维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样。二维字符数组,用于同时存储和处理多个字符串,其定义格式与2维数值数组一样。char s18,s2312;2字符数组的初始化 字符数组的初始化,可以通过为每个数组元素指定初值字符来实现。例如:char s38=”asdfggh”;,10.4 字符数组与字符串,char s48=a,b,c,d,e;static char d33=,;3字符串及其结束标志 字符串,是指若干有效字符的序列。C语言中的字符串,可以包括字母、数字、专

16、用字符、转义字符等。C语言规定:以 0 作为字符串结束标志。0 代表ASCII码为0的字符,表示一个空操作,只起一个标志作用。在 0 前面的字符的个数为该字符串的有效长度。,说明:由于系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。结束标志在字符数组中也要占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。字符数组并不要求它的最后一定要加0。是否加0,完全视需要而定。,4.字符数组的输入输出(1)用“%c”格式符逐个的输入或输出字符数组的字符。for(i=0;i11;i+)scanf(%s,ai);for(i=0;i11;i+)printf

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

18、s(str);输出:China Beijing,(4)字符数组的输入 scanf(“%s”,c);c为字符数组名,输入一个字符串,以回车键而不必以结束符0结束输入,系统会自动加上一个结束符0。同时字符数组名 c 前也不再加地址符&。若用一个scanf 函数输入多个字符串,则以空格作为字符串之间的分隔。函数:gets(字符数组)功能:从标准输入设备(stdin)键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中,例10.8 多种方法输入输出字符串#includemain()char str112,str212,str312;int i;for(i=0;i12;i+)scanf(%c,

19、例10.9 二维字符数组的改变#include#include main()int i;char a74=sun,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)该函数输入的字符

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

21、串”可以是串常量或字符数组。(2)函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。(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-pear2:name2

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

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

24、scr();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。若改成:char str10=“china”;str

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

26、 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();,实参为数 组元素作,float fun(float a,float b,float c)float sum,aver;

27、sum=a+b+c;a=a+5.5 b=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.数组名作函数参数 在用数组名作函数参数时,不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。因为数组名就是数组的首地址,所以在数组名作函数参数时是把实参

28、数组的首地址赋予形参数组名(即地址传递)。,使用说明:(1)数组名作为函数的形参和实参,应该在调用函数和被调用函数中分别定义数组,要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明,否则结果将出错。(2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。,例10.15 数组名作为实参#include main()float Expfun2(float a4);float s4=88.5,90.5,70,71;float ave;printf(s0=%

29、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 Expfun2(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/

30、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()char str80;int index=0;strcpy(str,Show this string.);/*字符串拷贝*/backwards(str,index);/*函数调用*/void backwards(char s,i

31、nt 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,同 学 们 再 见,程 序 设 计 基 础,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号