c程序设计基础教案(精选6篇)
教学目标:
一认知目标:了解C语言的特点和C语言的开发步骤
二能力目标:初步了解C程序的组成结构和主函数的作用;
掌握五种基本算术运算符的使用:+、—、*、/、%,了解优先级与结合性;
三情意目标:学习C语言基础上能使用Microsoft Visual C++6.0 进行基本的C程序开发
教学要求:
识记:
计算机程序设计语言的一些必备知识与理论 理解:
理解C程序的组成结构和主函数的作用;
理解C语言等高级程序设计语言的开发过程
理解C语言中各种运算的运算规则,由运算符和相关数据组成表达式的方法;
运用:
能使用printf()函数进行信息的输出;
能编写简单程序
教学重点:
1)计算机程序设计语言的理论知识,语言的分类和特点以及开发过程等; 2)C语言的简介,结构特征和特点等;
3)如何使用Microsoft Visual C++ 6.0进行C语言程序开发; 4)C语言源程序的结构介绍及基本语法的简介; 5)C语言源程序的书写要求;
6)C语言基础:函数的组成、标识符及其命名、变量的声明、变量的赋值、各种算数运算符的使用及优先级与结合性等。
教学难点:
如何让学生理解C语言的结构及语法基础还有源程序的书写要求,掌握对函数的组成、标识符及其命名、变量的声明、变量的赋值、各种算数运算符的使用及优先级与结合性等
授课方法: 讲授法与演示法相结合计算机程序设计语言基础
一新课导入
大家都听过程序员没?或者是网络上俗称调侃的码农?对,简单讲就是编写计算机代码的工作。在新世纪大家对与计算机相关的软件和产品都不陌生,每个人都使用过计算机软件如微信,QQ等等,那这些软件又是怎么开发出来的呢?简单来讲它们是怎么产生的呢?对,它们都是使用计算机程序编写出来的。今天我们就来学习了解下计算机程序设计语言。
二新课讲授
1计算机程序设计语言介绍及分类 程序概念:程序是由一系列指令组成的,为解决某一具体问题而设计的一系列排列有序的指令的集合。
程序设计语言分为三类:机器语言、汇编语言、高级语言。 机器语言:一台计算机中所有指令集合称为该计算机的指令系统,这些指令就是机器语言,它是一种二进制语言。
优点:面向机器、程序简洁、运行速度快;
缺点:不直观、难懂、难记、难写、难以修改和维护
汇编语言:使用符号(助记符)来代替机器语言中的二进制代码
优点:质量高、执行速度快、占用内存少
缺点:面向机器,与机器语言基本上一一对应,具有机器语言的缺点
高级语言:接近自然语言,使用英语单词表达语句,便于理解、记忆和掌握
优点:通用性强,便于理解、记忆和掌握 缺点:不能直接运行源程序,运行速度相对慢
2高级程序设计语言的开发过程
分析问题、建立模型 表现模型 源程序的编写 程序的编译与连接 程序的测试与调试C语言的特点
① 既有高级语言的程序思想与设计方法,又有低级语言的操作能力; ② 结构化体系
③ 可以直接访问内存的物理地址,丰富的运算符和数据类型 ④ 可移植性强 ⑤ 代码效率高 使用Microsoft Visual C++ 6.0开发C语言程序(1)启动Microsoft Visual C++ 6.0(2)(3)(4)(5)新建项目 新建文件
在出现的文本窗口中输入程序 编译并运行程序 C源程序的结构特征
#include
/*编译预处理,包含标准输入输出文件头文件*/ Int main(void)/*主程序名*/ {
/*表示函数的开头*/ Printf(“Hello,World!n”);
/*函数体*/ Return 0;}
/*表示函数的结束*/
说明:
(1)程序一般用小写字母书写;
(2)C程序是由函数构成的,函数是C程序的基本单位;(3)每个程序必须要有一个main()(只能有一个),称主函数;(4)程序体必须要在{}之间;
(5)每个语句的结尾,必须要有“;”作为终止符;(6)用/*..........*/作注释,//可作行注释;
三归纳小结
本节主要介绍了计算机程序设计语言及分类以及高级程序设计语言的开发过程,重点介绍C语言的特点和使用Microsoft Visual C++ 6.0开发C语言程序的步骤,最后由最简单的C语言源程序来学习了解C语言的重点基本规则。
四 课堂巩固练习
带领学生使用演示如何使用Microsoft Visual C++ 6.0开发环境,并演示简单的C语言源程序整个开发过程步骤。
五作业布置
在电脑上安装Microsoft Visual C++ 6.0软件,并学会新建项目和文件,将helloworld程序编辑运行出来,并练习其他输出语句的程序设计。
六后记
1“程序设计基础”课程教学内容要点
“程序设计基础”课程教学大纲中明确规定了教学内容,这些内容涵盖的知识单元有:程序设计语言概论,程序设计基本结构,算法与问题求解,事件驱动程序设计,算法策略,基本算法,面向对象程序设计。
一般情况下,一个问题的求解过程可能涉及多个知识点,一个知识点可能会出现多个语法要素,如在求解两个整数的最大公约数问题上,会用到如变量定义、输入输出、数据交换、循环控制结构等知识点,而就单纯循环控制结构中就会出现很多语法要素,如用到的关键词可能有while,for等,运算符有=,%等。
问题空间,知识点和语法要素的对应关系可以用图1表示。
因此对语法内容的选取首先需要确定问题空间,即先确定学习者所能解决的问题范围。对于程序设计初学者来说,用前文所述的十三类常用算法就足够了。
2 C/C++语法特点
从语法的角度看,源程序实际上是一个字符序列。这些字符序列按顺序分别组成了一系列“单词”。这些“单词”包括语言事先约定好的保留字(ReservedWords,如用于描述分支控制的if、else,用于描述数据类型的int等)、常量(Constant)、运算符(Operator)、分隔符以及程序员自己定义的变量名、函数名等。
“单词”的组合形成了语言有意义的语法单位,如变量定义、表达式(Expression)、语句、函数定义等。一些简单语法单位的组合又形成了更复杂的语法单位,最后一系列语法单位组合成程序。下面就以C/C++语言为例,简要说明其最主要的语法要素。
3 C/C++语言的主要“单词”
标识符C/C++语言的标识符规定由字母、数字以及下划线组成,且第一个字符必须是字母或下划线。在C/C++语言中,标识符中的字母大小写是有区别的。最主要的标识符是:保留字和用户自定义标识符。保留字也称关键字,它们是C/C++语言规定的、赋予它们以特定含义、有专门用途的标识符。这些保留字也主要与数据类型和语句有关。如int(整数类型)、float(浮点数类型)、char(字符类型)、typedef(类型定义)、以及与语句相关的if、else、while、for、break等。
自定义标识符:包括在程序中定义的变量名、数据类型名、函数名以及符号常量名。一般来说,为了便于程序阅读,经常取有意义的英文单词作为用户自定义标识符。常量常量是有数据类型的,如,整型常量123、实型常量12.34、字符常量’a’、字符串常量“helloworld!”等。
运算符:代表对各种数据类型实际数据对象的运算。如,+(加)、-(减)、*(乘)、/(除)、%(求余)、>(大于)、>=(大于等于)、==(等于)、=(赋值--assignment)等。绝大多数运算为双目运算(涉及两个运算对象),也有单目(涉及一个运算数)和三目(三个运算数)运算,如C/C++语言中的条件运算“?:”就是一个三目运算。
分隔符:也叫做界符。如:;、[、]、(、)、#等。
4 C/C++语言的主要语法单位
表达式运算符与运算对象(可以是常量、函数、变量等)的有意义组合就形成了表达式。如,2+3*4、i+2
变量定义:变量也都有数据类型,所以在定义变量时要说明相应变量的类型。变量的类型不同,它在内存中所占的空间大小也会有所不同。变量定义的最基本形式是:“类型名变量名;”。如,“inti;”就定义了一个整型变量i。
语句:语句是程序最基本的执行单位,程序的功能就是通过对一系列语句的执行来实现。C/C++语言中的语句有多种形式:
最简单的语句:表达式加“;”。在C/C++语言中赋值也被认为是一种运算,如“i=j+2”(把j加2的结果给变量i)就是一个包含“+”和“=”两种运算的表达式,“+”优先级较高。在上述表达式后加“;”就成了一个执行赋值过程的语句。
分支语句:实现分支控制过程,即根据不同的条件执行不同的语句(或语句模块)。具体有两种形式,即双路分支的if-else语句与多路分支的switch语句。循环语句:C/C++语言实现循环控制的过程具体有三种形式,即while语句、for语句、do-while语句等。
复合语句(Compoundstatement):通过一对大括号“{}”,将若干语句顺序组合在一起就形成了一个程序段。如,前面while语句中的“{sum=…}”。
函数定义与调用:函数是完成特定任务的独立模块,是C/C++语言唯一的一种子程序形式。
以上简单描述了C/C++语言最主要的语法要素,它还有非常丰富的库函数以支持和实现非常庞大的功能。由以上内容可见,语法单位是单词之间通过各种组合方式构成的,如,变量和运算符组合的表达式,关键字中如for,while等构成的语句等。所以,本研究只从“单词”的角度研究基本语法要素构成的语法子集,暂时不考虑语法结构的问题。
5 实验设计
实验主要由以下几个步骤组成:
1)数据采集(数据采样):原始数据主要来源于目前国内用于“程序设计基础”课程的教材,包括国内的许多专家学者所编著的教材和国外原文教材的翻译版本教材。处理数据主要是其中的样例程序和课后习题的实现程序。由于这些教材形式主要包括课件及相关的电子文本,所以首先要解决的问题就是从自然语言文本中抽取样例程序,并生成TXT文本。
2)数据处理:数据处理阶段要解决的问题就是对已经筛选出的符合条件的程序进行分词、标注。分词工作会去除掉程序中多余无用的部分(如注释,多余空格等),标注的信息包括该词的类型(关键字、运算符、界符、标识符、常量),该词所属的程序文件编号,该程序所属的问题范畴。
对采集到的每个源程序文件进行分词标注之后均产生一个单词表,取名为“源文件名_单词表”,其结构如表1所示。
3)数据统计:对数据处理阶段得到的单词表进行统计。以单词出现的频数和在所有文件中出现的比例为统计依据。也就是说,最终得到的是所有程序文件中出现的C/C++语言的单词频数统计表(不包括重复出现的情况)。通过对该表的分析得出最后的结论。
6 数据采集
将目前国内大多数院校所选用的作为计算机及相关专业的“程序设
计基础”课程的教材作为主要分析对象。由于数据量较大,只能选取其中的一些由权威出版社及程序设计方面的专家学者所著的一部分。为了尽量降低采样主观性,体现实验数据的普遍性,主要使用了以下两种方法:一是在搜集到的现有教材中随机采样选三本;二是根据教材的发行量及在各大院校的使用情况选三本。
数据采集的渠道主要有网上搜索,与出版社联系。经过近半年的时间,收集到了大量用于普通高校本科计算机专业教学用C或者C++语言的程序设计教材,但是,这些教材绝大多数是PDG格式,或PDF格式,按照实验设计要求,数据处理阶段的数据源必须是TXT文本文件。这就对教材中例题的提取造成了很大的困难。现将例题转换过程中所用到的相关软件及技术简单总结如下。
1)PDG格式文件转TXT文件:Pdg2Pic软件的格式转化器将PDG文件以三种语言(英语、简体中文、繁体中文)生成TXT文件,生成的TXT文件中,已不再保留教材中文字的原有格式。经过对比实验,将该软件的转换语言选择为英语的时候,生成的TXT文件中的例题错误之处会更少。最后,将生成的TXT文档与源文件进行人工比对,发现例题中的错误,将其改正,并将例题之外的部分删除,就可以得到只含有例题的TXT文件了。
2)PDF文件转换为TXT文件:PDF文件的生成原文件可以是文档文件,也可以是图像文件。有于其原文件的不同,在将PDF文件转换TXT文件的过程中,决定了在转换过程中将采用不同的软件。
参考文献
[1]李炜.计算机高级语言程序设计课程的教学改革与实践[J].安徽师范大学学报:自然科学版,2003(2):24-26,29.
[2]杨起帆.C语言程序设计教程[M].浙江:浙江大学出版社,2006.
课题:
教学目的: 教学重点: 教学难点: 第十章 指针
§1-§2
1、了解指针与地址的概念
2、掌握指针变量的定义、初始化及指针的运算 指针变量的定义、初始化及指针的运算
指针的运算
步骤一 复习引导
指针是C语言的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。
指针的概念比较复杂,使用也比较灵活,因此初学者时常会出错,务请在学习本章内容时十分小心。
步骤二 讲授新课
§10.1 地址和指针的概念
计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址。
例:i =3;
或 scanf(“%d”, &i);
是将3送给 i所在的空间。
例:将3送到变量I_pointer所“指向”的单元(即I所标志的单元)。
所谓“指向”,是通过地址来体现的,I_pointer中的值为2000,它是变量I 的地址,这样就在I_pointer和变量之间建立起一种联系,即通过I_pointer能知道I的地址,从而找到变量I的内存单元。因而在C语言中,将地址形象化地称为“指针”。
意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。
内存单元的地址和内存单元的内容是两个不同的概念。
指针:就是地址,即内存单元的编号。
指针变量:用来存放另一变量的地址(即指针)的变量。
如:地址2000是变量 i的指针;i_pointer是指针变量,其值就是指针2000。
§10.2变量的指针和指向变量的指针变量
变量的指针就是变量的地址。
存放变量地址的变量是指针变量,用来指向另一个变量。
*i_pointer 表示 i_pointer 所指向的变量。
一、定义一个指针变量
指针变量的定义包含三个方面的内容:
⑴ 指针类型说明,即定义变量为一个指针变量 ⑵ 指针变量名
⑶ 变量值(指针)所指向的变量的数据类型。格式:
存储类型
基类型
*指针变量名;例:int *pointer_1, *pointer_2;
float *pointer_3;
char *pointer_4;
二、指针的引用
指针变量有两个运算符: & :取地址运算符
功能:取变量地址;单目,右结合。
* :取内容运算符(“间接访问”运算符)
功能:只能跟地址,取变量所指向单元的内容;单目,右结合。
例:&a为变量a的地址,*p 为指针变量p所指向的存储单元。
例:int a=5, *p=&a;
printf(“%d”, *p);main(){ int a,b;
int *pointer_1,*pointer_2;
a=100;b=10;
pointer_1=&a;
/*把变量a的地址赋给pointer_1*/
pointer_2=&b;
/*把变量b的地址赋给pointer_2*/
printf(“%d,%dn”,a,b);
printf(“%d,%dn”,*pointer_1, *pointer_2);} 输出结果:100, 10
100, 10
评注:
1、在第3行虽然定义了两个指针变量,只是提供了两个指针变量,但并未指向任何一个整型变量。称为指针“悬空”。
2、最后一行的*pointer_1和pointer_2就是变量a和b。
3、程序中两处出现*pointer_1等,含义不同。程序第3行中的*pointer_1表示定义指针变量pointer_1。它前面的*只是表示该变量是指针变量。程序最后一行中的*pointer_1则代表变量,即pointer_1所指向的变量。
4、第5行中的pointer_1=&a 是将a的地址赋给指针变量pointer_1,而不是*pointer_1。
注意:不应写成:*pointer_1=&a;
5、从上例中可看出,*pointer_1等价于a,*pointer_2等价于b,故凡在程序中出现a的地方均可用 *pointer_1 代替。所以,若有: int x, y, *px=&x;则下面的运算均是正确的: y=*px+1;
/*把 x 的内容加1 送变量y*/ printf(“%dn”, px);
/*打印当前x 的内容*/ d=sqrt((double)px);
/*把x的平方根送变量d*/ px=0;
/*把 x 置为0*/ *px+=1;
/*把 x 的值加 1*/(*px)++;
/*使 x 的值加 1*/ y=(*px)++;
/*即y=x, x++*/
6、假设px和py都被定义为指向int 对象的指针,而且px当前已指向了int 型变量x,则执行:
py=px;
/*把指针px的内容拷贝到指针py中去*/ 即
py和px 这两个不同的指针指向了同一对象x
7、指针不是整数,不能将它与整数混为一谈。例:
# include
例如:
# include
b = d;
printf(“%d n”, b);
……
}——编译不出错,但得不到希望的值
关于&和*运算符的说明:
假设已执行
pointer_1=&a;
1、&*pointer_1含义是什么?
&*pointer_1与&a相同,即变量a的地址。
2、*&a的含义是什么?
先进行&a运算,得a的地址,再进行*运算。
*&a、*pointer_1及变量a等价。
3、(*pointer_1)+ + 相当于a + +。
它与*pointer_1 + + 不同。
4、*pointer_1 + + 等价于*(pointer_1 + +),即先进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。
例10.2:输入a和b两个整数,按先大后小的顺序输出a和b。
main(){ int *p1,*p2,*p, a, b;
scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a
{p=p1;p1=p2;p2=p;}
printf(“n a=%d,b=%dn”,a,b);
printf(“max=%d,min=%dn”,*p1,*p2);
} 运行情况: 5,9
三、指针变量作为函数参数
例10.3对输入的两个整数按大小顺序输出。先考察如下程序,看是否能得到预期的结果
swap(int p1, int p2){ int temp;temp = p1;p1 = p2;p2 =temp;} main(){ int a, b;
scanf(“%d, %d”, &a, &b);
if(a
printf(“n%d,%dn”,a,b);} 不能得到预期的结果。改为:
swap(int *p1,int *p2){ int temp;
temp = *p1;
*p1 = *p2;
*p2 =temp;} main(){ int a,b;
int *pointer_1,*pointer_2;
scanf(“%d,%d”,&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a
swap(pointer_1,pointer_2);
printf(“n%d,%dn”,a,b);}
注:如果想通过函数调用得到n个改变的值,可以:
1、在主调函数中设n 个变量,用n个指针变量指向它们;
2、然后将指针变量作实参,将这n 个变量的地址传给所调用的函数的形参;
3、通过形参指针变量,改变该n个变量的值;
4、主调函数中就可以使用这些改变了值的变量。
四、指针(变量)的初始化 指针置初始化值的格式:
存储类型
基类型
*指针名=初始化值; 如:main()
{ static int a;
int *p=&a, *p1=p;
…… } 再如: int *p = 0;
或
int *p = NULL;
五、指针的运算
1、指针的算术运算
指针仅能进行加、减算术运算
如:p+n , p-n , p++ , p--, ++p ,--p
p-= n , p+= n , p1-p2 等 其中n是整数,p、p1、p2均为指针;
施行加法运算时,指针向地址增大的方向移动; 施行减法运算时,指针向地址减小的方向移动; 移动长度取决于指针的基类型,由计算机决定; 如有:int a,b,c, *pt =&a;
则
pt++ 则指针向后移动两个字节; 再如:main()
{ int *p1,a=8,b=3;
p1=&a;
printf(“%d,%dn”,(*p1)++, *p1++);
printf(“%d,%dn”,a, *p1);
} 运行结果:3,8,4 注:p1+k = p1+k*sizeof(p1的基类型);
p1-k = p1-k*sizeof(p1的基类型);如:
strlen(char *s)
{ char *p=s;
while(*p!=„‟)p++;
return(p-s);
}
2、指针的关系运算
设指针p1,p2指向同一数组中的元素,则
p1
p1
p1= =p2:
表示p1、p2指向数组中的同一元素;
同理可推出>、>=、<=、!=比较的意义; 不可将指针与其他类型的对象作比较;
若两指针指向不同数组中的元素,也不可比较;
允许将指针与NULL或数值0进行= =或!=的比较,以便判定一个指针是否为空指针。
步骤三 课堂小结
本课介绍了指针与地址的概念,指针变量的定义、初始化及指针的运算。
指针:就是地址,即内存单元的编号。
指针变量:用来存放另一变量的地址(即指针)的变量。
例如:int a=5, *p=&a;
printf(“%d”, *p);
注意:运算符*和&的用法,指针变量的自加自减运算。步骤四 布置作业
课后作业:第十章课后练习10.1 10.2 课题:
教学目的: 教学重点: 教学难点: 第十章 指针
§3 掌握指针与数组的知识 指向数组的指针变量
指向二维数组的指针
步骤一 复习引导
上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数组起始地址或某一元素的地址放到一个指针变量中)。
步骤二 讲授新课
所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。
一、指向一维数组的指针
定义形式:
int a[10];
int *p;
p=&a[0];
或
p=a;
含义:把数组的首地址赋给指针变量p。
也即: int *p=&a[0];
或
int *p=a;
二、通过指针引用数组元素
按C的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素(而不是简单地加1)。
如果p的初值为&a[0],则:
p+i a+i &a[i],即指向a数组的第i个元素。
*(p+i) *(a+i)
a[i]。
指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价 引用数组元素时,可以用:
1、下标法,如:a[i]
2、指针法,如:*(a+i)
或
*(p+i)
其中,a是数组名,p是指向数组的指针
例10.5:输出数组中的全部元素
假设有一个a数组,整型,有10个元素。用三种方法输出各元素的值:
1、下标法: main(){ int a[10], i;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“n”);
for(i=0;i<10;i++)
printf(“%d”,a[i]);}
2、利用数组名计算数组元素地址,找出元素的值。main(){ int a[10], i;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“n”);
for(i=0;i<10;i++)
printf(“%d”,*(a+i));}
3、用指针变量指向数组元素。main(){ int a[10], *p, i;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“n”);
for(p=a;p<(a+10);p++)
printf(“%d”,*p);} 评注:
1、第1和2种方法执行效率是相同的。
2、第3种方法效率高。
3、用下标法比较直观。
在使用指针变量时,有几个问题要注意:
1、指针变量可以实现使本身的值改变。如:for(p=a;p<(a+10);p++)
2、要注意指针变量的当前值。
如:要通过指针变量输出a数组的10个元素。main(){ int a[10], i , *p=a;
for(i=0;i<10;i++)
scanf(“%d”, p++);
printf(“n”);
for(i=0;i<10;i++,p++)
printf(“%d”, *p);} 这个程序输出的并不是a数组中各元素的值。因为第一个 for 循环结束时,p已经指向数组的末尾。再继续下去,p指向的是a数组下面的10个元素,是不可预料的。可加一句为:p=a;
3、用指针变量p指向数组元素,可以指到数组以后的内存单元。C编译程序不作下标越界检查。
4、注意指针变量的运算。如果p指向数组a,⑴ p++(或 p+=1),使p指向下一元素a[1]。⑵ *p++
等价 *(p++)。作用是先得到p指向的变量的值(即*p),然后再使p+1→p。⑶ *(p++)与*(++p)不同。前者为a[0],后者为a[1] ⑷(*p)++表示p指向的元素值加1,即(a[0])++ ⑸ 如果p当前指向a数组中第i个元素,则:
*(p--)相当于a[i--],先对p进行*运算,再使p自减; *(+ + p)相当于a[+ +i],先使p自加,再作*运算。*(-){ temp=*i;*i = *j;*j =temp;} return;} main(){ int i, a[10],*p=a;printf(“The original array: n ”);for(i=0;i<10;i++,p++)scanf(“%d”, p);printf(“n”);p=a;inv(p,10);printf(“The array is : n”);for(p=a;p
例10.10:用选择法对10个整数排序。main(){int *p, i, a[10];p=a;for(i=0;i<10;i++)scanf(“%d”,p++);p=a;sort(p,10);for(p=a, i=0;i<10;i++){ printf(“%d”,*p);p++;} } sort(int x[],int n){ int i, j, k, t;for(i=0;i
四、指向二维数组的指针和指针变量
1、二维数组的地址如:
int a[3][4] A
a[0]
a[0] [0] a[0] [1] a[0] [2] a[0] [3]
A+1
a[1]
a[1] [0] a[1] [1] a[1] [2] a[1] [3]
A+2
a[2]
a[2] [0] a[2] [1] a[2] [2] a[2] [3] 例:int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
设首地址为2000。
a[k]+p(0<=k< i , 0<=p a+k与&a[k][0]等价,而a[0]+k与&a[0][k]等价; *(a+i)可理解为a[i],故有如下等价关系: a+0 等价于 a[0]、a[0]+0、&a[0][0]、*(a+0) a+1 等价于 a[1]、a[1]+0、&a[1][0]、*(a+1) a+(i-1)等价于 a[i-1]、a[i-1]+0、&a[i-1][0]、*(a+i-1) *(a+k)与*a[k]是不同的,前者相当于a[k],是一个地址值;后者相当于*(a[k]+0)或*&a[k][0],是数组元素a[k][0]中存储的值。 数组元素a[k][p]就是*(a[k]+p),即*(*(a+k)+p) 步骤三 课堂小结 本课介绍了指向数组的指针,主要是指向一维数组的指针。用指针变量p指向数组a,指针变量p可以++、--,表示指向数组的上一元素或下一元素。但C编译程序不作下标越界检查。使用指针既方便有灵活,但初学者容易搞错。 步骤四 布置作业 课后作业:第十章课后练习10.31 10.5 课题: 教学目的: 教学重点: 教学难点: 第十章 指针 §3-§4 在掌握指针与数组的基础上,掌握字符串的指针与指向字符串的指针变量 指向字符串的指针变量 用指针处理字符串 步骤一 复习引导 上节课介绍了指向一维数组的指针及二维数组的地址,指向一维数组的指针也即指向元素的指针,那么指向二维数组的指针是怎样的呢?它有两种类型。 步骤二 讲授新课 2、指向二维数组的指针变量 ——(1)指向数组元素的指针变量 设指针变量p=a[0] (&a[0][0]、a、a+0、*(a+0))计算a[i][j]在n*m数组中的位置: 例:…… for(i=0;i<3;i++) {for(j=0;j<4;j++)printf(“%4d”, *(p+i*m+j)); printf(“n”);} …… 例:用指针变量输出数组元素的值。main(){ 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); } } 计算a[i][j]在n*m数组中的位置:a[0]+i*m+j ——(2)行指针(指向由m个元素组成的一维数组的指针变量) 定义:指针基类型 (*指针名)[m] 其中,m表示二维数组每行有m列; 如: int(*p)[3]; 于是,p 指向第0行元素的起始存储地址; p+1 指向第1行元素的起始存储地址;…… p+I 指向第i 行元素的起始存储地址; 而每一行的元素的表示形式为: 第0行元素的表示为(*p)[j]; 第1行元素的表示为(*(p+1))[j];…… 第i 行元素的表示为(*(p+ I))[j]; 例 : #include int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};for(p=a;p for(j=0;j<4;j++) if(j==3)printf(“%4dn”,(*p)[j]); else printf(“%4d” ,(*p)[j]); } 改写为: #include int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; p=a; for(i=0;i<4;i++) for(j=0;j<4;j++) printf(j==3?“%4dn”: “%4d” , *(*(p+i)+j)); } 3、多维数组的指针作函数参数 一维数组的地址可以作为函数参数传递,多维数组的地址也可作函数参数传递。在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法: 1、用指向变量的指针变量; 2、用指向一维数组的指针变量。 例;有一个班,3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。main(){ void average(float *p ,int n); void search(float(*p)[4], int n); float score[3][4]={{65,67,70,60},{80,87,90,81}, {90,99,100,98}}; average(*score, 12); /*求12个分数的平均分*/ search(score , 2); /*求第2个学生成绩*/ } void average(float *p , int n){float *p_end; float sum= 0,aver; p_end = p+n-1; for(;p<=p_end;p++)sum =sum+(*p);aver = sum/n;printf(“average=%5.2fn”,aver);} void search(float(*p)[4], int n){ int i;printf(“the score of No %d are:n”,n);for(i=0;i<4;i++)printf(“%5.2f”, *(*(p+n)+i));} 例10.15 在上题基础上,查找一门以上课程不及格的学生,打印出他们的全部课程的成绩。main(){ void search(float(*p)[4], int n);float score[3][4]={{65,57,70,60},{58,87,90,81),{90,99,100,98}};search(score, 3);} void search(float(*p)[4], int n){int i, j, flag;for(j=0;j §10.4字符串的指针和指向字符串的指针变量 一、字符串的表示形式 1、用字符数组存放一个字符串。如:main() { char string[ ]=“I love China!”; printf(“%sn”, string);} 2、用字符指针指向一个字符串。 如:main() { char *string=“I love China!”; printf(“%sn”, string);} 例10.18 将字符串a复制为字符串b。main(){ char a[]=“I am a boy.” , b[20]; int i; for(i=0;*(a+i)!=„‟;i++)*(b+i)= *(a+i); *(b+i)= „‟; printf(“string a is : %sn”, a); printf(“string b is :”); for(i=0;b[i]!=„‟;i++) printf(“%c”, b[i]); printf(“n”);} 例10.19 用指针变量来处理上例。main(){ char a[ ]=“I am a boy.” , b[20], *p1, *p2; int i; p1= a;p2= b; for(;*p1!=„‟;p1++,p2++)*p2 = *p1; *p2 = „‟; printf(“string a is : %sn”, a); printf(“string b is :”); for(i=0;b[i]!=„‟;i++) printf(“%c”, b[i]); printf(“n”);} 二、字符串指针作函数参数 例10.20:用函数调用实现字符串的复制。——(1)用字符数组作参数。 void copy_string(char from[],char to[]){ int i=0; while(from[i]!=„‟) { to[i] = from[i];i++;} to[i]=„‟; } main(){ char a[]=“I am a teach.”; char b[]=“you are a student.”; printf(“string a= %snstring b=%sn”,a,b); copy_string(a,b); printf(“nstring a=%snstring b=%sn”,a,b);} ——(2)形参用字符指针变量 void copy_string(char *from,char *to){ for(;* from!=„‟;from++, to++) *to = *from; *to=„‟; } ——(3)对copy_string函数还可以简化。① void copy_string(char *from, char *to) { while((*to =* from)!=„‟) { to ++;from++;} } ② void copy_string(char *from, char *to) { while((*to ++ =* from++)!=„‟);} ③void copy_string(char *from, char *to) { while(* from!=„‟) *to++ = *from ++; *to = „‟; } ④void copy_string(char *from, char *to) { while(*to++ = *from ++);} ⑤void copy_string(char *from, char *to) { for(;*to++ = *from ++;);} ⑥void copy_string(char from[], char to[]) { char *p1,*p2; p1=from;p2=to; while((*p2++ = *p1++)!=„‟); } 三、字符指针变量和字符数组的讨论 1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中。 2、赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值; char str[14]; str=“I love China.”;对字符指针变量,可以采用下面方法赋值: char *a; a= “I love China.”; /*赋给a的是串的首地址*/ 3、对字符指针变量赋初值: char *a=“I love China.”; 等价于 char *a; a=“I love China.”; 而对数组的初始化: char str[14]={“I love China.”};不等价于 char str[14]; str[]=“I love China.”; 即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。 4、如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋一个地址值,则它并未具体指向一个确定的字符数据。这很危险。 如: char str[10]; scanf(“%s”,str);是可以的 char *a; scanf(“%s”,a); 能运行,但危险,不提倡,在a单元中是一个不可预料的值。 应当 char *a,str[10];a=str;scanf(“%s”,a); 5、指针变量的值是可以改变的,数组名虽然代表地址,但它的值是不能改变的。可以下标形式引用所指的字符串中的字符。 如:main() {char *a=“I love China.”; a=a+7; printf(“%s”,a);} 又如:char str[]={“I love China.”};str=str+7;printf(“%s”,str);是错的 6、用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。也可以用字符数组实现,但由于不能采用赋值语句对数组整体赋值。 如:char *format;format=“a=%d,b=%fn”;printf(format,a,b); 等价于:printf(“a=%d,b=%fn”,a,b); 也可以:char format[ ]=“a=%d,b=%fn”;printf(format,a,b); 步骤三 课堂小结 本课介绍了指针与二维数组、指针与字符串,指向二维数组的指针有指向元素的指针和行指针,使用时应注意它们的区别。我们既要掌握用数组处理字符串,也要掌握用指针变量处理字符串。要区分这两种方法的不同之处。 步骤四 布置作业 课后作业:第十章课后练习10.61 10.7 课题: 第十章 指针 §5-§7 教学目的: 了解指针与函数的概念 教学重点: 教学难点: 指针数组,二级指针 掌握指针数组,二级指针等知识 掌握指针数组,二级指针等知识 步骤一 复习引导 前面介绍了指针与维数组、指针与字符串,我们可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。 步骤二 讲授新课 §10.5函数的指针和指向函数的指针变量 函数的地址:函数存储区域的首地址就是该函数的入口点,其函数名表示了入口地址。 一、函数指针变量的定义: 存储类型 数据类型 (*函数指针名)(); 例:static int(*p)();例10.23 求a和b中的大者。 main() { int max(int, int); int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“a=%d,b=%d,max=%d”,a,b,c); } max(int x, int y){ int z; if(x>y)z=x; else z=y; return(z);} 法2:main() { int max(int, int); int(*p)(); int a,b,c; p=max; /*将地址送入p */ scanf(“%d,%d”,&a,&b); c=(*p)(a,b); /*与max(a,b)等价*/ printf(“a=%d,b=%d,max=%d”,a,b,c); } 注:int(*p)()定义p是一个指向函数的指针变量,此函数带回整型的返回值。 说明: 1、函数的调用可以通过函数名调用,也可以通过函数指针调用。 2、(*p)()表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。 3、在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:p=max。 4、用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括号中根据需要写上实参。如:c=(*p)(a,b); 5、对指向函数的指针变量,像p+n、p++、p--等运算是无意义的。 二、用指向函数的指针作函数参数 函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量等。现介绍指向函数的指针也可以作为参数,以便实现函数地址的传递,也就是将函数名传给形参。 它的原理可以简述如下:有一个函数(假设函数为sub),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量。在调用函数sub时,实参用两个函数名f1和f2给形参传递函数地址。这样在函数sub中就可以调用f1和f2函数了。 有人会问,既然在sub函数中要调用f1和f2函数,为什么不直接调用f1和f2而用函数指针变量呢?的确,如果只是用到f1和f2,完全可以直接在sub函数中直接f1和f2,而不必设指针变量x1、x2。但是,如果在每次调用sub函数时,要调用的函数是不固定的,这次调用f1和f2,而下次要调用f3和f4,第三次要调用的名作为实参即可,sub函数不必作任何修改。这种方法是符合结构化程序设计方法原则的,是程序设计中常使用的。 例10.24 设一个函数process,在调用它的时候,每次实现不同的功能。 main(){ int max(int ,int); int min(int , int); int add(int , int); int a, b; printf(“enter a and b:”); scanf(“%d,%d”, &a, &b); printf(“max=”);process(a,b,max); printf(“min=”);process(a,b, min); printf(“sum=”);process(a,b, add);} max(int x, int y) { int z; if(x>y)z = x;else z = y; return(z); } min(int x, int y) { int z; if(x else z = y; return(z);} add(int x, int y){ int z; z = x+y; return(z);} process(int x, int y, int(*fun)(int ,int)){int result; result =(*fun)(x,y); printf(“%dn” , result);} 在函数process定义中,int(*fun)(int,int)表示fun是指向函数的指针,该函数是一个整型函数,有两个整型形参。 在三次调用中,分别将函数名max、min、add作为实参将其入口地址送给process函数中的形参fun(fun是指向函数的指针变量)。例:process函数中的(*fun)(x,y)相当于max(x,y)。 注:在使用时,应将函数声明,这样编译系统将它按函数名处理(把函数入口地址作实参值),而不是作为变量名,不致出错。 Process函数无固定功能。如果max、min、add换成其它函数,此process函数不需改变,只要修改每函数的函数体。 §10.6 返回指针值的函数 一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。格式: 类型名 *函数名(参数表);例: int *a(int x, int y); a是函数名,调用它以后能得到一个指向整型数据的指针(地址)。 例10.25 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。float *search(float(*pointer)[4], int n) {float *pt; pt = *(pointer +n); return(pt); } main(){ float score[][4]={{60,70,80,90},{56,89,67,88),{34,78,90,66}}; float *p; int i, m; printf(“enter the number of student:”); scanf(“%d”,&m); printf(“The score of No.%d are:n”, m); p=search(score, m); for(i=0;i<4;i++) printf(“%5.2t”, *(p + i)); } 例10.26 对上例中的学生,找出其中有不及格课程的学生及其学生号。float *search(float(*pointer)[4]){ int i; float *pt; pt = *(pointer+1); for(i=0;i<4;i++) if(*(*pointer+i)<60)pt = *pointer; return(pt);} main(){ score[][4]={{60,70,80,90},{56,89,67,88),{34,78,90,66}}; float *search(float(*pointer)[4], int n); float *p; int i, m; for(i=0;i<3;i++){ p=search(score+i); if(p==*(score + i)) { printf(“ No.%d score:”, i); for(j=0;j<4;j++) printf(“%5.2t”, *(p + i)); printf(“n”);} } } 关于函数的返回值是指针的情况,程序设计时应注意: 1、因数组名是地址常量,用于接受这种返值的对象不能是数组名,这与把数组名作为实在参数传递给形式参数的情况不同(作为形式参数的数组名总被视为指针)。 2、不应将局部于被调用函数的指针作为返值返回给调用者,理由是局部于被调用函数的数据对象执行返回语句离开被调用函数后,原来分配的被调用函数的所有局部对象的存储空间立即被收回(释放),虽然调用者已经获得了正确的地址值,但此时它指向的存储区域的内容可能已经发生了变化,或许已经分配给其他函数了。如果调用函数中仍然使用这个指针去存取那个区域中的数据,得到的可能并非原先的数据。对于这种情况的正确做法是应该把所处理的对象定义成全局对象或static型对象。 §10.7 指针数组和指向指针的指针 一、指针数组的概念 一个数组中的元素均为指针类型,称为指针数组。 形式: 存储类型 类型名 *数组名[数组长度] 例如: static int *p[4] 定义指针数组时也可以进行初始化,如: static char ch[][20]={“Beijing”,“Nanjing”,“Shanghai”,“Guangzhou”}; char *p[ ]={ch[0],ch[1],ch[2],ch[3]};该例也可以等价定义为: char *p[ ]={“Beijing”,“Nanjing”,“Shanghai”,“Guangzhou”}; 例如: main(){ int i, min, j; char *temp, *p[ ]={“Beging”,“Nanjing”,“Shanghai”, “Guangzhou”}; for(i=0;i<3;i++) { min=i; for(j=i+1;j<4;j++) if(strcmp(p[j], p[min])<0)min=j; temp=p[i];p[i]=p[min];p[min]=temp; } for(i=0;i<4;i++) printf(“%sn”, p[i]);} 注意:不能把一个二维数组与一个指针数组混淆; 如:int a[10][10];与 int *b[10];的异同点 访问形式相同;如a[5][5],b[5][5]; 占用的存储空间数不同; 每一个b[i]必须置初值者能使用; 使用b优越 不需进行复杂的下标计算; b[i]指向的数组并非一定要10个元素,但a中,每一行上的元素个数必须相同;因指针指向的是一个地址,故对b而言,各个b[i]指向的存储区域之间不必连续;而对a而言,必须存储100个连续的存储int型数据对象的区域。 例10.27 将若干字符串按字母顺序(由小到大)输出。main(){ void sort(char *name[], int n); void print(char *name[], int n); char *name[]={“Follow me”, “Basic”, “Great Wall”, “Fortran”, “Computer”}; int n=5; sort(name, n); print(name, n); } void sort(char *name[], int n){ char *temp; int i, j, k; for(i=0;i { k=i; for(j=i+1;j if(strcmp(name[k], name[j])>0)k=j;if(k!=i) {temp=name[i]; name[i]=name[k]; name[k]=temp;} } } void print(char *name[], int n);{ int i; for(i=0;i } 二、指向指针的指针 在本章开头已提到“间接访问”变量的方式。利用指针变量访问另一个变量就是“间接访问”。 如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”。指向指针的指针用的是“二级间址”方法。从理论上讲,间址方法可以延伸到更多的级。但实际上在程序中很少有超过二级间址的。级数愈多,愈难理解,容易产生混乱,出错机会也多。 二级指针的定义: char **p; 含义:表示指针变量p是指向一个字符指针变量(即指向字符型数据的指针变量)的。main(){ int i, min, j; char *temp, *p[ ]={“Beging”,“Nanjing”,“Shanghai”, “Guangzhou”}; char **pp; pp=p; for(i=0;i<3;i++) { min=i; for(j=i+1;j<4;j++) if(strcmp(*(pp+j),*(pp+min))<0)min=j; temp=*(pp+i); *(pp+i)=*(pp+min); *(pp+min)=temp; } for(i=0;i<4;i++)printf(“%sn”,*pp++);} 例10.28 使用指向指针的指针。main(){ char *name[]={“Follow me”, “Basic”, “Great Wall”, “Fortran”, “Computer”}; char **p; int i; for(i=0;i<5;i++) { p=name+i; printf(“%sn”, *p); } } 例 main(){ static int a[5]={1,3,5,7,9}; int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; int **p, i; p= num; for(i=0;i<5;i++) { printf(“%dt”, **p); p++; } } 运行结果: 步骤三 课堂小结 本课介绍了指针数组、二级指针、指针与函数。要搞清它们的定义及应用; 注意区分: char a[5]; 与 char(*a)[5]; int *p(int x); 与 int(*p)(); 步骤四 布置作业 《C语言习题集》同步练习课题: 第十章 指针 §7-§8 教学目的: 了解指针数组作main函数的形参 教学重点: 教学难点: 指针的应用 掌握指针的应用 掌握指针的应用 步骤一 复习引导 上节课介绍了二级指针、指针数组,而指针数组的一个重要应用是作为main函数的形参。main()函数是我们C语言程序必不可少的,以往使用时main()是不带参数的。实际上是可带参数的,如:main(argc, argv)。 步骤二 讲授新课 三、指针数组作main函数的形参 带参数的main原型: main(int argc, char *argv[ ]) { …… } 说明: 第1个参数是指命令行中参数的个数,含文件名本身。 第2个参数是一个指向字符串的指针数组。 main函数是由系统调用的。当处于操作命令状态下,输入main所在的文件名(经过编译、连接后得到的可执行文件名),系统就调用main函数。参数应和命令一起给出。命令形式: 命令名 参数1 参数2 ……参数n 例如:有一个目标文件名file1,今想将两个字符串“China”, “Beijing”作为传送给main函数的参数。可写成: file1 China Beijing 例:编写一程序echo.c,实现将命令行上除程序名之外的所有给出的其他参数都回显到显示器上。 main(int argc, int *argv[ ]){ while(argc>1){ ++argv; printf(“%s”, *argv); --argc;} } 若将该程序编译、连接、装配成echo.exe,则在命令行上输入: echo hello, world! §10.8有关指针的数据类型和指针运算的小结 一、有关指针的数据类型的小结 见书中的表 二、指针运算小结 1、指针变量加(减)一个整数 例:p++、p--、p+i、p-=I等 2、指针变量赋值 将一个变量地址赋给一个指针变量。p=&a;p1=p2; 3、指针变量可以有空值,即该指针变量不指向任何变量。如 : p=NULL; 4、两个指向同一数组元素的指针变量可以相减 5、两个指向同一数组的指针变量可作关系运算 习题举例: 习题10.4 有n个整数,使其前面各数顺序向右移m个位置,最后m个数变成最前面m个数。写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。 main(){ int number[20],n,m,I; printf(“How many number?”); scanf(“%d”,&n); printf(“Input %d number:n”,n); for(i=0;i scanf(“%d”,&number[i]); printf(“How many place you want to move?”); scanf(“%d”,&m); move(number, n, m); printf(“Now,they are:n”); for(i=0;i printf(“%d”, number[i]);} move(int array[20], int n, int m){ int *p,array_end; array_end = *(array+n-1); for(p= array+n-1;p>array;p--) *p= *(p-1); *array=array_end; m--; if(m>0)move(array, n, m);} 习题10.5 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。程序: main(){ int i, k, m, n, num[50], *p; printf(“Input number of person:n=”); scanf(“%d”,&n); p=num; for(i=0;i *(p+i)= i+1; i=0;k=0;m=0; while(m { if(*(p+i)!=0)k++; if(k==3) { *(p+i)=0;k=0;m++;} i++; if(i= =n)i=0; } while(*p==0)p++; printf(“The last one is NO.%dn”,*p); } 习题10.6 写出一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。main(){ int len; char *str[20]; printf(“Input string:”); scanf(“%s”, str); len=length(str); printf(“The length of string is %d.”,len);} length(char *p){ int n; n=0; while(*p!=„‟) { n++; p++; } return(n);} 习题10.7 有一字符串,包含n个字符。写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。main(){ int m; char *str1[20],*str2[20]; printf(“Input string:”); gets(str1); printf(“Which character that begin to copy?”); scanf(“%d”,&m); if(strlen(str1) printf(“Input error!”); else { copystr(str1,str2,m); printf(“result:%s”,str2); } } copystr(char *p1, char *p2, int m){ int n; n=0; while(n {n++; p1++; } while(*p1!=„‟) { *p2 = *p1; p1++;p2++; } *p2=„‟;} 习题10.9 写一个函数,将3×3的矩阵转置。main(){ int a[3][3],*p, i; printf(“Input matrix:n”); for(i=0;i<3;i++)scanf(“%d %d %d”, &a[i][0], &a[i][1] , &a[i][2]); p=&a[0][0]; move(p); printf(“Now,matrix:n”); for(i=0;i<3;i++) printf(“%d %d %d”,&a[i][0], &a[i][1], &a[i][2]); } move(int *pointer){ int i, j, t; for(i=0;i<3;i++) for(j=i;j<3;j++) { t= *(pointer+ 3*i + j); *(pointer+ 3*i +j)= *(pointer+ 3*j + i); *(pointer+3*j + i)=t; } }习题10.16 输入一个字符串,内有数字和非数字字符,如: a123x456 17960?302tab5876 将其中连续的数字作为一个整数,依次存放到一数组a中。例如123放在a[0]中,456放在a[1]中……统计共有多少个整数,并输出这些数。#include int i, j, k, m, e10, digit, ndigit, a[10], *pa; printf(“Input a string:n”); gets(str); printf(“n”); pstr=&str[0]; pa=&a[0]; ndigit = 0;i = 0;j=0; while(*(pstr+i)!=„‟) { if((*(pstr+i)>=„0‟)&&(*(pstr+i)<=„9‟))j++; else { if(j>0) { digit = *(pstr+i-1)-48; k=1; while(k { e10=1; for(m=1;m<=k;m++)e10 =e10*10; digit =digit+(*(pstr+i-k)-48)*e10; k++; } *pa=digit;ndigit++; pa++; j=0; } } i++; } printf(“There are %d numbers in this line.They are:n”,ndigit); j=0; pa=&a[0]; for(j=0;j printf(“%d”, *(pa+j)); printf(“n”);} 步骤三 课堂小结 本课主要讲了一些习题,希望通过这些例子加深对指针的了解,看到指针在程序设计中的重要应用。同学们课后需要多看、多想、多练,逐步去体会指针这一重要的概念。步骤四 布置作业 授课教师:杨晓兰 学习目标: 1、学习课文中的生字词,会写课文中生字。 2、能正确、流利、有感情地朗读课文,体会人物的内心活动。 3、理解课文内容,了解维生素c的发现过程,懂得任何发现、创造都离不开细心的观察与实践 学习重点: 理解课文内容,了解哥伦布发现维生素c的发现过程,体会人物的内心活动。学习难点: 通过学习,了解任何发现、创造都离不开细心的观察与实践。教学课时:2课时 第二课时 教学过程: 一、设疑自探: (一)、揭题:还记得我们二年级时学过的一篇课文《有趣的发现》吗?它主要讲了生物学家达尔文通过细心观察研究岛上的昆虫,发现只有适应自然环境的生物,才能得以生存的故事。今天我们要来认识一位和达尔文同样善于细心观察生活的伟大航海家,他就是哥伦布,那么他到底发现了什么呢?看老师的板书(板书:维生素c 的故事)生齐读题两遍。 1、针对课题你有什么疑问?(学生提出自己的想法) 2、教师把学生的问题归纳小结。过渡:维生素c对人体有什么作用?维生素c是怎样发现的?请大家打开课本去寻找答案。 (二)、出示自读提示,学生自学课文:(1)、从课文中找出维生素c有什么作用?(2)、用自己的话简单说说维生素c是怎样被发现的。 (三)、检查自探情况: 1、通过对课文的学习,我们已经知道了维生素c有什么作用?(生:治坏血病)课文的最后一节就告诉了我们,齐读: 出示:坏血病是由于人体内长期缺乏维生素c引起的。当身体内补充了适量的维生素c,坏血病就不治而愈了。(生读) 2、、过渡:维生素c的发现对医学事业做出了巨大的贡献,使人类文明向前进了一大步,维生素c究竟是怎样被发现的?下面我们就去细细品读维生素c后的感人故事。 二、解疑合探: (一)品读第2节 1、出示:那时,海洋生活不光艰苦,而且充满危险。 引读:从你的言语中,我听出来了,那时,航海生活不光(),而且()。(强调:不光、而且)从这个词中,你体会到了什么? (预设)生:航海生活非常艰苦,还充满危险。师:生活艰苦并不可怕,船员们个个都是吃苦耐劳的人,他们面临的最可怕的困难还是航海生活处处充满危险,你们知道船员远航都会遇到哪些危险吗? 生:会遇到狂风暴雨 生:他们会遇到海啸 师:那是多么危险的事,遇到海啸,船员们将九死一生不过经过多年的航海经验,哥伦布已经会从各种自然现象观察出大海中将会有什么变化,可以避免遇险。 生:会在大海中迷失方向。 师:不过那时人类已经有了指南针。生:他们的船会触礁。生:他们带的淡水会喝完。生:船上的食物会不够吃„„ 师:是啊,航海生活处处充满危险,船员们明知有种种危险在等待他们,还是勇往直前,如果没有他们的冒险,也许人类到现在还不知道地球是圆的,到现在还不知道地球上还有那么多陆地与岛屿,刚才同学们历数的种种危险,船员们靠着顽强的毅力和吃苦耐劳的精神都能克服,最最让他们害怕的还是一种航海期间很容易得的一种怪病(出示“海上凶神”)齐读。 师:“海上凶神”这个名字给你什么感觉? 生:很害怕,很恐怖 生:这是海上独有的疾病,来势汹汹,很凶狠 生:它来的很神秘,象是死神的代言人来的迅速,无法阻挡 师:这样一种海上独有的,总在船员们没有意识到就如死神般悄悄的疾病,所以人们称他为“海上凶神”齐读 师:他是怎样夺取船员生命的,请你们自己读一读。 2、出示:最可怕的是在航海期间很容易得一种怪病,病人先是感到浑身无力,走不动路,接着就会全身出血,然后慢慢地死去,船员们都把这种怪病叫做“海上凶神” 师:谁来将这可怕的“海上凶神”来临的情景,读给大家听听。指生读。师:它就这样直接威胁着船员的生命,所以称它为(齐读)“海上凶神”。它让病人经历一段如此痛苦的过程,所以称它为(齐读)“海上凶神” (二)品读3—5小节 1、过渡:有一次,哥伦布的船队刚出发不久,“海上凶神”就悄悄地降临了,课文在介绍这个故事时,重点抓住了哥伦布的心情来描写,请同学们自由读读3-6小节,划出描写哥伦布心情的词,好好体会一下当时哥伦布的内心活动。 2、交流:同学们学得非常认真,你们都找到了一些重点词,划得很准确,下面哪位同学愿意把你的体会说出来和同学们交流交流。 4、出示:不久,“海上凶神”就悄悄地降临了。船队才航行不到一般的路程,已经有十几个船员病倒了。望着四周一片茫茫的海水,哥伦布的心情十分沉重。 师:谁来说说你是怎样理解这个“沉重”的,请同学们各抒己见。生:哥伦布看见船员生病了,心情很难过。生:看到船员生病了,哥伦布很焦急。(问:他急什么?)生:这么多的船员生病了,他找不到就他们的办法。 生:船队才航行到不到一半的路程,就有这么多的人病了,这次是否能完成任务?(担忧)生:他在愁,如果这病继续传染就糟糕了。师:望着四周一片茫茫的海水,哥伦布毫无办法,内心焦急万分,充满了对船员们命运的担忧,自然心情就沉重了,你们能把哥伦布此时的心情读出来吗?(指名读)。 师:同学们都读懂了哥伦布的心情,那些船员们理解哥伦布吗?你从哪看出来? 5、出示:那些病重的船员为了不拖累大家,对哥伦布说:“船长,你就把我们送到附近的荒岛上吧。等你们返航就来的时候,再把我们的尸体运回家乡。“哥伦布噙着眼泪点了点头„„ 师:从哥伦布的眼泪你读懂了什么? 生:哥伦布很难过,他并不愿意把病中的船员留在岛上。 师:但是,假如带上这些船员,很可能大家都会感染上这种怪病,后果不堪设想,所以哥伦布很无奈的。 生:哥伦布很感动,这些船员为了不拖累大家,自己提出来留在岛上等死。师:如果是你,你愿意离开患难与共的战友们,孤零零地留在岛上等死吗?但是他们提出了要请求,为的是不拖累大家,不影响这次远航,这种识大体顾大局的高度自觉的精神怎么不让人感动?在这生死离别之际,怎么不噙着眼泪呢? 师:此时的哥伦布是百感交集,自己好好读读这一小节,细细地体会一下哥伦布此时的心情。 6、出示:几个月过去了哥伦布的船队终于胜利返航了。船离那些重病船员所在的荒岛越来越近,哥伦布的心情也越来越沉重。 引读:几个月„„心情也。 师:终于胜利返航了,此时哥伦布的心情应该是轻松喜悦的,怎么会越来越沉重呢? 生:哥伦布想到他看到的将是船员的尸骨,内心充满了悲哀。师:是这些船员们的舍身精神让哥伦布他们完成了这次探险任务,哥伦布心中的悲哀远远超过了内心的喜悦,我班的男同学都和哥伦布一样有情有义,我想你们一定能读出哥伦布此时的心情,男生齐读。 7、过渡:哥伦布想到他看到的将是船员的尸骨,内心无比悲痛。那么,这些船员生死如何?我们继续学习6小节。 (三)品读第6小节: 引读:正在这时十几个蓬头垢面的人从岛上向大海狂奔过来。这不是那些船员吗?他们还活着!哥伦布又惊又喜。 师:哥伦布惊得是什么?喜得又是什么? 师:你们能想像哥伦布会做些什么?说些什么吗?船员们又是怎样回答的呢? 出示:“我们来到岛上以后,很快就把你们留下的食物吃完了。后来,肚子饿的时候,我们只好采些野果子吃。这样我们才一天天活下来。” 指名读。 师:这一天天是多么艰难的日子,包含着多少辛酸啊!船员们过着与野人一样的生活,所以一个个“蓬头垢面”(齐读)让我们把船员的这份心酸读出来。(男生读) 师:想着自己终于起死回生了,这又是多么让人高兴和激动啊!(女生齐读)十几个船员心情各不一样,他们围着哥伦布,七嘴八舌的抢着告诉哥伦布他们是怎样活下来的。(生抢着说)。师:听了船员的回答,哥伦布会产生什么疑问呢? (四)品读第7——8小节: 生:难道秘密在野果子里面? 师:哥伦布为什么会这么问? 师:以前他们吃的是什么/ 生:船员们在船上只能吃黑面包和咸鱼。 师:如果哥伦布只是产生怀疑而不去解开这个疑惑,会发现维生素c吗? 师:他是怎么做的? 引读出示:哥伦布一回到意大利,就把这些船员起死回生的奇迹讲给医生们听。 师:正因为哥伦布善于发现问题,并积极解决问题,所以才会发现维生素c,引读:后来经过研究„„ 师:原来,所谓的“海上凶神”就是“坏血病”,它是由于人体内长期缺乏维生素c引起的。当身体内补充了适量的维生素c,坏血病就不治而愈了。齐读(出示句子) 师:从此船员们再也不怕“海上凶神”,从哥伦布发现维生素c这件事上你能感受到什么启发? 预设学生回答: 1、科学就在我们身边,任何发现创造都离不开细心的观察与实践。 2、很多发现都是偶然的,如果你不懂得思考,即时苹果在你头上砸上千次,也是没有任何作用的。 总结:是呀,任何发现创造都离不开细心的观察与实践。希望同学们以后在学习和生活中善于发现,善于思考,勇于实践,做一个生活的有心人。 三、质疑再探: 1、学到这儿,同学们还有什么问题要弄明白吗? 2、让学生复述维生素C的发现过程。 四、拓展运用:(1)、收集一些科学小发现故事读读。(2)、在日常生活中注意观察和思考,看看有没有新发现。 板书设计: 18、维生素C的故事 “海上凶神”降临 ↓ 补充维生素C ↓ 1.将对人民币的识别作系统的整理,使学生对全套人民币能清晰地识别。以识别过程为载体,培养学生自主探索、交流合作的能力。 2.归纳出1元=10角的十进关系,培养学生归纳、推理的思维能力。 3.在游戏中培养学生应用数学知识解决问题的能力。 4.渗透爱国主义思想教育以及节约用钱的良好习惯。 教学内容 教科书第46~49页。 教学设计 一、列举使用人民币的例子 师:同学们,你们买过东西吗? 师:买东西要用什么付款呀? 师:你知道我们国家的钱叫什么吗? 师:对,我们国家的钱叫“人民币”。这节课我们就来认识人民币(板书:认识人民币) 二、识别人民币 1.整体感知。 课件出示全套人民币。 师:瞧,我们国家的人民币有这么多呢!有些是纸做的,叫纸币(课件突出显示纸币),有的是金属做的叫硬币(课件突出显示硬币)。 根据主题图精神,请学生列举自己使用人民币的例子,举例不拘泥于教材上的三个内容。这个回忆过程帮助教师了解学生的生活经验和已有知识水平,同时让学生感知人民币的商品功能和在社会生活中的重要作用,激起学习兴趣,突出知识增长点。 2.特征辨认。 师:这些人民币你们都认识吗? 师:(拿出装着真币的篮子)那好,老师来考考你们,(举起一张1元的纸币)这些人民币的面值是多少? 师:你是怎么看出来的呢? 生:上面写着数字“1”(回答不确切。结合其他特征说明)。 师:可能是1角、1分啊。(启发补充,还要看单位) 师:对,有“壹圆”的字样。(每说出一个就把方法归结出来) …… 学生对人民币有较强的观察兴趣,几乎每个人都能说出识别方法,但是他们的观察角度不够宽泛,深度欠缺,从现象中寻找本质的能力不够,而且不同学生观察能力的发展水平有一定差异。因此,在系统识别活动之前教师要做必要的引导,拓展学生的观察视野,总结特征,归纳重点识别方法,以此方法保障学生自主探索活动的有效进行。 师:辨别(认识)人民币,咱们可以看字样、颜色、图案。 师:这一张呢?(举起新版50元币) 生:有毛主席的就是50元。(教师注意纠正) 师:(举起新版100元)这一张也有毛主席啊,也是50元吗? 生:不是,是100元,因为它是红色的,最大,写着“壹佰”…… 师:对了,小朋友们说得很好,认识人民币可从图案、字样、颜色、数、大小等方面进行观察。那么,关键是看什么呢?(用手指着,结合例币小结每一种方法) 3.认识其他的人民币。 识别和欣赏过程以小组活动的方式进行,学生在观察、交流中丰富多种识别方法,构建对人民币多种特征和价值的了解。 a.小组认识活动。 师:真是聪明的小朋友,我要请小组长考考大家。首先请组长把信封里的人民币全倒出来,考考你的小伙伴:“你们知道是多少钱吗?从哪儿看出来的?”答对了就放回信封里面,比一比,哪个组的同学最先把所有的人民币都认完。 各小组在组长带领下开始活动,教师下组倾听,调控活动方法,赞扬鼓励。 在小组活动中,要求仔细观察样币后选择喜欢的一种告诉同伴它的币值和识别方法,要求表述清楚,特别强调组员倾听认真。在交流中丰富个体的知识建构,反思思维过程,培养创新能力,倾听是提高小组学习效益的关键。 b.抢答方式小组汇报。 抢答反馈小组活动的学习效果。 师:看,有一只不服气的跳跳熊要考考你们了。跳跳熊跳到哪张人民币旁边,就请你快快说出它的面值是多少,看谁答的又对又快! 课件演示跳跳熊,学生抢答。 在全班汇报中,教师要求学生说出自己所述知识的来源,鼓励学生在生活中多途径学习知识,培养学生终身学习的能力。 4.元、角进率。 1元=10角的关系学生有所了解,通过换钱将元与角之间的换算关系与进率沟通,即所有的换算都是基于1元=10角。 师:人民币就像一家人,它们有不同的面值。而且,不同面值的人民币之间还有一些有趣的关系。 师:(举起1元纸币)看,这是── 师:你能拿出和我一样多的人民币吗? 生1:一个1元的硬币。 师:对,1元有纸币,还有硬币。 生2:两张5角的(纸币硬币)。 师:(疑惑地)为什么两张5角和1元一样多呢? 生:因为两张5角合起来就是10角,10角就等于1元。 师:可见,1元就等于10角。 (板书“1元=10角”) 三、应用实践 1.小组购物活动。 这是在清晰识别人民币,掌握元角十进关系和角之间的换算关系的基础上,对应用能力和创新精神的培养。游戏仍在小组内进行,为每个学生提供探索、交流的时间和空间。同时强调小组活动必须制定和遵循游戏规则,如何推选组织者,确定顺序,制定评价方法,如何表达集体意思。教师提供部分方法,小组可参考选择,也可自定喜欢的规则。渗透集体概念,培养学生集体生活能力和团体合作能力。 师:同学们个个都很能干,知道人民币的好多知识,也特别聪明。下面我们开一个小小商店玩一玩好吗? 师:开商店都需要什么呢? 课件演示所有物品及标价(教师简介)。 师:这些商品谁来卖呢?我们需要售货员,请每个小组推选一名同学当售货员。选出的售货员站起来。 售货员们要注意,听清楚你的顾客买什么东西,他付的钱够不够。 师:其他同学当顾客,喜欢什么就买什么,不过要注意一个一个地去买,还有,你们每人只有1元钱。 师:请小组长打开信封,发给每个顾客一元钱,再把剩下的零钱给售货员。 货币承载着国家权威和荣誉,爱国主义思想教育贯穿始终,趁机进行节约意识的培养。 学生活动,教师行间观察、倾听、指导。 2.汇报。 师:谁来告诉大家,你的1元钱买了什么? 师:一元钱可以买这么多东西,我们可不能小看这1元钱!所以我们平时应该怎么做呢? 四、小结 1.小结。 师生小结,学生由此反思整个学习过程,多面小结,提升成功的意义,满足学生成功欲望。 师:我们不仅玩的高兴,还学到了很多知识,谁能说说你这节课最大的收获是什么? 师:回家以后,请把学到的知识讲给爸爸、妈妈听。 将拓展人民币相关知识作为弹性内容,除了世界主要货币作为内定了解内容,主要由课件演示和教师讲解,意在拓展学生视野。从世界货币高度反观人民币,健全人民币概念,其余不作要求,任学生自由发挥,满足学生的自我实现欲望,激起探索意识。 2.拓展。 师:你还知道人民币的哪些知识? 师:你真是一个爱学习的孩子,知道可以向我们周围的人学习,你一定会变得越来越棒!我希望其他的同学也向他学习。 教学设计说明 本课是在学生已有生活经验的基础上进行教学的,同时是学习人民币计算的基础。 1.教材分析 本节课教材在编排上注意结合学生生活经验,主题图提供了三种生活场景,揭示了人民币的商品功能和在社会生活中的重要作用。例1展示了全套人民币,使学生对我国法定货币有一个整体的了解。例2通过换钱活动梳理元与角,角与角之间的换算关系,归纳出主辅币之间的进率,为后面学习人民币的计算奠定基础。 2.学生分析 a.学生在生活中已有初步的识别方法和较丰富的使用经验,但是缺乏对人民币清晰、系统的认识;对人民币的附加价值缺乏了解。了解主辅币之间的十进关系,但没有上升到知识重点的高度。有购买经验,但在支付方式和购买方案上欠灵活。 b.有初步的在生活中学习数学的经历,但指向、方法不明确。 c.有较强的观察兴趣,但是观察角度不够宽泛,深度欠缺,学生发展水平差距较大。 d.有较强的小组合作学习意识,在交流中有良好的表达意愿,但是倾听意识模糊,小组学习效率有待提升。 3.设计理念 a.同伴教育。 《程序设计基础》课对当前计算机系学生来说是一门非常重要的专业基础课, 如何使学生通过本课程的学习, 能够掌握程序设计语言的基本内容及编程技巧, 同时培养学生分析问题和解决问题的思维方法和能力, 一直都是程序设计课老师思考和要解决的核心问题, 下面根据本人多年对此门课的教学实践与探索, 谈谈自己的一些看法与体会。 1、教材的选择 一本好的教材对学生来讲, 非常重要。因此, 在上《程序设计基础》课前, 精心为学生挑选教材非常必要, 在选择教材时难度一定要适中。这样由于有一本好的教材在手, 即使有些学生在上课时对某部分内容没有弄懂, 则课后由于有一本好的教材, 学习起来就更加容易, 不致于失去信心, 信心对初学程序设计的学生是很重要的。 2、教学内容的安排 理论教学内容兼顾够用和实用的原则。够用是指经过选定内容的教学, 学生应能掌握程序设计的基本概貌, 并且做到举一反三;实用, 是指所教的内容是程序设计的经典内容, 也是开发软件时必须掌握的知识和技巧, 教学进度的安排遵循由浅入深、循序渐进、先慢后快的原则。 实验教学内容紧扣理论教学, 内容要精选、题量适当, 要充分考虑验证性、设计性和综合性实验的合理搭配。即照顾一般学生的学习能力, 又要开发优秀学生的学习潜能。 不论是理论教学或实验教学, 其例子或题目的选择要有代表性且尽量选择趣味性的, 这样有利于提高学生的学习兴趣。在实验教学中要考虑学生的学习程度, 可考虑安排一些综合性的 (结合前面学习的知识) 且有创新的题目。 3、采用的教学方法 采用实例教学法, 激发学生的学习兴趣并加深对新概念的理解。 在教学中, 对每个重要的知识, 采用从简单有趣的实例入手, 通过让学生观看、模仿, 在实际操作中去探究和领悟这些概念, 并适时地加以归纳总结, 让学生在轻松愉快的气氛中接受新知识。通过实例教学法, 把要学习的语法和概念融入到具体实例中来讲解。整个教学过程中强调学以致用, 在应用中学习, 从而避免了枯燥、繁杂的理论说教, 不仅能增进学生的学习积极性, 激发学生的学习兴趣而且加深了学生对新概念的理解。 ·采用条件变化法, 培养学生的创新思维 条件变化法是指在教学过程中, 通过在原有程序的基础上逐渐改变和增加条件来提高学生对程序的分析理解和举一反三的综合能力的方法。 例如, 学生在学习while循环时, 给出了一段求1到100之间所有数和的程序。代码如下: 这段程序在学生弄懂while循环语句之后, 理解起来是并不困难的, 但为了提高学生的综合编程能力, 我要求学生对原程序条件做如下几种变化: (1) 如何计算100以内的奇数和 (即1+3+5+…+99) ? (2) 如何计算100以内的偶数和 (即2+4+6+…+100) ? (3) 在程序运行过程中任意输入一个自然数N, 求1到N之间所有偶数的和。 对于第 (1) 题, 难度不是很大, 只要在代码中将"i=i+1"改为"i=i+2"就行了;对于第 (2) 题, 其实难度也不大, 除了将"i=i+1"改为"i=i+2", 还必须将"i=1"改为"i=2";。第 (3) 小题在第 (2) 小题的基础上又增加了个条件, 即需用变量N来表示累加和的终止值因此需要在程序的前面增加一条定义变量N的语句, 还需要使用Console.ReadLine () 语句在程序运行时从键盘输入一个数并将此数赋值给变量N, 这就要求学生能够把前面所学的知识综合起来运用, 对刚刚学习编程的学生来说还是有一定难度的, 但通过练习, 学生的创新思维和综合编程能力可以得到训练和提高。 ·采用与界面设计相结合的方法, 促进学生综合编程能力的提高 通过前面几章的学习, 学生基本掌握了一些编程方法和常用控件的属性、事件、方法的使用, 具有了一定的编程能力, 但是这时学生对这些知识的理解是零散的, 因此在上完Windows应用程序设计这章后, 给出了一个综合实验题目:简单文本编辑器的设计。要求学生根据自己的实际能力进行简单的文本编辑器的设计, 并对具体几个按钮和菜单设计提出详细的要求, 其它的内容学生可以结合前面所讲的知识进行扩展性的设计, 如复制、剪切、粘贴、帮助等内容的扩展, 鼓励学生用所学的知识进行综合设计, 大大提高了学生学习积极性。当然, 由于学生基础和能力的差异, 应根据学生的具体情况, 制定不同的目标, 提出不同的要求, 这样才能到达应有的效果。 4、现代化教学手段的应用 (1) 多媒体教学 课堂上全部采用多媒体教学, 利用电子教案结合黑板板书显示教学内容, 并穿插演示应用程序实例等运行过程和结果。对多媒体课件教学讲解的实例逐一演示, 使同学们对该课程的学习兴趣大增, 有利于理解本课程的基本概念和基本理论。 (2) 实验教学 对实验教学中的题目和资料都在上第一节实验课前放在服务器上, 学生可随时进行练习, 及时做好下次实验的准备。 (3) 其它手段的教学 通过Email、手机等形式进行课后答疑解难, 随时解决学生在学习中碰到的问题。 5、备课及总结 假期对课程的备课很重要, 这是一个整体方案, 准备的越充分, 教学质量就越能得到保证。同时, 我认为每次课的课前备课也很重要, 一定要认真仔细地对待。有些内容的授课方法也来自于课前的备课。授完课后对课程的及时总结也是很重要的, 可以对后面的授课起到改进作用。 总之, 在教学中, 我们应当注重学生对基础知识掌握和编程经验的积累, 定性理解, 定量编程, 适时上机, 以提高学生的积极性和发挥学生主观能动性并培养学生的创造性。 摘要:高级语言程序设计是高校计算机系各专业的一门必修专业基础课程。本文对基于Visual C#.NET的《程序设计基础》课程的教学内容和教学方法等进行了探讨, 提出了对此门课程教学的一些看法与体会。 关键词:程序设计,教学内容,教学方法,多媒体教学 参考文献 [1]刘甫迎等编著.《C#程序设计教程》[M].电子工业出版社, 2005, 64-65 [2]赵晓华, 鲁明珠.VB教学方法改革初探[J].《中国成人教育》.2006 (4) . 【c程序设计基础教案】推荐阅读: c语言程序设计基础题10-28 c语言设计程序11-11 c程序设计作业10-13 《C程序设计》重点总结09-26 c语言程序设计实验11-19 黑马程序员C语言教程:C语言基础之#define详解01-13 c语言程序设计作业三06-24 C语言图形程序设计报告10-13 c语言程序设计补充题11-17维生素C的故事教案设计 篇4
c程序设计基础教案 篇5
c程序设计基础教案 篇6