《C语言程序设计》教案第四章数组—字符数组和字符串_第1页
《C语言程序设计》教案第四章数组—字符数组和字符串_第2页
《C语言程序设计》教案第四章数组—字符数组和字符串_第3页
《C语言程序设计》教案第四章数组—字符数组和字符串_第4页
《C语言程序设计》教案第四章数组—字符数组和字符串_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、授课题目学习必备欢迎下载C语言程序设计课程教案表课时安排2第四章数组(3)字符数组和字符串授课时间教学目的和要求1掌握:几种常用的字符串处理函数2熟悉:指针与数组。教学内容1基本内容:(1)几种常用的字符串处理函数(2)指针与数组。2重点:几种常用的字符串处理函数3难点:指针与数组讲课进程和时间分配1、复习与新知识导入(5分钟)2、字符串处理函数(45分钟)C语言编译系统中,提供了很多有关字符串处理的库函数。下面介绍几个常用的字符串处理函数。使用输入、输出字符和字符串函数时,应在函数前加上头文件“stdio.h”;使用其他字符串操作函数时,则应加上头文件“string.h”。板书:#inclu

2、de#include(1)字符串输出函数格式:puts(字符串)功能:将一个字符串(以0为结束标志)输出到终端。输出的字符串中可以包含转义字符。例如:charstr=“ChinanBeijing”;puts(str);输出:ChinaBeijing在输出时将字符串结束标志0转换成n,即输出完字符串后换行。板书:puts(str);与printf(”%sn”,str)等价或puts(“OK!”);与printf(“%sn”,”OK!”)或printf(“OK!n”)等价(2)字符串输入函数格式:gets(字符数组);功能:从终端输入一个字符串(可包含空格)以回车为输入结束标志,将接受到的字符依次

3、赋值给字符数组各个元素,并自动在字符串末尾加结束标记0。例如:gets(str);注意:用puts和gets函数只能输入或输出一个字符串,不能写成:puts(str1,str2)或:gets(str1,str2);说明:字符串可以是字符数组或字符串常量。而scanf()是以回车、空格或tab键做分隔符的。例:voidmain()chars100;printf(“请输入一个字符串:”);gets(s);printf(“输入的字符串是:”);puts(s);红色改为puts(gets(s),不影响程序运行结果。(3)连接两个字符串函数学习必备欢迎下载格式:strcat(字符串1,字符串2)功能:连

4、接两个字符串中的字符,把字符串2的字符连接到字符串1的字符后面,结果放在字符串1中,函数调用后得到一个函数值字符串1的起始地址。例如:charstr130=“peoplesrepublicof”;charstr2=“china”;printf(“%s”,strcat(str1,str2);输出:peoplesrepublicofchina说明:1)字符串1必须足够大,以便能容纳连接后的新字符串。2)连接前两个字符串后面都有一个0,连接时将字符串1后面的0取消,只在新串的最后保留一个0。思考:以下程序是正确的charc;c=A+B;那么,下面的程序呢?charc10;c=”A”+”B”;是不正确

5、的,必须用strcat()函数来连接。(4)字符串拷贝函数strcpy格式:strcpy(字符数组,字符串)功能:将字符串拷贝到字符数组中去。例如:charstr110,str2=“china”;strcpy(str1,str2);/*或strcpy(str1,“china”);*/执行后str1的内容为:china00000说明:1)字符数组必须足够大,以便能容纳被拷贝的字符串。2)拷贝时连同字符串后面的0一起拷贝到字符数组中。3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。下面的用法是错误的:str1=“china”;str1=str2;而只能用拷贝函数strcpy处理。

6、用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:chara5,c1,c2;c1=A;c2=B;a0=c;a1=h;a2=i;a3=n;a4=a;4)可以用strcpy函数将字符串中前面若干个字符拷贝到字符数组中去。例如:strcpy(str1,str2,2);将str2中前面2个字符拷贝到str1中去,然后再加一个0。(5)字符串比较函数格式:strcmp(字符串1,字符串2)功能:比较字符串1和字符串2的大小。说明:按照ASCII码值大小比较,将两个字符串自左至右逐个字符比较,直到出现不同的字符或遇到0为止。如果全部字符相同,则认为相等;如果出现不相同的字符,则以第

