C语言教案 第4章Word下载.docx
《C语言教案 第4章Word下载.docx》由会员分享,可在线阅读,更多相关《C语言教案 第4章Word下载.docx(35页珍藏版)》请在冰豆网上搜索。
1、一维数组的定义。
数组同变量一样,也必须先定义、后使用。
只有一个下标的数组称为一维数组。
一维数组的定义格式为:
类型说明符 数组名[常量表达式];
(1)“数据类型”是指数组元素的数据类型。
(2)数组名,与变量名一样,必须遵循标识符命名规则。
(3)“常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。
注意:
C语言中不允许动态定义数组。
(4)数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。
(5)数组名中存放的是一个地址常量,它代表整个数组的首地址。
同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。
2、一维数组元素的引用。
数组必须先定义后使用。
C语言规定只能逐个引用数组元素而不能引用整个数组。
数组元素的引用格式为:
数组名[下标]。
(1)“下标表达式”可以是任何非负整型数据,取值范围是0~(元素个数-1)。
特别强调:
在运行C语言程序过程中,系统并不自动检验数组元素的下标是否越界。
因此在编写程序时,保证数组下标不越界是十分重要的。
(2)一个数组元素,实质上就是一个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。
(3)在C语言中,数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理。
3、冒泡法排序的思路:
比较两个相邻的数,将大的数往后调,一趟排序后最大的数沉到最后。
本例要求是降序排列,因此将小的数往后调。
4、数组作为函数参数。
数组名也可以作为实参和形参,传递的是整个数组。
(1)数组元素作函数参数
数组元素就是下标变量,它与普通变量并无区别。
数组元素只能用作函数实参,其用法与普通变量完全相同:
在发生函数调用时,把数组元素的值传送给形参,实现单向值传送。
用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。
换句话说,对数组元素的处理是按普通变量对待的。
在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。
在函数调用时发生的值传送,是把实参变量的值赋予形参变量。
(2)数组名可作函数参数
数组名作函数参数时,既可以作形参,也可以作实参。
数组名作函数参数时,要求形参和相对应的实参都必须是类型相同的数组(或指向数组的指针变量),都必须有明确的数组说明
用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。
例如,在本案例中,形参数组为a[],实参数组为sco[],它们的数据类型相同。
C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。
例如,本案例中的形参数组a[]。
如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。
5、一维数组的初始化。
在数组定义后对数组元素进行赋值,也可以在定义数组的同时对数组元素赋以初值。
(1)对全部数组元素赋初值。
(2)部分元素赋初值。
(3)数组中全部元素的值都赋为0。
小结:
本次课介绍了一维数组的定义、输入/输出方法以其如何运用一维数组进行程序设计。
同变量一样,一维数组也要先定义后使用。
定义数组时,常量表达式一定用方括号括起来。
C语言中允许对数组进行初始化。
输入案例程序
教师可以进行启发式提问方式小结
案例
思考
案例思考 1、2
作业
第4章数组
(2)
1、熟练运用二维数组实现学生多科成绩的输入/存储/输出。
2、掌握二维数组实现学生多科成绩的统计。
3、掌握二维数组实现学生多科成绩的查询。
1、运用二维数组的输入/存储/输出
2、运用二维数组进行程序设计
1、熟练运用二维数组实现学生多科成绩的输入、存储和输出。
2、掌握应用二维数组实现学生多科成绩的统计。
3、掌握应用二维数组实现学生多科成绩的查询。
思考,讨论,练习和巩固
导入
上一堂课介绍了一维数组的定义、引用、初始化以及运用一维数组进行程序设计的方法,这堂课介绍二维数组。
二维数组的定义与一维数组类似,只是多了一个下标表达式。
案例4.2:
多科学生成绩的管理
案例4_2.c*/(略)
1、二维数组的定义。
有两个下标的数组称为二维数组。
二维数组的定义格式为:
类型说明符 数组名[常量表达式1][常量表达式2];
(1)数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推。
(2)设有一个m*n的数组x,则第i行第j列的元素x[i][j]在数组中的位置为:
i*n+j(注意:
行号、列号均从0开始计数)。
(3)可以把二维数组看作是一种特殊的一维数组即它的每个元素又是一个一维数组。
2、二维数组元素的引用。
数组元素的表示格式为:
数组名[下标1][下标2]
(1)“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。
(2)“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。
假设有数组x[3][4],则可用的行下标范围为0~2,列下标范围为0~3。
(3)对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。
3、用二维数组名作函数参数。
用二维数组名作为实参和形参(实参数组的首地址传给形参数组)。
由于数组各元素在内存中是按顺序存储,没有行列之分,因此被调用函数中对形参数组定义时必须指定第二维下标的大小(可以省略第一维的大小说明)。
4、二维数组的初始化。
(1)按行赋初值
数据类型数组名[行常量表达式][列常量表达式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};
赋值规则:
将“第0行初值表”中的数据,依次赋给第0行中各元素;
将“第1行初值表”中的数据,依次赋给第1行各元素;
以此类推。
(2)按二维数组在内存中的排列顺序给各元素赋初值
数据类型数组名[行常量表达式][列常量表达式]={初值表};
按2维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。
如果对全部元素都赋初值,则“行数”可以省略。
只能省略“行数”。
例4.3对二维数组全部数组元素赋初值
4_2_1.c*/#include<
stdio.h>
main()
{
inta[2][3]={10,20,30,40,50,60},b[][3]={10,20,30,40,50,60},i,j;
for(i=0;
i<
2;
i++)
{
for(j=0;
j<
3;
j++)
printf(“a[%d][%d]=%d\t”,i,j,a[i][j]);
printf(“\n”);
}
printf(“\n\n”);
printf(“b[%d][%d]=%d\t”,i,j,b[i][j]);
getch();
}
例4.4对二维数组中的部分数组元素赋初值
4_2_2.c*/(略)
比较例4。
3与4。
4的运行结果。
本次课介绍了地二维数组的定义、输入/输出方法以其如何运用二维数组进行程序设计。
可以把二维数组看作是一种特殊的一维数组即它的每个元素又是一个一维数组。
输入
程序
调试运行
分析讨论
案例思考
习题
第4章数组(3)
掌握字符串的存储和使用方法。
1、掌握字符串的存储和使用方法。
2、掌握字符串的存储和使用方法。
2、掌握使用常用的字符串处理函数方法。
上一堂课介绍了二维数组的定义、引用、初始化以及运用二维数组进行程序设计的方法,本堂课介绍一种特殊的数组——字符数组。
字符数组可以定义成一维数组,也可以定义为二维数组,数组元素为字符型。
在C语言中字符串的应用很普遍,用字符数组来存放字符串十分方便。
案例4.3:
学生姓名的排序
案例4_3.c*/
#include<
string.h>
main()
voidsort(charname[][10]);
inti;
charname[5][10]={“WangLi”,”ChenLin”,”HuangJin”,”WuHai”,”LiuXiu”};
sort(name);
for(i=0;
5;
i++)/*输出排序后的名单*/
puts(name[i]);
getch();
voidsort(charname[][10])/*用冒泡法对姓名进行升序排序*/
inti,j,flag;
chartemp[10];
4;
flag=0;
for(j=0;
4-i;
if(strcmp(name[j],name[j+1])>
0)
strcpy(temp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
flag=1;
/*一趟排序中有出现数据交换*/
if(flag==0)break;
/*一趟排序中没出现数据交换,数据已经有序*/
1、字符数组的定义。
用来存放字符数据的数组是字符数组。
字符数组的一个元素存放一个字符。
字符数组的定义格式与其它数组定义格式相似。
它的定义格式为:
charname[MAX1],c[MAX1][MAX2];
2、字符串概念。
零个或多个字符组成的有限序列称为字符串。
在C语言中,没有字符串变量。
通常要用字符数组来存放字符串,并规定以字符’\0’作为字符串结束标志。
系统在存储字符串常量时,自动在字符串的末端加上一个’\0’作为字符串结束符。
例如,"
WangLi"
字符串只有6个字母,系统在字母“i”后自动加上一个’\0’作为字符串结束标志,这样在内存中就占用了7个存储单元。
有了结束标志'
\0'
后,字符数组的长度就显得重要了。
在程序中往往不是根据数组的长度来决定字符串长度,而是依靠检测'
的位置来判断字符串是否结束。
但在定义字符数组时要保证数组长度至少比字符串实际长度多1。
3、字符数组的初始化
①对数组元素逐个赋值
②如果初值个数和数组长度相同,定义时可以省略数组长度
③用字符串常量来初始化字符数组
用一个字符串作为初值时,字符串的两端使用双引号。
4、排序方法与原理。
本次课介绍了字符数组的定义、引用及初始化。
字符数组用于存放字符串,以方便字符串的处理。
教师可以进行启发式提问
案例思考
第4章数组(4)
掌握使用常用的字符串处理函数方法
1、掌握使用常用的字符串处理函数方法。
掌握使用常用的字符串处理函数方法。
上次课介绍了字符数组的定义、引用及初始化,还介绍了字符串,本次课介绍一些常用的字符串处理函数,运用这些函数可以更有效地处理字符串。
总结
讲解
在C语言的标准函数库中提供了一些处理字符串的函数,这些函数原型保存在头文件string.h中。
(1)gets(字符数组)
其功能是:
从终端输入一个字符串到字符数组,并用’\0’代替输入中的换行符。
如执行:
gets(name)
从键盘输入:
WangLi
系统将输入的字符串“WangLi”送给字符数组name(共有7个字符)。
该函数执行成功时,返回字符数组的起始地址,否则返回NULL。
用gets函数只能输入一个字符串。
例如:
gets(name1,name2);
是错误的。
(2)puts(字符数组)
其功能是:
将一个字符串输出到终端,并加上换行符’\n’。
charname[]="
;
puts(name);
结果是:
用puts函数输出的字符串中可以包含转义字符。
例:
charname[]="
WangLi\tChenLin"
puts(name);
WangLiChenLin
该函数执行成功时,返回最后一个字符的ASCII码值,否则返回EOF。
用puts函数只能输出一个字符串。
puts(name1,name2);
(3)strcpy(字符数组1,字符数组2)
strcpy是STRingCoPY(字符串复制)的缩写。
它是“字符串复制”函数。
将字符串2复制到字符数组1中去。
例如本案例中:
strcpy(temp,name[i]);
当i=1时,将字符串”ChenLin”赋给变量temp。
执行前后变量temp的状态如图4-6所示。
执行前temp:
执行后temp:
C
h
e
n
L
i
\0
图4-6字符存储状态
说明:
①字符数组1的长度大于字符串2的长度,以便容纳被复制的字符串。
②“字符数组1”必须写成数组名形式(如temp),“字符串2”可以是字符数组名,也可以是一个字符串常量。
strcpy(str1,"
ChenLin"
);
③复制时连同字符串后面的’\0’一起复制到字符数组1中。
④不能用赋值语句将一个字符常量或字符数组直接给一个字符数组。
str1={"
};
str1=str2;
这两个语句都是错误的。
⑤可以用strncpy函数将字符串2中前面若干个字符复制到字符数组1中去。
strncpy(temp,name[1],4);
其功能是将name[1]中前面4个字符复制到变量temp中去,然后再加上’\0’。
执行前后变量temp的状态如图4-7所示。
图4-7字符存储状态
(4)strcmp(字符串1,字符串2)
strcmp是STRingCoMPare(字符串比较)的缩写。
比较字符串1和字符串2。
strcmp(name[i],name[i+1]);
字符串比较规则是对两个字符串自左至右逐个字符(按ASCII码值大小比较)进行相比。
直到出现不同的字符或遇到’\0’为止。
如全部字符相同,则认为相等;
若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
“WangLi”>
”ChenLin”
“ChenLin”<
”HuangJin”
“WuHai”>
”LiuXiu”
“WangLi”<
”WuHai”
“ABCD”<
”abcd”。
如果参加比较的两个字符串都由英文字母组成,那么简单的规律是:
在英文字母排列顺序中位置在后面的字母比前面的“大”。
小写字母比大写字母“大”。
所以有”ABCD”<
函数返回整型值。
若函数值为0,则字符串1与字符串2相等;
若函数值为一正整数(两个不同字符的ASCII码之差),则字符串1大于字符串2;
若函数值为一负整数,则字符串1小于字符串2。
strcmp(“Wu”,“Wu”);
函数返回值为0;
strcmp(“WangLi”,“WuHai”);
函数返回值为-20;
strcmp(“WuHai”,“WangLi”);
函数返回值为20。
注意:
①进行两个字符串比较时,用“==”容易出错。
if(name1==name2)是错误的。
if(strcmp(name1,name2)==0)是正确的。
②可以用strncmp函数只比较字符串1和字符串2中前面若干个字符。
strncmp(“WuHai”,“WangLi”,1);
则函数返回值为0。
(5)字符数组的输入与输出。
字符数组的输入与输出可以有两种方法:
①逐个字符输入输出。
用格式符“%c”输入或输出一个字符,例如:
charstr[]=”Iamastudent.”;
15;
printf(“%c”,str[i]);
输出结果为:
Iamastudent.
②将整个字符串一次输入或输出。
用格式符“%s”输入或输出一个字符串。
printf("
%s"
str);
输出时,遇结束符’\0’就停止输出。
①输出字符不包括结束符’\0’。
②“%s”格式符输出字符时,printf函数中的输出项是字符数组名,而不是数组元素名。
str[0]);
③如果数组长度大于字符串实际长度,也只输出到’\0’结束。
charstr[20]=”Iamastudent.”;
其输出”Iamastudent.”15个字符。
这就是使用字符串结束符’\0’的结果。
④如果一个字符数组中包含一个以上’\0’,那么以第一个’\0’为准。
⑤可以用scanf函数从键盘输入一个字符串,但字符串长度应短于字符数组的长度。
用scanf函数输入一个字符串时,字符串中不能有空格(字符串含有空格,最好用gets函数输入)。
charstr[10];
scanf("
Student后,系统自动在后面加一个’\0’结束符。
如果利用一个scanf函数输入多个字符串,则以空格分隔。
charstr1[5],str2[5],str3[5];
scanf("
%s%s%s"
str1,str2,str3);
从键盘输入数据:
Howareyou?
数组中未被赋值的元素的值是不可预料的。
str1、str2、str3数组状态如图4-8所示。
str1:
H
o
w
str2:
a
r
str3:
y
u
?
图4-8字符存储状态
若改为:
charstr[13];
如果输入以下12个字符
Howareyou?
由于输入的字符串中有空格,所以送到数组str中的只有第一个空格前的字符“How”和‘\0’。
str数组状态如图4-9所示。
str:
图4-9字符存储状态
(6)strcat(字符数组1,字符数组2)
strcat是STRingCATenate(字符串连接)的缩写。
连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,例如:
charstr1[16]={"
Iama"
charstr2[]={"
student."
strcat(str1,str2));
输出:
连接前后的状况如图4-10所示。
连接前str1:
I
m
s
t
d
.
连接后str1:
图4-10字符存储状态
该函数调用后得到一个函数值——字符数组1的地址。
①字符数组1必须足够大,以便容纳连接后的新字符串。
本例中str1的长度为16。
②连接之前两个字符串的末端都有一个‘\0’,连接后字符串1末端的‘\0’取消,只在新字符串末端保留一个‘\0’。
(7)strlen(字符数组)
strlen是STRingLENgth(字符串长度)的缩写。
它是测定字符串长度的函数。
函数的值为字符串中的实际长度,不包括’\0’。
charstr[20]="
Iamastudent."
%d"
strlen