13 《C语言程序设计》教案 第四章 数组(3)—字符数组和字符串
- 格式:docx
- 大小:49.29 KB
- 文档页数:10
C语言程序设计——数组(说课稿)南京浦口中等专业学校—陈松一、课程目标《C语言程序设计》是中职对口单招计算机专业理论考试和技能考试中一门重要的课程。
要求学生掌握计算机编程语言的基本知识,初步掌握程序设计的基本思想,具有基本的C程序设计能力,能比较熟练地阅读、理解和编制简单的C程序。
二、学情分析本课程是针对综合高中对口单招班高二年级计算机专业的学生,学生已学习了计算机基础和计算机原理课程,对专业知识有了一定的了解。
但班级学生参差不齐,不少学生学习习惯较差,基础较薄弱。
教师必须首先弄清学生对专业课学习的障碍及原因,再根据教学原理制定出相应的对策,培养学生学习的积极,提高解决实际问题的能力。
三、教材与参考书本课程使用的教材是《C语言编程基础》(第2版)电子工业出版社。
此教材分为两部分,第一部分是基础知识模块,第二部分是选用模块。
对口单招学生只学习第一部分内容,第二部分内容单招计算机专业的考纲中是不要求的。
辅导练习:1、C语言阶段综合测试卷集。
2、自己编写的每次课的学生工作页。
四、教材分析1、单元内容数组单元是C语言的一个重要章节,本单元教学内容有:(1)一维数组的定义、引用和初始化、一维数组应用。
(2)二维数组的定义、引用和初始化、二维数组应用。
(3)字符串与字符数组、字符串的输入输出、字符串处理函数、字符数组应用。
2、单元设计(1)本单元每次课都编写了学生工作页,让学生根据任务去学习本单元内容。
(2)本单元加强了上机实习的课时数,着重培养学生上机实践能力,提高他们的程序设计能力。
3、教学目标➢知识目标:(1)了解一维数组、二维数值型数组的定义和使用方法。
(2)掌握对数组的初始化。
(3)掌握字符串的输入、输出和处理。
(4)熟练掌握使用数组进行程序设计的方法。
(5)理解程序设计中的几种常见算法的基本思路。
➢技能目标:(1)学生能正确的定义数组;能正确的引用数组和初始化数组;能使用数组进行程序设计。
(2)培养学生的分析、思考能力,提高解决问题的能力。
c语言中的字符数组与字符串一、字符数组的定义一维字符数组:用于存储和处理1个字符串,其定义格式与一维数值数组一样。
char str[20];二维字符数组:用于同时存储和处理多个字符串,其定义格式与二维数值数组一样。
char country[10][20];country[i]:第i个字符串二.字符数组的初始化字符数组的初始化.1.可以通过为每个数组元素指定初值字符来实现。
char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};char str[ ]={"I am happy"}; 可以省略花括号,如下所示char str[ ]="I am happy";char country[10][20]={“china”,”japanese”,……};注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的char str[15];str="I am happy";strcpy(str, "I am happy");不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘’括起来的)作为初值。
‘a’“a”区别三、字符数组的引用字符数组的逐个字符引用,与引用数值数组元素类似。
(1)字符数组的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用getchar()或scanf()函数输入字符。
例如:char str[10];…… for(i=0; i<10; i++){ scanf(\"%c\", &str);fflush(stdin); /*清除键盘输入缓冲区*/}……(2)字符数组的输出字符数组的输出,可以用putchar()或printf()函数。
教学内容1.基本内容:(1)几种常用的字符串处理函数(2)指针与数组。
2.重点:几种常用的字符串处理函数3.难点:指针与数组讲课进程和时间分配1、复习与新知识导入(5分钟)2、字符串处理函数(45分钟)C语言编译系统中,提供了很多有关字符串处理的库函数。
下面介绍几个常用的字符串处理函数。
使用输入、输出字符和字符串函数时,应在函数前加上头文件stdio.h;使用其他字符串操作函数时,则应加上头文件string.h。
板书:#include<stdio.h>#include<string.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或str1>str2只能用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)输入一个字符串,将其中的大写字母均变成小写字母。
#include<stdio.h>#include<string.h>main(){chars[40],c;inti=0;printf(输入一个字串:);gets(s);strlwr(s);printf(输出转换后的字串:);puts(s);}2)从字符串中取出指定长度的子串。
#include<stdio.h>main(){chars1[40],s2[40];inti=0,m;printf(\n输入要截取子串的母串:);gets(s2);printf(\n输入要截取子串的长度:);scanf(“%d”,&m);while(i<m){s1[i]=s2[i];i++;}s1[i]='\0';printf(\n输出所截取的子串:%s",s1);}3)某单位的工作证号码的最后一位是用来表示性别的,如:M表示男,F表示女。
今输入5个人的工作证号码,请统计出其中的男女人数。
#include<stdio.h>#include<string.h>main(){inta=0,b=0,i,n;charc,s[5][10];printf(输入5个人的工作证号码:\n”);for(i=0;i<5;i++){scanf(%s,s[i]);n=strlen(s[i]);c=s[i][n-1];if(c==mIIc==M)a++;elseb++;}printf(男生数为%d\n女生数为%d\n,a,b);}4)有三个字符串,要求找出其中最大者分析:有一个二维的字符数组str[3][20],大小为3X20。
即有3行20歹U,每一行可以容纳20个字符。
str[0]:China\0str[1]:Japan\0str[2]:India\0可以把str[0],str[1],str[2]看做三个一维字符数组,它们各有20个元素。
把它们如同一维数组那样进行处理。
可以用gets函数分别读入三个字符串。
经过二次比较,就可得到值最大者,把它放在一维字符数组string中。
#include<stdio.h>#include<string.h>main(){charstring[20],str[3][20];inti;for(i=0;i<3;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所示。
图6-7指针引用一维数组元素根据以上所述,引用一维数组元素,可以用两种方法:①下标法,如a[i]或p[i]形式;②指针法,如*(a+i)或*(p+i)。
所以有:(1)+柞和雪■就鹘[中的地址,或者说,它们指向a数组的第i个元素(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[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;i<10;i++)printf("%d",a[i]);}运行结果:12345678910方法二:用数组名main(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++)printf("%d",*(a+i));}运行结果:12345678910方法三:用指针法main(){inta[10];inti,*p;for(i=0;i<10;i++)scanf("%d",&a[i]);for(p=a;p<(a+10);p++)printf("%d",*p);}运行结果:12345678910三种方法比较:以上方法(1)与(2)相同。