7、一个不相同字符的比较结果为准。1.字符串1=字符串2,函数值=0;2.字符串1字符串2,函数值0;3.字符串1字符串2,函数值str2只能用strcmp(str1,str2)0或=0或0来判断(6)测试字符串长度函数学习必备欢迎下载格式:strlen(字符数组)功能:测试字符串长度,函数值为字符串中实际长度,不包括0。例如:charstr10=“china”;printf(“%d”,strlen(str);结果为:5(7)字符串小写函数格式:strlwr(字符串)功能:将字符串中大写字母转换成小写字母。lwr是lowercase(小写)的缩写。(8)字符串大写函数格式:strupr(字符串)功

8、能:将字符串中小写字母转换成大写字母。upr是uppercase(大写)的缩写。(9)字符数组程序举例1)输入一个字符串,将其中的大写字母均变成小写字母。#include#includemain()chars40,c;inti=0;printf(“输入一个字串:”)gets(s);strlwr(s);printf(“输出转换后的字串:”)puts(s);2)从字符串中取出指定长度的子串。#includemain()chars140,s240;inti=0,m;printf(“n输入要截取子串的母串:”)gets(s2);printf(“n输入要截取子串的长度:”)scanf(“%d”,&m);

9、while(im)s1i=s2i;i+;s1i=0;printf(“n输出所截取的子串:%s”,s1);3)某单位的工作证号码的最后一位是用来表示性别的,如:M表示男,F表示女。今输入5个人的工作证号码,请统计出其中的男女人数。#include#include学习必备欢迎下载main()inta=0,b=0,i,n;charc,s510;printf(“输入5个人的工作证号码:n”);for(i=0;i5;i+)scanf(“%s”,si);n=strlen(si);c=sin-1;if(c=m|c=M)a+;elseb+;printf(“男生数为%dn女生数为%dn”,a,b);4)有三个字

10、符串,要求找出其中最大者分析:有一个二维的字符数组str320,大小为320。即有3行20列,每一行可以容纳20个字符。str0:China0str1:Japan0str2:India0可以把str0,str1,str2看做三个一维字符数组,它们各有20个元素。把它们如同一维数组那样进行处理。可以用gets函数分别读入三个字符串。经过二次比较,就可得到值最大者,把它放在一维字符数组string中。#include#includemain()charstring20,str320;inti;for(i=0;i0)/*用字符串比较函数*/strcpy(string,str0);elsestrcpy

11、(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(“nthelargeststringis:%sn”,string);3、指针与数组(35分钟)在C语言中,指针和数组的关系非常密切,引用数组元素既可以通过下标,也可以通学习必备欢迎下载过指针来进行。正确地使用数组的指针来处理数组元素,能够产生高质量的目标代码。(1)数组的指针和指向数组的指针变量1)指向一维数组的指针C语言中,数组名代表该数组的首地址,即数组中第一个元素的地址。将一维数组的名字或某个数组元素的地址赋给指针变量,指针变量即指向该一维数组或数组元素。例如

12、:inta10,*p;p=a;/*把数组的起始地址赋给指针变量p*/p=&a0;把a0元素的地址赋给指针变量p。因为a0是数组第1个元素,指向数组的指针示意图如图6-6所示。在定义指针变量时也可以赋初值,如:inta10;int*p=&a0;或:int*p=a;(2)通过指针引用一维数组;我们知道,p=a;和p=&a0是等价的,它们都是把数组a的起始地址赋给指针变量p。同理:p=a+i;和p=&ai;也是等价的。是把数组a中第i个元素ai的地址赋给指针变量p。设有以下语句:inta10,*p;p=a;把p置为指向数组a的第1个元素,即p包含了a0的地址。*p为a0的值。如果指针p+1,则指向a

13、的下一个元素,如图6-7所示。图6-7指针引用一维数组元素根据以上所述,引用一维数组元素,可以用两种方法:下标法,如ai或pi形式;指针法,如*(a+i)或*(p+i)。所以有:(1)p+i和a+i就是ai的地址,或者说,它们指向a数组的第i个元素(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即ai。例如:学习必备欢迎下载*(p+5)或*(a+5)就是a5。3)指向数组的指针变量也可以带下标,如pi与*(p+i)等价。例:用三种方法输出a数组的10个元素的值。方法一:用下标法main()inta10=1,2,3,4,5,6,7,8,9,10;inti;for(i=0;i1

14、0;i+)printf(%d,ai);运行结果:12345678910方法二:用数组名main()inta10=1,2,3,4,5,6,7,8,9,10;inti;for(i=0;i10;i+)printf(%d,*(a+i);运行结果:12345678910方法三:用指针法main()inta10;inti,*p;for(i=0;i10;i+)scanf(%d,&ai);for(p=a;p(a+10);p+)printf(%d,*p);运行结果:12345678910三种方法比较:以上方法(1)与(2)相同。因为系统把ai按*(a+i)处理的,需要计算元素的地址,然后再取数据。方法(3)是直

15、接从地址中取数据,不需计算,所以速度快。但方法(1)比较直观。(在数组中使用指针应注意以下几点:(1)可以p+,不能a+,因为数组名a是一个不可以改变值的地址常量。2)要注意指针变量的当前值。3)在定义数组时,若用指针变量,可以不指定数组的长度。int*p,a;p=a;用指针变量来读取数组元素,需要注意指针的+与-运算,例:若inta10,*p;p=a;则:1)p+(或p+=1)操作指针p指向下一元素,即a1;若再执行*p,则取数组元素a1的值。学习必备欢迎下载2)*p+;等价于*(p+)由于+和*同优先级,自右向左结合,则实现的功能是先得到p所指向的数组元素值(即*p),然后再执行p+操作。

