湖南省C语言上教案第六章数组高教版doc.docx
《湖南省C语言上教案第六章数组高教版doc.docx》由会员分享,可在线阅读,更多相关《湖南省C语言上教案第六章数组高教版doc.docx(34页珍藏版)》请在冰豆网上搜索。
湖南省C语言上教案第六章数组高教版doc
课题
一维数组
教学
目的
1、掌握一维数组的定义和引用
教材
分析
教学重点
一维定义、引用、初始化
教学难点
数组的存储形式,数组的首地址
课时安排
1
教学方法
讲授与演示法相结合讨论法
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一新课引入
数组是有序数据的集合,数组中每一个元素都属于同一个数据类型。
问题:
给一组数排序,这组数该如何存放呢
.1.1.1.1.2.4..5.3.6.8..7.7.7.4.41.5.8
?
?
?
这些数据如何存放才便于排序,这便是本章所要解决的问题
•一个班学生的学习成绩
•一行文字
•一个矩阵
这些数据的特点是:
1.具有相同的数据类型
2.使用过程中需要保留原始数据
C语言为这些数据,提供了一种构造数据类型:
数组。
所谓数组就是一组具有相同数据类型的数据的有序集合。
二、新授
一、一维数组的定义和引用
定义数组,就是要:
(1)规定数组的名称,其取名规则与变量名相同;
(2)规定数组的类型,包括其数据类型和存储类型;
(3)规定数组的大小,即数组的维数及包含的数组元素的个数。
数组元素就是包含在数组中的变量。
1、一维数组的定义:
类型说明符数组名[常量表达式]
例如:
inta[10];
它表示定义了一个整形数组,数组名为a,此数组有10个元素。
例如:
intdata[10],number[5];
说明:
1.数组名定名规则和变量名相同,遵循标识符定名规则。
2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
3.常量表达式中可以包括常量和符号常量,但不能包含变量。
也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
例如:
intn;
scanf(“%d″,&n);/*在程序中临时输入数组的大小*/
inta[n];
三、小结
备注
第六章数组
课题
一维数组
教学
目的
1、掌握一维数组的定义和引用
2、维数组的初始化
教材
分析
教学重点
一维定义、引用、初始化
教学难点
数组的存储形式,数组的首地址
课时安排
1
教学方法
讲授与演示法相结合讨论法
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一复习引入
数组说明中其他常见的错误:
①floata[0];/*数组大小为0没有意义*/
1intb
(2)(3);/*不能使用圆括号*/
2intk,a[k];/*不能用变量说明数组大小*/
如何引用数组中元素的值?
二、新授
1、一维数组元素的引用
数组名[下标]
下标可以是整型常量或整型表达式。
例如:
a[0]=a[5]+a[7]-a[2*3]
注意:
定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是有区别的。
2、一维数组在内存中占一段连续的存储空间,其首地址:
a或&a[0]
例:
floatmark[100];
每个数据元素占用的字节数,就是基类型的字节数一个元素占4个字节
3、一维数组的初始化
1.在定义数组时对数组元素赋以初值;inta[10]={0,1,2,3,4,5,6,7,8,9};
2.可以只给一部分元素赋值;inta[10]={0,1,2,3,4};
3.如果想使一个数组中全部元素值为0,可简便实现;
inta[10]={0,0,0,0,0,0,0,0,0,0};
其实,对static数组不赋初值,系统会对所有数组元素自动赋以0值,即上句等价于:
staticinta[10];
不能写成:
inta[10]={0*10};
4.C允许通过所赋初值的个数来隐含定义一维数组的大小;在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度
inta[]={0,1,2,3,4,5,0};相当于inta[7]={0,1,2,3,4,5,0};
实例1:
用数组来处理,求解Fibonacci数列。
前20个数
Fibonacci数列公式:
已知:
a1=a2=1an=an-1+an-2即:
1,1,2,3,5,8,13
代码略
一、小结
1、 一维数组的定义、引用及初始化
2、 一维数组的存储形式
备注
实例要求上机,安排习题课堂2节
教
学
内
容
及
过
程
设
计
5编程:
1、按已给流程写出下列题和程序代码用起泡法对10个数排序(由小到大)代码略
(比较、选择、插入法共四种方法晚习讲解)
6、下面程序的运行结果是参考答案:
12345。
main()
{inta[10]={1,2,2,3,4,3,4,5,1,5};
intn=0,i,j,c,k;
for(i=0;i<10-n;i++)
{c=a[i];
for(j=i+1;j<10-n;j++)
if(a[j]==c)
{for(k=j;k<10-n;k++)
a[k]=a[k+1];
n++;}
}
for(i=0;i<10-n;i++)printf("%3d",a[i]);
}
7、下面程序的功能是输入5个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的5个数。
main()
{inta[5],max,min,i,j,k;
for(i=0;i<5;i++)
scanf("%d:
&a[i];
min=a[0];
for(i=1;i<5;i++)
if(a[i]max=a[0];
for(i=1;i<5;i++)
ifa[i]>max){max=a[i];【2】;}
【3】
printf("\nThepositionofminis:
%3d\n",k);
printf("\nThepositionofmaxis:
%3d\n",j);
for(i=0;i<5;i++)
printf("%5d",a[i]);
}
参考答案:
【1】j=i【2】k=i【3】a[j]=max;a[k]=min;
布置作业
上机练习:
课堂例题
汇编练习:
循环章节1-5
课题
一维数组习题课
教学
目的
掌握一维数组的初始化与应用
课时安排
2
教
学
内
容
及
过
程
设
计
一复习引入
#include
voidmain()
{inti;
intf[20]={1,1};
for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{if(i%5==0)printf(″\n″);printf(″%12d″,f[i]);}/*For循环结束*/
}/*程序结束*/
二、习题讲解
1、以下对一维数组a的正确说明是参考答案:
D。
A)intn;scanf("%d",&n);inta[n];B)intn=10,a[n];
C)inta(10);D)#defineSIZE10
inta[SIZE];
2.若有说明:
inta[10];则对数组元素的正确引用是参考答案:
D。
A)a[10]B)a[3,5]C)a(5)D)a[10-10]
3.在C语言中,一维数组的定义方式为:
类型说明符数组名考答案:
A
A)[常量表达式]B)[整型表达式]
C)[整型表达式]或[整型常量]D)[整型常量]
4下面程序有错误的行是.
1main()
2{
3inta[3]={1};
4inti;
5scanf("%d",&a);
6for(i=1;i<3;i++)a[0]=a[0]+a[i];
7printf("a[0]=%d\n",a[0]);
8}
1、若有以下输入(数之间有空格),则下面程序的运行结果是
参考分析:
本程序是删除用户所输入的所有奇数。
7165467983246122-1
main()
{intb[51],x,i,j=0,n=0;scanf("%d",&x);while(x>-1){b[++n]=x;scanf("%d",&x);}
for(i=1;i<=n;i++)if(b[i]%2==0)b[++j]=b[i];
for(i=1;i<=j;i++)printf("%3d",b[i]);}
备注
实例上机,习题课2节
课题
第六章数组
教学
目的
1掌握二维数组的定义和引用
教材
分析
教学重点
二维数组的定义、引用、初始化
教学难点
数组的存储形式,数组的首地址
课时安排
2
教学方法
讲授与演示法相结合例举法、讨论法
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
第一课时
一、复习引入
一维数组他定义,是一行同类型的变量存储空间,那若是几行同类型的变量来存量数据将如何实现?
二、新授
1、二维数组的定义
类型说明符数组名[常量表达式1][常量表达式2];
如:
intnumber[5][4];数组的存储结构:
以行为主序的连续空间
定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
如下:
floata[3][4],b[5][10];
不能写成floata[3,4],b[5,10];
注意:
我们可以把二维数组看作是一种特殊的一维数组:
它的元素又是一个一维数组。
例如:
可以把a看作是一个一维数组,它有3个元素:
a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组
2、二维数组在内存中的存放
二维数组中的元素在内存中的排列顺序是:
按行存放,即先顺序存放第一行的元素,再存放第二行的元素……下图表示对a[3][4]数组存放的顺序
3、二维数组的引用:
二维数组元素的表示形式为:
数组名[下标][下标]
例如:
a[2][3]
下标可以是整型表达式,如a[2-1][2*2-1]
不要写成a[2,3],a[2-1,2*2-1]形式
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。
常出现的错误有:
inta[3][4];/*定义a为3×4的数组*/
┆
a[3][4]=3;
练习:
1、以下对二维数组a的正确说明是参考答案:
C。
A)inta[3][];B)floata(3,4);
C)doublea[1][4];D)floata(3)(4);
2、若有说明:
inta[3][4];则对a数组元素的正确引用是参考答案:
C
A)a[2][4]B)a[1,3]C)a[1+1][0]D)a
(2)
(1)
参考分析:
在实际应用中a[2][4]这种应用方式实质上访问的是a[3][0],这是越界访问。
教
学
内
容
及
过
程
设
计
第二课时
1、复习第一课时内容并拓展思考:
有了二维数组的基础,那么多维数组如何定义呢?
定义三维数组:
floata[2][3][4];
注意:
多维数组元素在内存中的排列顺序:
第一维的下标变化最慢,最右边的下标变化最快
2、二维数组的初始化
1. 分行给二维数组赋初值:
如
staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2. 可以将所有数据写在一个花括号内,按数组排列的顺序对元素赋初值;如:
staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3. 如果花括号内的初值个数少于每行中的数组元素个数,则每行中后面的元素自动赋初值0;也允许代表给每行元素赋初值的花括号的数目少于数组的行数,这时,后面各行的元素也自动赋0值。
4.C语言规定,可以用初始化的方法来隐含定义二维数组第一维的大小,即可以省略数组定义中第一个方括号中的表达式,但不能省略第二个方括号中的表达式。
如:
staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};等价于staticint[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
在定义时也可以只对部分元素赋初值而省略第一维长度,但应分行赋初值。
如:
staticinta[][4]={{0,0,3},{0},{0,10}};
3、二维数组的输入与输出
用二重循环,以a[m][n]为例
for(i=0;ifor(j=0;j{……}
4、实例讲解:
将一个二维数组行和列元素互换,存到另一个二维数组中。
#include
voidmain()
{
inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf(″arraya:
\n″);
for(i=0;i<=1;i++)
{for(j=0;j<=2;j++)
{printf(″%5d″,a[i][j]);b[j][i]=a[i][j];}
printf(″\n″);
}
printf(″arrayb:
\n″);
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
printf("%5d″,b[i][j]);printf(″\n″);}
}/*程序结束*/
教
学
内
容
及
过
程
设
计
5、思考练习:
有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
(要求先作流程图再写程代码,并上机调试)
#include
voidmain()
{
inti,j,row=0,colum=0,max;
inta[3][4]={{1,2,3,4},{9,8,7,6},
{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{max=a[i][j];
row=i;
colum=j;
}
printf(″max=%d,row=%d,colum=%d\n″,
max,row,colum);
}/*程序结束*/
三、课堂小结
1、 二维数组的定义、引用及初始化、二维数组的存储形式
四、布置作业
上机练习:
上机训练题+例题汇编练习:
(P77)17-28
备注
上机练习,另练习与讲解各一课时
二维数组的定义和二维数组元素的引用
1、若有以下定义,则对b数组元素正确的引用是
intb[2][3]={1,2,3,4,5,6};
Ab[1]Bb[0][3]
Cb[2][2]Db[1][1]
2、
3、以下不能正确定义二维数组的选项是( )
A.int a[2][2]={{1},{2}};
B.int a[][2]={1,2,3,4};
C.int a[2][2]={{1},2,3};
D.int a[2][]={{1,2},{3,4}};
4、以下不能正确定义二维数组的选项是( )。
A.
B.
C.
D.
5、
6、
7、在下列叙述中,错误的是( )。
A.C语言中,二维数组或多维数组是按行存放的
B.赋值表达式b[1][2]=a[2][3]是正确的
C.chara[1];a[0]='A'与inta[1];a[0]='A'等价
D.数组名后的方括号内可以为常量表达式,也可以为变量
8、下列叙述中正确的是( )。
A.为了建立一个关系,首先要构造数据的逻辑关系
B.表示关系的二维表中各元组的每一个分量还可以分成若干数据项
C.一个关系的属性名表称为关系模式
D.一个关系可以包括多个二维表
9、下列程序执行后的输出结果是
main()
{ char arr[2][4];
strcpy(arr,"you"); strcpy(arr[1],"me");
arr[0][3]=′&′;
printf("%s\n",arr);}
A.you&me B.you
C.me D.err
10、下列二维数组初始化语句中,正确且与语句inta[][3]={1,2,3,4,5}等价的是( )。
A.inta[2][]={{1,2,3},{4,5}};
B.inta[][3]={1,2,3,4,5,0};
C.inta[][3]={{1,0},{2,0},{3,0)};
D.inta[2]={{1,2,3},{4,5,6}};
11、定义如下变量和数组:
int k; int a[3][3]={9,8,7,6,5,4,3,2,1};
则下面语句的输出结果是
for(k=0;k<3;k++)printf("%d",a[k][k]);
A.7 5 3B.9 5 1
C.9 6 3 D.7 4 1
12、若二二维数组a有m列,则在a[i][j]前的元素个数为( )
A.i*m+IB.i*m+j
C.j*m+i+1D.i*m+j+1
13、下面的程序段运行后,输出结果是( )。
A.9 B.不确定值
C.0D.18
14、若有定义语句:
int a[3][6];按在内存中的存放顺序,a数组的第10个元素是( )。
A.a[0][4]
B.a[1][3]
C.a[0][3]
D.a[1][4]
15、若有函数内部说明:
int a[3][4];则数组a中各元素
A.可在程序的运行阶段得到初值0
B.可在程序的编译阶段得到初值0
C.不能得到确定的初值
D.可在程序的编译或运行阶段得到初值0
16、以下语句定义正确的是( )
A.inta[1][4]-{1,2,3,4,5};
B.floata[3][]={{1},{2},{3}};
C.onga[2][3]={{1},{1,2},{1,2,3},{0,0)};
D.doublea[][3]={0};
二、填空题
17、以下程序中,函数 sumColumM的功能是:
求出M行N列二维数组每列元素中的最小值,并计算它们的和值。
和值通过形参传回主函数输出。
请填空。
#define M 2
#define N 4
void SumColumMin(int a[M][N],int *sum)
{ int i,j,k,s=0;
for(i=0;i
{ k=0;
for(j=1;j
if(a[k]>a[j])k=j;
s+=_______;
}
[*sum] =s;
}
main()
{ int x[M][N]={3,2,5,1,4,1,8,3},s;
SumColumMin(_______);
printf("%d\n",s);
}
18、设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部【13】。
要求形参名为b。
main()
{double s[10][22];
int n; ┆
┆
fun(s);
┆
}
19、以下程序运行后的输出结果是_______。
main()
{ int a[4][4]={{1,2,3,4},{5,6,7,8},{11,12,13,14},{15,16,17,18}};
int i=0,j=0,s=0;
while(i++<4)
{
if(i==2||i==4) continue;
j=0;
do{ s+= a[j]; j++; } while(j<4);
}
printf("%d\n",s);
}
20、在关系模型中,把数据看成一个二维表,每一个二维表称为一个 【5】 。
课题
字符型数组
教学
目的
1、掌握字符数组的定义、初始化,结束标志
2、字符串数据在内存中的存放
教材
分析
教学重点
数组的定义
教学难点
符数组定义与存放
课时安排
1
教学方法
讲授与演示法相结合讨论法
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一、复习引导
从一般的一维数组、二维数组到特殊的字符数组
二讲授新课
一)、字符数组的定义:
char数组名[exp];如:
charc[10];
二)、字符数组的初始化
1.给每一个字符型数组元素依次赋给一个单字符。
如:
charstr[6]={‘C’,‘h’,‘i’,‘n’,‘a’,‘\0’};
2.直接在赋值号右边给出字符串常量。
如:
charstr[6]=“China”;
注意:
a)字符数组的长度可以通过赋初值的方式隐含定义;如:
charstr[]={‘C’,‘h’,‘i’,‘n’,‘a’,‘\0’};
charstr[]=“China”;
b)如果括号中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符(即‘\0’)。
c)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′};数组c的长度自动定为10。
三)、字符串和字符串结束标志
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’
字符数组并不要求它的最后一个字符为′\0′,甚至可以不包含′\0′。
例如:
charc[5]={′C′,′h′,′i′,′n′,′a′};但是由于系统对字符串常量自动加一个′\0′。
因此,为了使处理方法一致在字符数组中也常人为地加上一个′\0′。
例如:
charc[6]={′C′,′h′,′i′,′n′,′a′,′\0′};
组讨论思考:
定义字符数组∶charc[]={“Pascalprogram”};要用一个新的字符串代替原有的字符串”Pascalprogram”,从键盘向字符数组输入∶Hello如果不加′\0′的话