第一篇:C语言《二维数组》说课稿(写写帮整理)
《二维数组》说课稿
一、教学目标
1、通过本次课教学,学生能进一步理解二维数组的定义,二维数组的引用的方法;
2、掌握二维数组的初始化
3、技能目标:培养学生逻辑思维能力、综合运用知识的能力和自主学习能力;
二、教材分析
选用教材为李腾编著的《编程语言基础——C语言》,该教材由国防科技大学出版社出版,教材特点如下:
1、在内容上体现科学性、时代性、实用性,编排上面向应用,理论与实践有机结合;
2、采用案例教学法等教学手段,各章节均有案例,贯穿整个课程进行难点讲解,以实际应用作为突破口,使学生能够真实体验到知识的实际应用,提高兴趣,促进理解;教学与项目开发融为一体,浅显易懂,符合中职学生认知规律。
3、实验实训环节结合教学内容,实验项目丰富。课程设计中案例学生熟悉。本节课教学内容参考教材第4章的4.2节:二维数组。
三、学生分析
本课程的教学对象是中职学生,他们文化基础较差,计算机专业知识薄弱,C语言程序设计是他们学习的第一门计算机语言类课程,学习时较困难,入门较慢。本次课的教学内容中数组的概念他们容易理解,简单的一维数组对他们不太难,但涉及二维数组的编程较为困难。
另外,中职学生对于上机实际操作要比学习理论知识更为有兴趣;简单的实验项目都能完成,但解决实际应用问题的能力也较差。因此,在教学中通过演示让学生有感性认识,提高学习兴趣;通过提出问题让学生讨论议一议,主动思考如何解决;通过一个教学任务让学生动手做一做。
四、教学重点、难点及解决办法
1、本次课教学重点 1)二维数组的定义; 2)二维数组元素的引用;
在教学过程的叙述中,要抓住教学的重点、最能体现教学理念的内容和最能展示教学艺术的环节,作较为详细的叙述。
2、本次课教学难点 1)二维数组的初始化 2)二维数组的实际应用
3、难点解决办法
1)通过演示让学生有感性认识,并从一维数组入手,逐步引入二维数组的概念,弱化实用性不强的细节;
2)围绕字符数组进行难点讲解,以实际应用作为突破口,使学生能理解二维数组在实际中的应用,提高学习兴趣;
3)针对难点设置上机实际操作内容,进一步掌握二维数组程序设计方法。4)在实验实训过程中布置任务项目,通过实践环节进一步理解和掌握重点难点,达到学习目的。
五、教学理念、方法及手段
本次课采用理(论)实(践)一体化教学理念通过任务驱动(项目教学)、讲练结合等教学手段。
1、任务驱动:通过书上实例这一任务,掌握二维数组程序设计认方法。并掌握相应知识点,突出重点,分解难点。
2、讲练结合:授课地点为计算机实验室,采用边讲边练的教学互动形式。教学过程中,适当安排学生在计算机上进行进行实际程序设计,通过运行调试自己设计的程序,让学生亲自观察和体验程序设计的成功感受,加深知识的理解。
六、教学设计(时间分配)
1、任务提出,演示成果程序,明确目标,提出要求。(3分钟)(1)演示程序成果,在屏幕上输入源程序,并运行。
(2)任务分析:完成本次课的任务所需知识―――二维数组的应用。
2、知识回顾(3分钟)
数组的概念,一维数组的定义,一维数组元素的引用,一维数组的初始化,注意事项。
3、上机实训1(3分钟)
简单程序:用一维数组编程,实现在屏幕上显示1,2,3……10。
(上机技能训练的操作、指导、辅导过程,以学生实际操作动手为主,教师进行辅导指导、师生共同探讨完成,应充分体现学生的主体地位)思考提问:如何输出一个表格。
4、导入新课(6分钟)
(1)通过练习1,分析在屏幕上输出中存在的问题。(2)二维数组的定义,引用与初始化。
5、上机实训2,(6分钟)输出一个二维表: 1 5 9 11 12
6、上机实训3:4.6编程将数组a[3][4]转置(8分钟)(1)调试程序时要注意观察程序运行情况。程序出错原因,提醒以后编程时注意。
7、上机实训4,从键盘输入年、月、日,计算该日是这一年的第几天(10分钟)
8、课堂小结及作业(5分钟)
9、Question & Answer(1-2分钟)
七、学法指导
1、鼓励学生自主探索和合作交流。引导学生自主地从事观察、分析、交流等活动,使学生形成对计算机语言知识有效的学习策略。
2、鼓励与提倡解决问题的多样性,引导学生在与他人的交流中去选择合适的策略,丰富自己的思维方式,获得成功的体验和不同的发展。
3、引导学生将所学计算机知识应用到其他学科中去,使学生觉得计算机有很用,同时也培养了学生逻辑思维能力。
第二篇:c语言 二维数组与指针 教案
讲授
9.6二维数组和指针
2课时
掌握二维数组的地址表示方法 掌握指向数组元素的指针变量
掌握指向数组元素的指针变量
掌握用指向由m个元素组成的一维数组的指针变量
指向一维数组的指针变量
无
作业见后 一、二维数组的地址
例:定义二维数组int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
则二维数组a是数组的数组,由3个一维数组所组成的,即3个元素:a[0],a[1],a[2]。而每个元素又是一个一维数组。
二、指向二维数组元素的指针变量
1、指向数组元素的指针变量
例1 用指向元素的指针变量输出二维数组元素的值 #include
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p {if((p-a[0])%4==0)printf(″\n″); printf(″%4d″,*p); } }用指向由m个元素组成的一维数组的指针变量 例2 输出二维数组任一行任一列元素的值 #include int(*p)[4],i,j; p=a; scanf(“i=%d,j=%d”,&i,&j); printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j)); } 注意: 指向一维数组的指针变量的定义格式应写成:基类型(*p)[N] 上述语句int(*p)[4],代表p是一个指针变量,它指向包含4个整型元素的一维数组。*p两侧的小括号不可少,如果写成*p[4],由于[]运算级别高于*,*p[4]是指针数组。 p=a;表明p指向数组a中的第0行,此时p+1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位,p+1地址就增加了8个字节。*(p+i)+j是a[i][j]的地址,这里的i是以一维数组的长度为单位,j则是以数组元素的长度为单位的。 复习 新授 讲授 复习默写 1、选择排序的基本思想 2、从键盘输入5个整数,使用选择法从小到大排序,编程实现。 一、二维数组的地址 例:定义二维数组int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 则二维数组a是数组的数组,由3个一维数组所组成的,即3个元素:a[0],a[1],a[2]。而每个元素又是一个一维数组。设二维数组的首行的首地址为2000,则: 二、指向二维数组元素的指针变量 1、指向数组元素的指针变量 例1 用指向元素的指针变量输出二维数组元素的值 #include { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p {if((p-a[0])%4==0)printf(″\n″); printf(″%4d″,*p); } } 注意:上例中如果对p赋值p=a[0];不能写成 p=a;因为此时a 是行指针,而p是列指针只能指向一个整型变量,a[0]是第0行的数组名,即第0行的首地址就是a[0][0]的地址。请学生思考上述赋值语句还可以写成什么? p=*a;p=&a[0][0];用指向由m个元素组成的一维数组的指针变量 例2 输出二维数组任一行任一列元素的值 #include int(*p)[4],i,j; p=a; scanf(“i=%d,j=%d”,&i,&j); printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j)); } 注意: 指向一维数组的指针变量的定义格式应写成:基类型(*p)[N] 上述语句int(*p)[4],代表p是一个指针变量,它指向包含4个整型元素的一维数组。*p两侧的小括号不可少,如果写成*p[4],由于[]运算级别高于*,*p[4]是指针数组。 小结 作业 p=a;表明p指向数组a中的第0行,此时p+1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位,p+1地址就增加了8个字节。*(p+i)+j是a[i][j]的地址,这里的i是以一维数组的长度为单位,j则是以数组元素的长度为单位的。 例3: int(*t)[4],a[3][4]={{1,3,5,7}, {11,13,15,17},{21,23,25,27}};t = a;printf(“%d,%d”, **t, t[1][2]);t++;t++;printf(“%d”, **t); 运行结果:1,1521 【课堂小练习】 1、[2010.3.27]若有:int(*p)[3];则正确的是(D)A)定义了基类型为int的三个指针变量 B)p是基类型为int的具有三个元素的指针数组 C)定义了名为*p,具有三个元素的整型数组 D)定义了一个名为p的指针变量,它可以指向每行有三个整数元素的二维数组 2、输入:1 2 3<回车>,则输出结果是 int a[3][2]={0},(*p)[2],i,j;p=a;for(i=0;i<2;i++){ scanf(“%d”,p);p++;} for(i=0;i<3;i++)for(j=0;j<2;j++)printf(“%d”,a[i][j]); 1、二维数组的地址 2、指向数组元素的指针变量 3、指向一维数组的指针变量 1、整理课堂笔记 2、完成深入研究整型指针练习题 C语言——运用一维数组和二维数组输出杨辉三角 **********一维数组********** #include #define n 10 int main() { } int a[n]={1,1},i,j;printf(“%5dn%5d%5dn”,1,a[0],a[1]);for(i=1;i **********二维数组********** #include int main() { int a[30][30]={0},i,j,n=10; for(i=0;i<=n-1;i++) a[i][0]=1; for(i=1;i<=n-1;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<=n-1;i++) { for(j=0;j<=i;j++) printf(“%5d”,a[i][j]); printf(“n”); } return 0; } C语言二维数组的定义和引用 7.1.1二维数组的定义 前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。 二维数组定义的一般形式是:类型说明符 数组名[常量表达式1][常量表达式2] 其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如: int a[3][4];说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即: a[0][0],a[0][1],a[0][2],a[0][3] a[1][0],a[1][1],a[1][2],a[1][3] a[2][0],a[2][1],a[2][2],a[2][3] 二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。 在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。 7.1.2二维数组元素的引用 二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标] 其中下标应为整型常量或整型表达式。例如: a[3][4] 表示a数组三行四列的元素。 下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。 【例7.6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。 可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下: main(){ int i,j,s=0,average,v[3],a[5][3]; printf(“input scoren”); for(i=0;i<3;i++){ for(j=0;j<5;j++) { scanf(“%d”,&a[j][i]); s=s+a[j][i];} v[i]=s/5; s=0; } average =(v[0]+v[1]+v[2])/3; printf(“math:%dnc languag:%dndbase:%dn”,v[0],v[1],v[2]); printf(“total:%dn”, average);} 程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。 7.1.3二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]: 按行分段赋值可写为: int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };按行连续赋值可写为: int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85}; 这两种赋初值的结果是完全相同的。 【例7.7】 main(){ int i,j,s=0, average,v[3]; int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}}; for(i=0;i<3;i++) { for(j=0;j<5;j++) s=s+a[j][i]; v[i]=s/5; s=0; } average=(v[0]+v[1]+v[2])/3; printf(“math:%dnc languag:%dndFoxpro:%dn”,v[0],v[1],v[2]); printf(“total:%dn”, average); } 对于二维数组初始化赋值还有以下说明: 可以只对部分元素赋初值,未赋初值的元素自动取0值。 例如: int a[3][3]={{1},{2},{3}};是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:0 0 0 0 0 0 int a [3][3]={{0,1},{0,0,2},{3}};赋值后的元素值为: 0 1 0 0 0 2 0 0 如对全部元素赋初值,则第一维的长度可以不给出。 例如: int a[3][3]={1,2,3,4,5,6,7,8,9};可以写为: int a[][3]={1,2,3,4,5,6,7,8,9}; 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。 如二维数组a[3][4],可分解为三个一维数组,其数组名分别为: a[0] a[1] a[2] 对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。 实验九 数组 一、一维数组 1、编写程序,测试下列数组的定义方式是否正确(1)main(){ int n;scanf(“%d”,&n);int a[n];//…….}(2)main(){ int n=10;int a[n];a[0] = 1;//......}(3)#include 2、运行下面的C程序,根据运行结果,可以说明什么? #include 3、调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。main(){ int i,n,a[10],av; for(i=0;i for(i=0;i if(i%3= =0)printf(“n”); } for(i=0;i!=n;i++)av+=a[i]; printf(“av=%fn”,av); } //尤其注意最后一次循环 上面给出的程序是完全可以运行的,但是运行结果是完全错误的。调试时请注意变量的初值问题、输出格式问题等。请使用前面实验所掌握的调试工具,判断程序中的错误并改正。在程序运行过程中,可以使用 5、编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。分析讨论 通过实验,分析定义与引用数组的区别。二、二维数组 1.写出程序输出结果(1)#include”stdio.h” main(){ int i, j, t, a[4][4]={11,22,33,44,1,2,3,4,10,20,30,40,12,22,32,42};for(i=0;i<4;i++)for(j=0;j for(j=0;j<4;j++)printf(“%d”,a[i][j]); } }(2)#include”stdio.h” main(){int i,j,m,n,a[3][4]={43,32,22,13,11,22,33,44,44,11,32,31};m=n=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[m][n]>a[i][j]){m=i;n=j;} printf(“a[m][n]=%d,m=%d,n=%d”,a[m][n],m,n);} 3、操作符&用以求一个变量的地址,这在函数scanf 中已经使用过了。现在要你设计一个程序,返回一个3 * 5 的二维数组各元素的地址,并由此说明二维数组中各元素是按什么顺序存储的。 4、输入4×4的数组,编写程序实现: ⑴ 求出对角线上各元素的和; ⑵ 求出对角线上行、列下标均为偶数的各元素的积; ⑶ 找出对角线上其值最大的元素和它在数组中的位置。 三、字符数组 1.验证程序输出结果 #include”stdio.h” main(){char a[ ]=“ab12cd34ef”;int i, j;for(i=j=0;a[i ];i++)if(a[ i]>=’a’&&a[ i]<=’z’)a[ j++ ]=a[ i ];a[ j ]=’ ’; printf(“%sn”,a);} 2、编写程序,输入若干个字符串,求出每个字符串的长度,并打印最长一个字符串的内容。以“stop”作为输入的最后一个字符串。3、1983 年,在ACM图林奖颁奖大会上,杰出的计算机科学家,UNIX 的鼻祖,C语言的创始人之一,图林大奖得主,Ken Thompson 上台的第一句话是:“我是一个程序员,在我的1040表上我自豪地写上了我的职业。作为一个程序员,我的工作就是写程序,今天我将向大家提供一个我曾经写过的最精练的程序。”这个程序如下: #include 1.以下为一维整型数组a的正确说明是_________.a)int a(10);b)int n=10,a[n];c)int n;d)#define SIZE 10;scanf(”%d“,&n);int a[SIZE];int a[n];2.以下对二维数组a的正确说明是________.a)int a[3][];b)float a(3,4); c)double a[1][4] d)float a(3)(4);3.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为______.(假设a[0][0]位于数组的第一个位置上。)a)i*m+j b)j*m+i c)i*m+j-1 d)i*m+j+1 4.若二维数组a有m列,则在a[i][j]前的元素个数为________.a)j*m+i b)i*m+j c)i*m+j-1 d)i*m+j+1 5.若有以下程序段: int a[]={4,0,2,3,1},i,j,t;for(i=1;i<5;i++){t=a[i];j=i-1;while(j>=0&&t>a[j]){a[j+1]=a[j];j--;} a[j+1]=t;}......则该程序段的功能是_________.a)对数组a进行插入排序(升序)b)对数组a进行插入排序(降序)c)对数组a进行选择排序(升序)d)对数组a进行选择排序(降序)6.有两个字符数组a、b,则以下正确的输入语句是_______.a)gets(a,b);b)scanf(”%s%s“,a,b);c)scanf(”%s%s“,&a,&b);d)gets(”a“),gets(”b“);7.下面程序段的运行结果是_________.char a[7]=”abcdef“; #include a)SSW* b)SW* c)SW*A d)SW 二、填空题 1. 若有定义:double x[3][5];则x数组中行下标的下限为____0___,列下标的上限为___4____.2.下面程序以每行4个数据的形式输出a数组,请填空。 #define N 20 main(){int a[N],i;for(i=0;i main(){ int a[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j_____)sum=sum+_a[i][j]______;printf(”sum=%dn“,sum);} 4.当从键盘输入18并回车后,下面程序的运行结果是_____10010___.main(){int x,y,i,a[8],j,u,v;scanf(”%d“,&x);y=x;i=0;do {u=y/2; a[i]=y%2;i++;y=u;}while(y>=1)for(j=i-1;j>=0;j--)printf(”%d“,a[j]); main(){int a[5]={4,7,2,5,1};int i,j,m;for(i=1;i<5;i++){m=a[i];j=i-1_; while(j>=0&&m>a[j]){a[j+1]=a[j]_______;j--;} a[j+1]_______=m;} for(i=0;i<5;i++)printf(”%d“,a[i]);printf(”n“);} 6.下面程序的功能是在三个字符串中找出最小的,请填空。#include第三篇:C语言运用一维数组和二维数组输出杨辉三角
第四篇:黑马程序员C语言教程:C语言二维数组的定义和引用
第五篇:C语言数组