16、3)*(p+)与*(+p)作用不同。前者是先取*p值,后使p加1;后者是先使p加1,再取*p。例如:main()inta10=0,1,2,3,*p=a;printf(“n%d”,*(p+);p=a;/*使指针回到数组起始地址*/printf(“,%d”,*(+p);结果为:0,14)(*p)+表示p所指向的元素值加1,而不是指针值加1。例如:main()inta10=1,3,5,7,*p=a;printf(“n%d”,(*p)+);结果为:2例:分别用下标法和指针法输出数组元素。main()inti,*p,a10;p=a;for(i=0;i10;i+)ai=i+10;printf(“n”);f

17、or(i=0;i8;i+)printf(“a%d=%d”,i,ai);printf(“p%d=%d”,i,pi);printf(“*(a+%d)=%d”,i,*(a+i);printf(“*(p+%d)=%dn”,i,*(p+i);(3)指向二维数组元素的指针指向二维数组元素的指针可以采用两种定义形式。1)用普通指针变量指向数组元素例如:inta23,*p;p=a;p是一个指向整型数组元素的指针变量,每次使p值加1,指针移动到下一个元素。2)用行指针变量学习必备欢迎下载二维数组可以看成是由多个一维数组构成,即每行是一个一维数组,则行指针变量是指向一行数组元素的起始地址。格式:类型(*变量名)常

18、量表达式;例如:inta45,(*p)5;p=a;p表示是一个指向一维数组(5个元素)的指针变量,p+表示指向下一行的起始地址,即指针变量p的增值为行元素的长度。p与各行之间的关系如图6-8所示。数组名指针各行首地址二维数组元素apa0a00a01a02a03a04P+1a1P+2a2P+3a3a10a11a12a13a14a20a21a22a23a24a30a31a32a33a34由图6-8可知,行指针p的基类型是指向一个包含有5个整型数组元素的一维数组,它加减一个单位,相当于指针移动5个整型数组元素,即p+与p-是向上或向下移动一行。二维数组a可以看成由四个一维数组组成,a0、a1、a2、

19、a3为各行首地址,对应关系如图6-8所示。P为指向第一行a0,p+1为第二行a1,。从上面的图中也可以看出,a指向a0,即第一行的首地址;a+1移动到第2行的首地址,依次类推。又因为a0指向二维数组元素第1行的第1个元素,即a00,则a0+1指向数组元素a01,a0+2指向数组元素a02,依此类推,由各行的首地址加上某一个值,可以通过它们访问该行后面的其他数组元素。通过各行指针引用数组元素:*(*(p+i)+j)或:*(ai+j)注:P为行指针,*(p+i)为i行地址,*(p+i)+j为aij的地址,*(*(p+i)+j)为数组元素aij。同样:ai是第i行的指针,ai+j是aij的地址,*(

20、ai+j)等价于二维数组元素aij。(4)指针引用二维数组元素1)用普通指针变量引用数组元素。例用指针变量输出数组元素的值。#include“stdio.h”main()inta=1,3,4,5,6,7,8,9,10,11,12;int*p;for(p=a;pa+12;p+)printf(“%3d”,*p);运行:123456789101112上例用移动指针p,把二维数组元素全部输出。2)用行指针引用数组元素例输出二维数组中任一元素的值。学习必备欢迎下载main()inta=1,3,4,5,6,7,8,9,10,11,12;int(*p)4,i,j;p=a;scanf(“%d,%d”,&i,&j);printf(“a%d,%d=%dn”,i,j,*(*(p+i)+j);运行:2,3A2,3=12例打印指定的数组元素main()inta23=0,1,2,3,4,5,(*p)3;p=a;printf(“n%d,%d,%d”,*(a0+3),*(a1+0),*(*(a+1)+0);printf(“n%d,%d,%d”,*(p0+3),*(p1+0),*(*(p+1)+0);结果为:3,3,33,3,3其中*(a0+3),*(a1+0),*(*(a+1)+0)和*(p0+3),*(p1+0),*(*(p+1)+0),皆是数组元素a10指针引用的不同表示形式。(5)字符串的指针和指向

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论