《C语言程序设计》课程教案表
授课题目 第四章 数组(2)——二维数组 课时安排 授课时间 2 教学目的和要求 1.掌握:二维数组的定义与使用方法。 教学内容 1.基本内容:(1)二维数组的定义和使用方法 2.重点:二维数组的引用 讲课进程和时间分配 1、引入(5分钟) 在C语言中,数组的元素还可以是数组,这样就构成二维数组,所以二维数组可以堪称是“数组的数组”。照此办理,还可以构成三维,四维数组(称多维数组)等等,二维数组是多维数组中最简单,最常用的数组,它代表多维数组的基本特征。 2、 二维数组的定义(10分钟) 如前面所说,可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组 如:int a[3][4];可以将a数组看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。 图在纸上:可以理解为:int a[0][4], a[1][4], a[2][4],此处把a[0],a[1],a[2]看作一维数组名。 说明:在这里为什么这么说呢?以后讲到指针的时候更便于理解 二维数组的存储:二维数组从概念上可理解为行-列矩阵,但存储器是一维的,需按一定规则转换,在内存中:C语言中,二维数组中元素排列的顺序是——按行存放,不同的语言它的排列顺序是不一样的,Fotran是按列存放的。 如:见纸上 也就是说:数组元素的实际存放顺序是:右边下标比左边下标变化得快!!! 3、二维数组的引用(5分钟) 注意下标的最大取值,即:要注意数组定义和数组元素引用的区别,引用时候它的最大取值要比定义时少1 如定义:int a[3][4];则下标下限值是a[0][0], 下标上限值是a[2][3], 4、二维数组的初始化(按行存放)(15分钟) (1)按存放顺序赋初值 如:int x[2][3]={1,2,3,4,5,6};结果为:x[0][0]=1, x[0][1]=2, x[0][2]=3, x[1][0]=4, x[1][1]=5, x[1][2]=6 (2)按行赋初值 如:int x[2][3]={{1,2,3},{4,5,6}};结果同上。 (3)部分赋初值 如:static int x[2][3]={1,2,4};/*以存放顺序赋*/ 结果为:x[0][0]=1, x[0][1]=2, x[0][2]=4, x[1][0]=0, x[1][1]=0, x[1][2]=0 如:static int x[2][3]={{1,2},{4}};/*以行赋*/ 结果为:x[0][0]=1, x[0][1]=2, x[0][2]=0, x[1][0]=4, x[1][1]=0, x[1][2]=0 如:static int x[2][3]={{6,2},{5,0,6}};/*以行赋*/ x[0][0]=6, x[0][1]=2, x[0][2]=0, x[1][0]=5, x[1][1]=0, x[1][2]=6 说明:想给第二行第三个元素赋值为0的话不能写成{5,,6}或者是{5, ,6}而应人为写上0. (4)省略第一维长度 static int x[][3]={1,2,3,4,5,6,7}; 结果为:x[0][0]=1, x[0][1]=2, x[0][2]=3, x[1][0]=4, x[1][1]=5, x[1][2]=6,x[2][0]=7, x[2][1]=0, x[2][2]=0 注意:不能省略第二维的长度。为什么?如果省略的话,就不知道一行有几个元素,给定这几个元素究竟应该如何赋值就不知道了,所以能省第一维,不能省第二维,因为省的话系统不能确定,这样就产生二义性了。 5、二维数组程序举例(20分钟) 例1:二维数组的输入与输出 一般二维数组的处理用二重循环来实现 用循环变量的值控制数组元素的下标,因为数组是一个整体,要想取出其中每一个个体的话,就得用下标来控制。 #include void main() { int a[3][3],I,j; for(i=0;i<=2;i++) for(j=0;j<=2;j++) scanf(“%d”,&a[i][j]); for(i=0;j<=2;i++) { for(j=0;j<=2;j++) printf(“]”,a[i][j]); printf(“\\n”); } } 上述程序为学生详细分析一下。 for(i=0;i<=2;i++) for(j=0;j<=2;j++) scanf(“%d”,&a[j][i]); 分析输出结果与上述有何不同,未修改时先给每行赋值,修改后是先给每列赋值 for(i=0;j<=2;i++) { for(j=0;j<=2;j++) if((i+j)%2) 修改为 if((i+j)%2==0) printf(“]”,a[i][j]); } for(i=0;i<=2;i++) printf(“%5”,a[i][i]); 输出主对角线数据 考虑输出次对角线数据,打印上三角的各数据 例 将一个二维数组行和列元素互换,存到另一个二维数组中(转置) 算法:1 a数组初始化(或赋值)并输出;2 用二重循环进行转置b[j][i]=a[i][j];输出b数组 对于n*n的二维数组,可以在同一个数组进行矩阵转置操作 思路 对于主对角线的元素进行二二交换 7、二维数组练习(5分钟) 8、字符数组(30分钟) (1)字符数组的定义 在C语言中,没有专门的字符串变量,而是将字符串存入字符数组中来处理;即用一个一维数组来存放一个字符串,(我们讲了数组是若干元素的集合)每个元素存放一个字符。 字符数组是数组的一个特殊情况,但它的定义方法与上述介绍的类似;引用方法可以与上述介绍相同,也有其独特的引用方法。(它到底有什么独特的呢,我们接下来进行学习比较) 定义形式:char 数组名[exp][exp] 如:char c[5]; c[0]=’h’; c[1]=’a’; c[2]=’p’; c[3]=’p’; c[4]=’y’; 由于字符型与整型是互相通用的,因此上面定义也可改为:int char[5];c[0]=’h’; c[1]=’a’; c[2]=’p’; c[3]=’p’; c[4]=’y’; (2)字符数组的初始化 1)按元素赋 static char c[10]={‘s’,’t’,’o’,’r’,’e’}; 注意 static char c[10];则c[0],c[1],。。。c[9]初值均为‘\\0’ 但若 char c[10]; 则c[0],c[1],。。。c[9]的值是未知的 注意:在C语言中,讲字符串作为字符数组来处理,即用一个一维数组来存放一个字符串。如c[10]存放字符串“store”。为了测定实际字符串长度,C语言规定了一个“字符串结束标志”,即‘\\0’。即遇到字符‘\\0’时,表示字符串结束。 由此可以看出 字符数组的长度与实际字符串的长度是两码事,当然字符串的长度可以小于等于字符数组长度,但是你不能超过它的长度。 2) 使用字符串常量给字符数组赋初值 例如:char c[6]={“china”};或char c[6]=“china”; 或char c[]=“china”; 见纸上 注意:以字符串方式赋值时,必须保证数组元素个数>=字符个数+1(字符串后面自动加上一个‘\\0’) 例 字符数组初始化 #include void main() { char a[7]={‘a’,’p’,’p’,’l’,’e’}; char b[7]={”apple”}; char c[7]; static char x[7]; int i; for(i=0;i<=6;i++) { printf(“mmmm\\n”,a[i],b[i],c[i],x[i]); } } 显示结果:97 97 -23 0 112 112 75 0 108 108 80 0 101 101 -2 0 0 0 51 0 0 0 123 0