您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 13《C语言程序设计》教案第四章数组—字符数组和字符串
《C语言程序设计》课程教案表授课题目第四章数组(3)——字符数组和字符串课时安排2授课时间教学目的和要求1.掌握:几种常用的字符串处理函数2.熟悉:指针与数组。教学内容1.基本内容:(1)几种常用的字符串处理函数(2)指针与数组。2.重点:几种常用的字符串处理函数3.难点:指针与数组讲课进程和时间分配1、复习与新知识导入(5分钟)2、字符串处理函数(45分钟)C语言编译系统中,提供了很多有关字符串处理的库函数。下面介绍几个常用的字符串处理函数。使用输入、输出字符和字符串函数时,应在函数前加上头文件“stdio.h”;使用其他字符串操作函数时,则应加上头文件“string.h”。板书:#includestdio.h#includestring.h(1)字符串输出函数格式:puts(字符串)功能:将一个字符串(以‘\0’为结束标志)输出到终端。输出的字符串中可以包含转义字符。例如:charstr[]={“China\nBeijing”};puts(str);输出:ChinaBeijing在输出时将字符串结束标志‘\0’转换成‘\n’,即输出完字符串后换行。板书:puts(str);与printf(”%s\n”,str)等价或puts(“OK!”);与printf(“%s\n”,”OK!”)或printf(“OK!\n”)等价(2)字符串输入函数格式:gets(字符数组)功能:从终端输入一个字符串(可包含空格)以回车为输入结束标志,将接受到的字符依次赋值给字符数组各个元素,并自动在字符串末尾加结束标记‘\0’。例如:gets(str);注意:用puts和gets函数只能输入或输出一个字符串,不能写成:puts(str1,str2);或:gets(str1,str2);说明:字符串可以是字符数组或字符串常量。而scanf()是以回车、空格或tab键做分隔符的。例:voidmain(){chars[100];printf(“请输入一个字符串:”);gets(s);printf(“输入的字符串是:”);puts(s);}红色改为puts(gets(s)),不影响程序运行结果。(3)连接两个字符串函数格式:strcat(字符串1,字符串2)功能:连接两个字符串中的字符,把字符串2的字符连接到字符串1的字符后面,结果放在字符串1中,函数调用后得到一个函数值——字符串1的起始地址。例如:charstr1[30]={“people′srepublicof”};charstr2[]={“china”};printf(“%s”,strcat(str1,str2));输出:people′srepublicofchina说明:1)字符串1必须足够大,以便能容纳连接后的新字符串。2)连接前两个字符串后面都有一个‘\0’,连接时将字符串1后面的‘\0’取消,只在新串的最后保留一个‘\0’。思考:以下程序是正确的charc;c=’A’+’B’;那么,下面的程序呢?charc[10];c=”A”+”B”;是不正确的,必须用strcat()函数来连接。(4)字符串拷贝函数strcpy格式:strcpy(字符数组,字符串)功能:将字符串拷贝到字符数组中去。例如:charstr1[10],str2[]={“china”};strcpy(str1,str2);/*或strcpy(str1,“china”);*/执行后str1的内容为:china\0\0\0\0\0说明:1)字符数组必须足够大,以便能容纳被拷贝的字符串。2)拷贝时连同字符串后面的‘\0’一起拷贝到字符数组中。3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。下面的用法是错误的:str1={“china”};str1=str2;而只能用拷贝函数strcpy处理。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:chara[5],c1,c2;c1=‘A’;c2=‘B’;a[0]=‘c’;a[1]=‘h’;a[2]=‘i’;a[3]=‘n’;a[4]=‘a’;4)可以用strcpy函数将字符串中前面若干个字符拷贝到字符数组中去。例如:strcpy(str1,str2,2);将str2中前面2个字符拷贝到str1中去,然后再加一个‘\0’。(5)字符串比较函数格式:strcmp(字符串1,字符串2)功能:比较字符串1和字符串2的大小。说明:按照ASCII码值大小比较,将两个字符串自左至右逐个字符比较,直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同字符的比较结果为准。1.字符串1==字符串2,函数值=0;2.字符串1字符串2,函数值0;3.字符串1字符串2,函数值0。两个字符串的比较,不能用以下形式str1==str2或str1str2只能用strcmp(str1,str2)0或==0或0来判断(6)测试字符串长度函数格式:strlen(字符数组)功能:测试字符串长度,函数值为字符串中实际长度,不包括‘\0’。例如:charstr[10]={“china”};printf(“%d”,strlen(str));结果为:5(7)字符串小写函数格式:strlwr(字符串)功能:将字符串中大写字母转换成小写字母。lwr是lowercase(小写)的缩写。(8)字符串大写函数格式:strupr(字符串)功能:将字符串中小写字母转换成大写字母。upr是uppercase(大写)的缩写。(9)字符数组程序举例1)输入一个字符串,将其中的大写字母均变成小写字母。#includestdio.h#includestring.hmain(){chars[40],c;inti=0;printf(“输入一个字串:”);gets(s);strlwr(s);printf(“输出转换后的字串:”);puts(s);}2)从字符串中取出指定长度的子串。#includestdio.hmain(){chars1[40],s2[40];inti=0,m;printf(“\n输入要截取子串的母串:”);gets(s2);printf(“\n输入要截取子串的长度:”);scanf(“%d”,&m);while(im){s1[i]=s2[i];i++;}s1[i]=‘\0';printf(“\n输出所截取的子串:%s”,s1);}3)某单位的工作证号码的最后一位是用来表示性别的,如:M表示男,F表示女。今输入5个人的工作证号码,请统计出其中的男女人数。#includestdio.h#includestring.hmain(){inta=0,b=0,i,n;charc,s[5][10];printf(“输入5个人的工作证号码:\n”);for(i=0;i5;i++){scanf(“%s”,s[i]);n=strlen(s[i]);c=s[i][n-1];if(c==‘m’||c==‘M’)a++;elseb++;}printf(“男生数为%d\n女生数为%d\n”,a,b);}4)有三个字符串,要求找出其中最大者分析:有一个二维的字符数组str[3][20],大小为3×20。即有3行20列,每一行可以容纳20个字符。str[0]:China\0str[1]:Japan\0str[2]:India\0可以把str[0],str[1],str[2]看做三个一维字符数组,它们各有20个元素。把它们如同一维数组那样进行处理。可以用gets函数分别读入三个字符串。经过二次比较,就可得到值最大者,把它放在一维字符数组string中。#includestdio.h#includestring.hmain(){charstring[20],str[3][20];inti;for(i=0;i3;i++)gets(str[i]);/*输入3个字符串*/if(strcmp(str[0],str[1])0)/*用字符串比较函数*/strcpy(string,str[0]);elsestrcpy(string,str[1]);if(strcmp(str[2],string)0)strcpy(string,str[2]);printf(“\nthelargeststringis:%s\n”,string);}3、指针与数组(35分钟)在C语言中,指针和数组的关系非常密切,引用数组元素既可以通过下标,也可以通过指针来进行。正确地使用数组的指针来处理数组元素,能够产生高质量的目标代码。(1)数组的指针和指向数组的指针变量1)指向一维数组的指针C语言中,数组名代表该数组的首地址,即数组中第一个元素的地址。将一维数组的名字或某个数组元素的地址赋给指针变量,指针变量即指向该一维数组或数组元素。例如:inta[10],*p;p=a;/*把数组的起始地址赋给指针变量p*/p=&a[0];把a[0]元素的地址赋给指针变量p。因为a[0]是数组第1个元素,指向数组的指针示意图如图6-6所示。在定义指针变量时也可以赋初值,如:inta[10];int*p=&a[0];或:int*p=a;(2)通过指针引用一维数组我们知道,p=a;和p=&a[0];是等价的,它们都是把数组a的起始地址赋给指针变量p。同理:p=a+i;和p=&a[i];也是等价的。是把数组a中第i个元素a[i]的地址赋给指针变量p。设有以下语句:inta[10],*p;p=a;把p置为指向数组a的第1个元素,即p包含了a[0]的地址。*p为a[0]的值。如果指针p+1,则指向a的下一个元素,如图6-7所示。所以有:(1)p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如:图6-7指针引用一维数组元素根据以上所述,引用一维数组元素,可以用两种方法:①下标法,如a[i]或p[i]形式;②指针法,如*(a+i)或*(p+i)。*(p+5)或*(a+5)就是a[5]。3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。例:用三种方法输出a数组的10个元素的值。方法一:用下标法main(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i10;i++)printf(″%d″,a[i]);}运行结果:12345678910方法二:用数组名main(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i10;i++)printf(″%d″,*(a+i));}运行结果:12345678910方法三:用指针法main(){inta[10];inti,*p;for(i=0;i10;i++)scanf(″%d″,&a[i]);for(p=a;p(a+10);p++)printf(″%d″,*p);}运行结果:12345678910三种方法比较:以上方法(1)与(2)相同。因为系统把a[i]按*(a+i)处理的,需要计算元素的地址,然后再取数据。方法(3)是直接从地址中取数据,不需计算,所以速度快。但方法(1)比较直观。在数组中使用指针应注意以下几点:(1)可以p++,不能a++,因为数组名a是一个不可以改变值的地址常量。(2)要注意指针变量的当前值。(3)在定义数组时,若用指针变量,可以不指定数组的长度。int*p,a[];p=a;用指针变量来读取数组元素,需要注意指针的++与--运算,例:若inta[10],*p;p=a;则:1)p++(或p+=1)操作指针p指向下一元素,即a[1];若再执行*p,则取数组元素a[1]的值。2)*p++;等价于*(p++)由于++和*同优先级,自右向左结合,则实现的功能是先得到p所指向的数组元素值(即*p),然后再执行p++操作。3)*(p++)与*(++p)作用不同。前者是先取*p值,后使p加1;后者是先使p加1,再取*p。例如:main(){in
本文标题:13《C语言程序设计》教案第四章数组—字符数组和字符串
链接地址:https://www.777doc.com/doc-3098262 .html