C语言程序设计电子教案理论_第1页
C语言程序设计电子教案理论_第2页
C语言程序设计电子教案理论_第3页
C语言程序设计电子教案理论_第4页
C语言程序设计电子教案理论_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

理工大学工程技术学院C语言程序设计课程教案教师姓名XXX所在系部电计系授课专业XXXXXXX课程编码总学时64学分4教材名称《C程序设计教程》

[首页]课程名称C语言程序设计授课专业全院所有非计科类专业年级课程编号课程类型必修课公共基础课(√);专业基础课();专业课()选修课专业选修课();公共选修课()教学目标本课程的教学目标:课程的目的和任务是以四川省二级考试(C语言)为基本导向,兼顾软件技术基础能力的培养,让掌握编写C程序的基本知识及基本操作,理解软件设计的思想,深化数据结构及操作系统的概念,理解和熟悉程序设计的基本步骤和方法,培养学生编写计算机程序解决和处理实际问题的思维方法与基本能力,为进一步学习专业课程及通过四川省计算机二级考试(C语言)打下良好的基础。授课方式课堂讲授(√);实践课(√)考核方式考试(√);考查()课程教学总学时数64学时学分数4学分学时分配课堂讲授32学时;实践课32学时教材名称C程序设计教程作者孙淑霞出版社及出版时间四川科学技术出版社指定参考书《C程序设计》作者谭浩强出版社及出版时间清华大学出版社2001授课教师XXX职称讲师单位电计系授课时间11周1次第1周,第1次课编写时间年8月2日章节名称第1章C程度设计概述(1学时)教学目的与要求:教学目的:让学生掌握初步的算法程序设计思想,了解C语言的基本特点和构成。教学要求:掌握C语言程序开发基本步骤,理解算法程序设计基本思想。教学重点和难点:教学重点:熟悉上机运行C语言程序的一般步骤教学难点:无教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一新课引入(5分钟)1、介绍本门课程的性质、学习目标、考核方式、学习方法等。2、从计算机应用基础中学过的计算机语言及语言处理系统引出C语言。二讲授新课一、

算法的定义与C语言出现的背景(5分钟)举例:什么是算法?二、

C语言的特点(5分钟)1.

语言简洁、紧凑,使用方便、灵活;2.

运算符丰富3.

数据类型多(整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类等)4.

具有结构化的控制语句5.

语法不太严格,自由度大既是高级语言,又具有低级语言的功能成目标代码质量高,程序执行效率可移植性好三、C语言程序构成(采用程序实例加以说明,并提倡良好的程序设计书写风格,10分钟)1.

C语言是由函数构成的,至少有一个main()函数;2.

每个函数由函数首部和函数体组成;函数体由说明语句、执行语句组成;3.

每个C程序从main()函数开始执行,并在main()中结束;4.

每个语句和数据定义的最后必须加分号;5.

C程序无输入、输出语句:输入功能由scanf()函数完成;输出功能由printf()函数完成;可加注释/*……*/四、上机步骤(上机环境:TurboC2.0和VisualC++6.0)(15分钟----课堂演示)1.

进入环境2.

编辑源程序3.

保存源程序4.

编译源程序5.

执行程序,查看结果6.退出C环境三课堂小结(5分钟---板书)1、

C语言的构成要素,main函数在程序中的作用2、上机操作的过程作业及课外训练:暂无参考资料(含参考书、文献等):《C程序设计》,谭浩强,清华大学出版社20012课后自我总结分析:X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第2章2.1~2.2教学目的与要求:教学目的:学习数据类型的含义,数据的存储形式,变量的声明与引用教学要求:1、理解变量与常量的含义,变量名与变量地址,掌握常量的声明,变量的定义与赋值等操作;2、理解数据类型的含义;3、掌握数据类型(整型、实型、字符型)的常量与变量;教学重点和难点:教学重点:数据类型的含义,数据的存储形式,变量的声明与引用教学难点:数据的存储形式和数据类型的转换教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)复习c程序开发的一般步骤,引出数据的概念。二、介绍本次教学内容:2分钟(板书书写本次讲授内容提纲)本次课主要讲授数据的三种基本类型整型,实型,字符型以及各类型的常量和变量表示方法。三、讲授知识点:XX分钟(多媒体演示,并结合适当板书)一)、常量与变量1、常量和符号常量在程序运行过程中,其值不能被改变的量称为常量2、变量变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。二)基本数据类型1、整型数据整型常量即整常数。介绍在c语言中整型的3种表示方法。提问:12,012,0x12分别对应的数据是多少?2、实型数据C语言不擅长处理实型数据。提问:12e1,e哪个是合法的实型数据?3、字符型数据介绍字符型数据和整型数据的通用性及它本身的特殊性。提问:‘a’的ASCII码是97,‘d’的ASCII码是多少?4、字符串常量字符串常量是一对双撇号括起来的字符序列提问:“a”和‘a’的区别?经典例题讲解:大小写字母的转换

#include<stdio.h>

voidmain()

{charc1,c2;

c1=’a’;

c2=’b’;

c1=c1-32;

c2=c2-32;

printf(“%c%c″,c1,c2);

}大写字母和小写字母相差32,大写字母加32变小写,小写字母减32变大写5、各类数值型数据间的混合运算混合运算:整型(包括int,short,long)、浮点型(包括float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算,转换的原则是低精度向高精度转换。提问:表达式’c’+’d’的结果是什么类型?作业及课外训练:参考资料(含参考书、文献等):《c程序设计》(第三版)谭浩强编著课后自我总结分析:举生活中例子让同学们理解变量的含义3X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第2章2.3运算符和表达式教学目的与要求:教学目的:学习运算符的功能、优先级,结合性,以及表达式的运算顺序教学要求:1、理解运算符的功能、优先级,结合性,以及表达式的运算顺序;2、理解表达式求解过程中数据类型的自动转换与强制转换;教学重点和难点:教学重点:各运算符的功能及使用方法教学难点:各运算符的功能及使用方法教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)复习上次课学习过的数据类型,是将参与运算的对象。二、介绍本次教学内容:5分钟(板书书写本次讲授内容提纲)本次课将学习算术运算符,逻辑运算符,关系运算符。三、讲授知识点:75分钟(多媒体演示,并结合适当板书)1、算术运算符和算术表达式对于每一种运算符重点了解其运算功能和其对操作数的要求,以及它的优先级和结合性算术运算符:重点是/和%两运算符结合应用提问:如何把123拆成1,2,3?2、赋值运算符:强调赋值号左侧一定是变量,不能是运算符和表达式提问:a=a+3=b+7正确否?3、关系运算符:运算结果是逻辑值3、逻辑运算及其表达式介绍逻辑运算符以及它的重要特性:短路特性4、关系运算符:重点强调==和=5、自增自减运算符:使用频率最高的运算符,讲解明白前置和后置对表达式和运算对象的影响。4、位运算符:参与运算对象必须先转换成二进制,然后再运算。5、逗号运算符和逗号表达式逗号运算符:将两个表达式连接起来,又称为“顺序求值运算符”如:3+5,6+8求解过程:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。逗号表达式的一般形式可以扩展为表达式1,表达式2,表达式3,……,表达式n它的值为表达式n的值注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如:printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c)思考:若表达数学式子a<b<c,在c语言中应该怎么表达?作业及课外训练:课外训练:笔试考级训练一参考资料(含参考书、文献等):《c程序设计》(第三版)谭浩强编著课后自我总结分析:多做演示让学生理解运算符的功能,并熟悉c语言的开发步骤。4X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第2章2.4~2.5教学目的与要求:教学目的:学习数据输入输出库函数。教学要求:1、掌握字符数据的输入输出;2、掌握格式输入输出函数。教学重点和难点:教学重点:格式输入输出函数教学难点:格式输入输出函数教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)计算机的执行,表达式的计算如果想看到结果,必须输出到某个输出设备上,如果在运算过程中需要人机交互,必须从输入设备得到数据,这些都是通过输入输出函数得到的。二、介绍本次教学内容:5分钟(板书书写本次讲授内容提纲)本次课学习数据的标准输入输出库函数。介绍函数的作用和地位。三、讲授知识点:75分钟(多媒体演示,并结合适当板书)数据输入输出的概念及在C语言中的实现所谓输入输出是以计算机主机为主体而言的,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。1、字符数据的输入输出字符输出函数一般形式:putchar(c)函数作用:向终端输出一个字符2、.字符输入函数一般形式:getchar()函数作用:从终端(或系统隐含指定的输入设备)输入一个字符。函数值:从输入设备得到的字符3、格式输出函数函数作用:向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。一般格式:printf(格式控制,输出表列)4、格式输入函数函数作用:按照变量在内存的地址将变量值存进去。一般格式:scanf(格式控制,地址表列)在输入数据时,遇以下情况时认为该数据结束。①遇空格,或按“回车”或“跳格”(Tab)键;②按指定的宽度结束,如“%3d”,只取3列;③遇非法输入。格式输入输出多加练习,不要死记语法。作业及课外训练:作业:P59四参考资料(含参考书、文献等):《c程序设计》(第三版)谭浩强编著课后自我总结分析:字符输入输出函数强调只能针对一个字符操作5X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第3章1节程序的控制结构教学目的与要求:教学目的:学习选择结构教学要求:掌握if语句的格式、执行过程和用法;掌握switch语句的格式、执行过程和用法;理解较简单的if语句嵌套及switch语句嵌套教学重点和难点:教学重点:选择结构教学难点:选择结构教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(板书、互动)运算符的功能、优先级,结合性,以及表达式的运算顺序;常用输入、输出函数的功能和用法。二、介绍本次教学内容:10分钟(板书书写本次讲授内容提纲)if语句的格式、执行过程和用法;switch语句的格式、执行过程和用法较简单的if语句嵌套及switch语句嵌套三、讲授知识点:75分钟(多媒体演示,并结合适当板书)我们来看看本章要学习的内容。选择分支结构和循环结构以及编译预处理三部分。我们首先进入第一部分选择分支结构。我们来看看计算分段函数的方法。当x<=0时那么y=3-x;当x>0时则是y=2/x;那么我们可以看到C语言来解决这样的问题时是怎么样的呢?输入x。然后判断x<=0?如果成立则执行y=3-x;否则表示x>0则执行y=2/x。最后不管哪种结果都输出y。这是我们c语言完成分段函数的方法。其实就是使用选择分支的结构来完成的。在C中提供了if语句和switch语句来实现选择结构。接下里,我们首先来看看大家熟悉的if语言——对所给条件进行判定,根据判定结果决定是否执行程序段。它的一般形式是:if(表达式){语句};其中只要是表达式成立就执行复合语句内的语句。如果不成立则不执行复合语句。直接跳到复合语句的下一句。其语句执行的流程如ppt图所示。这里,我们要注意:当表达式结果不为0我们就认为表达式成立。则就会执行复合语句。只有是0时才跳到复合语句的下一条。我们来看看这个程序。其结果位什么呢?我们可以看到会得到两条输出。我们可以看到只要是非0的结果,我们认为是真。那么负数呢?结果同样是为真。接下来我们来看这样的例子。大家先读一读。结果会是什么呢?这里我们要注意判断两个数是否相等是==。而=是赋值运算。我们可以看到。m不等于100.所以不会输出m==10。而由于m=100之后,结果可以看到m不为0.所以就会输出我们这条语句的结果。我们再来看看if——else语句。其形式是如果表达式成立则执行语句1.负责就执行语句2.其流程图如ppt所示。我们可以看到这就如同我们用英文表达某人很好看。此时我们会判断是男的还是女的?比如表达式是是否是男性。成立就输出youarehandsome,否则就是女性则输出youarebeautiful。那么我们写C语言怎么写呢?接下来我们来看看输入一个整数。判断该整数的奇偶性?那么我们来看看是否可以改改任何判断条件呢?!(m&1)。我也在大家的要求下将?:用if,else来转换过,那么我们可以知道ifelse是可以相互转换的。我们来看例子3-5.这个例子是我们第二章习题2.31类似的问题。那么我们怎么样用if——else来代替呢?接下来,我们来看看if-else的嵌套。比如我们这里看到的ifelseif.。。。。他的执行流程如图所示。如果表达式1成立则执行语句1.然后接受,否则就去判断表达式2.如果成立类似表达式1.否则判断表达式3.。知道都不成立则执行最后的语句然后退出。比如,我们来看看这个问题。将0~100,90以上就是a,80到90就是b,70到80就是c,60到70就是d。否则就是e。那么用if语句怎么做呢?(学生思考)我们来看源程序。接下来我们再来看看这个分段函数怎么用if语句来写呢?我们再看完了简单的if语句之后,我们来进入一个新的内容。switch语句。ppt上给出了其一般形式。我们要注意。千万不能连接;switch语句是根据表达式的不同值,选择不同的程序分支又称开关语句。我们同样要注意,表达式的比如是一个数值型或者是字符型。另外需要注意的是常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。其执行的流程如图所示。我们要看到如果等于常量1就执行语句1.在执行完之后则判断是否有break如果有则跳出swtich否则继续执行语句2然后再判断是否有break。知道遇到break或者是所有的语句都执行完。这里要注意:通常情况下,E1,E2,…En是整型常量表达式,且值必须互不相同;语句标号作用,必须用break跳出;case后可包含多个可执行语句,且不必加{};switch可嵌套;多个case可共用一组执行语句;比如ppt上的例子。我们来看看这样的例子。这里我们再强调下:1、if语句能测试关系和逻辑表达式,而switch只能测试相等。2、switch语句的每个case后面的常熟必须是整型或字符型,在使用字符常量时。自动转换成整数。3、switch语句中每个case常熟必须不同。这是我们介绍的swtich语句。作业及课外训练:课后习题1到3题参考资料(含参考书、文献等):见参考书第5章课后自我总结分析:学生对选择结构中的if语句理解较好,但switch语句还有待加深6X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第3章2节教学目的与要求:教学目的:学习循环程序设计的含义及思路教学要求:掌握while语句、do-while语句教学重点和难点:教学重点:while语句教学难点:do-while语句教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(板书、互动)运if语句的格式、执行过程和用法;switch语句的格式、执行过程和用法较简单的if语句嵌套及switch语句嵌套二、介绍本次教学内容:10分钟(板书书写本次讲授内容提纲)while语句;do-while语句三、讲授知识点:75分钟(多媒体演示,并结合适当板书)各位同学大家好,我们上次课已经给大家介绍完了课程的结构化程序中的分支结构,分为两类,if-else以及switch语句,我们可以看到这两种结构还是比较好理解的。接下来我们要对其进行巩固和复习。在C中可能会有多个if和else进行嵌套,在此我们要知道,else总是与向上就近的if进行配对。这里我们来看二级考试的一个真题。(真题训练)那么我们可以看到这一类就是考试中的一般形式。我们再来看看二级考试中对于switch语句的考察。我们再复习完分支结构之后,我们再来看看循环结构。循环结构是本章的重点和难点,上次课我们已经介绍while循环。While循环的一般形式如PPT上说明的。这里我们要知道,但表达式一旦成立才会做循环体内的语句,而while循环也被常称为当型循环语句。这里我们还是要强调,while循环是先判断表达式,再执行语句,并且表达式同if表达式一样,可以是任何类型的表达式,while循环结构常用于循环次数不固定根据是否满足某个条件决定循环与否的情况。并且循环多于一句时,要红{}括上。我们上次课也已经看到了,左右两个while循环执行的次数是不一样的。而这个求和的例子我们也看到了,接下来我们来看看用while循环来计算n的阶乘。这里我们看到只要n>=1成立那么我们就会执行m=m*n,知道表达式不成立为止。这里我们要注意,表达式在判断前,必须要有明确的值,循环体中一般有改变的条件表达式的语句,也就是说要给出循环一次之后的记录,这是为了避免出现不必要的死循环。另外我们还要注意,while表达式后面是没有分号的。那么如果我们有了分号会有什么样的结果呢?很显然会有一个死循环。接下来,我们再讨论do-while循环,其一般的形式如PPT上列出。我们可以看到do-while循环常被称为直到型循环语句。这里我们来看看其与while的区别是什么呢?while循环是判断之后在执行循环体,而do-while呢?是做了之后,再进行判断。那么即便是表达式一次都不成立,但是while循环是不会被执行的。而do-while循环则会被执行一次,这也是二级考试常常考察的地方。这里我们还是来看看计算1到100的和的程序。程序的编写是这样的。尤其要注意while后面是有分号,而do后边是没有分号。接下来我们再看看求5的阶乘的例子。通过两个例子我们可以看到了do-while循环一些特别的例子,那么我们需要说明的是do-while循环是先执行语句,后做判断表达式,第一次条件为真时,while和do-while等价,第一次条件为假的时候,二者是不同的。比如厦下面的例子。当输入0到10之间的数字那么结果是一样的。但是,如果我们输入一个大于10的数时,结果就会不一样。我们来看看程序的执行过程。(程序演示)另外我们要看到,在if、while语句中,表达式后面是没有分号的,而do-while语句的表达式后面是必须加分号的。另外,do-while循环和while循环是可以相互替换的,只是要注意修改循环控制的条件。作业及课外训练:课后习题4到6题参考资料(含参考书、文献等):见参考书第5章课后自我总结分析:学生对选择结构中的for还有待加深7X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第3章2节教学目的与要求:教学目的:学习循环程序设计的含义及思路教学要求:掌握for语句、简单的循环嵌套教学重点和难点:教学重点:for语句教学难点:双重循环教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(板书、互动)while语句;do-while语句二、介绍本次教学内容:10分钟(板书书写本次讲授内容提纲)for语句;循环嵌套三、讲授知识点:75分钟(多媒体演示,并结合适当板书)我们再看完了,while循环和do-while循环之后,我们来讨论下本章的重点和难点。Fro循环。For循环的一般形式如ppt所示,我们要看到,for(初始表达式1;条件表达式2;循环表达式3){循环体;}这里我们可以看到for循环较之我们以前看到的循环形式上要复杂些,但for循环也是我们在使用c语言时,最位常见的循环语句。那么我们来分析该形式,其中循环体语句是值被重复执行的语句。而表达式1是用于循环开始为循环变量设置初始值;表达式2是控制循环执行的条件,决定循环次数;表达式3则是循环控制变量修改表达式。我们接下来看看执行的过程。首先是执行表达式1.用于给出初始值,接着判断表达式2,如果成立则执行循环体,然后执行表达式3然后再判断当表达式2不成立时则跳出for循环。比如,利用for语句来实现1~100的和这个例子。我们以前已经说过,那么请同学们试着将其程序流程图写出来。接下来我们来看看用for循环来计算1~9的平方这个例子。我们可以看到1~9的平方我们可以看出是1*1;2*2……9*9.这里我们会发现其规律是i*j每计算一次之后就将i和j都进行自增1.那么结果是不是我们想要的呢?那么大家试着写写这个程序。这里我们要注意的例子给出的参考程序也是正确的。只是使用了两个变量i和j来进行的计算。这里我们要注意的是循环时的边界问题。我们要计算的是范围是1~9的平方那么边界就是1和9.此时我们在定义表达式2时就不能有=10.或者我们可以将表达式2改成<=9那么结果是一样的。那么我们要学会这样的表达是为什么!接下来我们看看for循环的注意地方,三个表达式都可以是逗号表达式,三个波士顿都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。比如上个例子中的表达式3就是可以一个逗号表达式。另外,如果省略表达式1.那么我们可以在定义i时就给初值,而省略表达式3的话我们可以在循环体中进行,而如果省略表达式2的话则会发生什么结果呢?进入一个无限循环。我们来看看这个例子的结果。那么,接下来我们来看一些典型例题的分析。如,求累加1到1000.此时的程序主要代码应该是怎么写呢?如果,我们现在想要实现偶数的求和呢?接下来我们再看看如果求1到100的相乘的结果应该怎么写程序呢?这里我们要知道如果求相乘的结果,如果单纯的使用长整形可能不能实现,所以在定义s时必须使用double型。这是我们看到的for循环。大家可能觉得还是比较好理解的,但是,如果我们将循环进行了嵌套之后,则会称为很多普通学生的噩梦。当然,大家是不普通的。我相信大家是可以克服这个困难的。我们就来看看循环的嵌套。在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。while、do-while、for三种循环都可以互相嵌套。我们来看几种合法的多重循环。这我们再来看看循环语句之间的关系。左边的是一个嵌套循环,那么就有内循环和外循环的区别,而右边的则是并列的循环。我们可以看到左边的是会相互影响的,而右边的则是相互独立的。这里我们要看到,C语言第一坎,我们说过很多同学就会在循环里被循环出进度。指的就是多重for循环。我们这里来看看二重循环嵌套的执行流程。首先是外循环的初始条件,然后是判断外循环的条件,如果不成立那么恭喜我们不用进入循环而直接退出。如果我们外循环条件成立则会进入内循环,当然还是先对内循环环境初始化,也就是内循环的表达式1,然后再判断内循环表达式2是否成立。如果不成立则会跳到去执行外循环表达式3然后再判断外循环条件,如果成立则执行内循环体。然后在执行内循环表达式3然后在判断内循环表达式2.直到不成立为止。比如,现在我们来看看我们要编程实现如下的99乘法表就会使用双重循环。我们来看看99乘法表的一个特点,表中第一行我们可以总结成哪个数与1到9相乘呢?是1.那么第2行呢?第3行呢?那么我们可否认为有一个i其变化就是从1到9呢?那么我们可否写成一个for循环呢?可以利用一个for循环表示成i与某个相乘。那么某个怎么表示呢?第1行是1乘多少呢。还是一个1到9的数。第2行呢?是2成多少?那么我们可否利用j(1~9)与前面的i相乘呢?所以,最后,我们就能看到外循环是for(i=1;i<=9;i++)这里表示多少行,然后是每一行应该是i与j相乘,只是这个j是0~9所以,还是一个for循环for(j=1;j<=9;j++)里面应该是第几行的i与里面的j进行相乘。从而得到双重循环。。作业及课外训练:课后习题4到6题参考资料(含参考书、文献等):见参考书第5章课后自我总结分析:学生对选择结构中的for还有待加深8X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第3章3节教学目的与要求:教学目的:学习break语句和continue语句的格式、功能、执行过程和用、编译预处理教学要求:掌握break语句和continue语句教学重点和难点:教学重点:掌握break语句和continue语句教学难点:编译预处理教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(板书、互动)while语句;do-while语句二、讲授知识点:40分钟(多媒体演示,并结合适当板书)1.break语句(1)语句形式:break;(2)作用:结束break所在的switch语句。结束当前循环,跳出break所在的循环结构。2、continue语句1)语句形式:continue;2)语句作用:结束本次循环。3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。3、break语句与continue语句的区别3.3编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏替换#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号3.3.1宏替换不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名---不作语法检查3.2.2“文件包含”处理功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include<文件名>处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译作业及课外训练:课后习题1到3题参考资料(含参考书、文献等):见参考书第5章课后自我总结分析:学生对选择结构中的if语句理解较好,但switch语句还有待加深9X周X次第X周,第1次课编写时间XXXX年X月X日章节名称第4章数组教学目的与要求:1、理解数组的含义和存储特点;2、掌握一维数组、二维数组的声明、初始化,掌握数组元素的引用、赋值及相互关系;3、掌握字符数组的声明、初始化及字符数组元素的引用;理解字符串与字符数组的异同;掌握常用的字符串处理函数;教学重点和难点:教学重点:一维数组、二维数组的定义、初始化,数组元素的引用;字符串与字符数组,常用的字符串处理函数;教学难点:一维数组、二维数组,字符串与字符数组。教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、介绍本次教学内容:30分钟(多媒体演示,并结合适当板书)1、一维数组的定义和初始化:一维数组的定义方式为:类型说明符数组名[常量表达式];其中:类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:inta[10];说明整型数组a,有10个元素。floatb[10],c[20];说明实型数组b,有10个元素,实型数组c,有20个元素。charch[20];说明字符数组ch,有20个元素。对于数组类型说明应注意以下几点:1)

数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。2)

数组名的书写规则应符合标识符的书写规定。3)

数组名不能与其它变量名相同。例如:main(){inta;floata[10];……}是错误的。4)

方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。5)

不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:#defineFD5main(){inta[3+2],b[7+FD];……}是合法的。但是下述说明方式是错误的。main(){intn=5;inta[n];……}6)

允许在同一个类型说明中,说明多个数组和多个变量。例如:inta,b,c,d,k1[10],k2[20];C语言对数组的初始化赋值还有以下几点规定:1)

可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。例如:inta[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。2)

只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:inta[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:inta[10]=1;3)

如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:inta[5]={1,2,3,4,5};可写为:inta[]={1,2,3,4,5};2、一维数组的元素引用:数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名[下标]其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如:a[5]a[i+j]a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量:for(i=0;i<10;i++)printf("%d",a[i]);而不能用一个语句输出整个数组。下面的写法是错误的:printf("%d",a);【例1】main(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);}二、编写程序举例:30分钟(多媒体演示,并结合适当板书)1、【例2】下面是正确的数组引用实例main(){inti,a[10];for(i=0;i<10;)a[i++]=i;for(i=9;i>=0;i--)printf("%d",a[i]);}2、【例3】下面实例说明了当下标不为整数时将自动取整main(){inti,a[10];for(i=0;i<10;)a[i++]=2*i+1;for(i=0;i<=9;i++)printf("%d",a[i]);printf("\n%d%d\n",a[5.2],a[5.8]);}1、二维数组的定义和初始化:前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组定义的一般形式是:类型说明符数组名[常量表达式1][常量表达式2]其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。例如:inta[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类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]:1)

按行分段赋值可写为:inta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};2)

按行连续赋值可写为:inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};这两种赋初值的结果是完全相同的。【例1】main(){inti,j,s=0,average,v[3];inta[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:%d\nclanguag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);printf("total:%d\n",average);}对于二维数组初始化赋值还有以下说明:1)

可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:inta[3][3]={{1},{2},{3}};是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:100200300inta[3][3]={{0,1},{0,0,2},{3}};赋值后的元素值为:0100023002)

如对全部元素赋初值,则第一维的长度可以不给出。例如:inta[3][3]={1,2,3,4,5,6,7,8,9};可以写为:inta[][3]={1,2,3,4,5,6,7,8,9};3)

数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。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]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。2、二维数组的元素引用:二维数组的元素也称为双下标变量,其表示的形式为:数组名[下标][下标]其中下标应为整型常量或整型表达式。例如:a[3][4]表示a数组三行四列的元素。下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。【例2】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

张王李赵周Math8061598576C7565638777Foxpro9271709085可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average为全组各科总平均成绩。编程如下:main(){inti,j,s=0,average,v[3],a[5][3];printf("inputscore\n");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:%d\nclanguag:%d\ndbase:%d\n",v[0],v[1],v[2]);printf("total:%d\n",average);}程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。三、给出题目让学生编程:30分钟(师生互动)1、编写一个程序,他能够求两个阶乘之和。2、求出一个具有10个元素的数组中最大的元素,并输出到屏幕上;作业及课外训练:1、编写一个程序,对一个数组中的所有整形元素做升序排序。参考资料(含参考书、文献等):1、《C语言程序设计》(第三版)谭浩强清华大学出版社课后自我总结分析:10X周X次第X周,第2次课编写时间XXXX年X月X日章节名称第4章数组教学目的与要求:1、理解数组的含义和存储特点;2、掌握一维数组、二维数组的声明、初始化,掌握数组元素的引用、赋值及相互关系;3、掌握字符数组的声明、初始化及字符数组元素的引用;理解字符串与字符数组的异同;掌握常用的字符串处理函数;教学重点和难点:教学重点:一维数组、二维数组的定义、初始化,数组元素的引用;字符串与字符数组,常用的字符串处理函数;教学难点:一维数组、二维数组,字符串与字符数组。教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、介绍本次教学内容:30分钟(多媒体演示,并结合适当板书)1、字符数组与一维字符数组:用来存放字符量的数组称为字符数组。形式与前面介绍的数值数组相同。例如:charc[10];由于字符型和整型通用,也可以定义为intc[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组。例如:charc[5][10];即为二维字符数组。字符数组也允许在定义时作初始化赋值。例如:charc[10]={‘c’,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,’m’};赋值后各元素的值为:数组Cc[0]的值为‘c’c[1]的值为‘’c[2]的值为‘p’c[3]的值为‘r’c[4]的值为‘0c[5]的值为‘g’c[6]的值为‘r’c[7]的值为‘a’c[8]的值为‘m’其中c[9]未赋值,由的值为‘p’系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如:charc[]={`c`,``,`p`,`r`,`o`,`g`,`r`,`a`,`m`};这时C数组的长度自动定为9。【例1】main(){inti,j;chara[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};for(i=0;i<=1;i++){for(j=0;j<=4;j++)printf("%c",a[i][j]);printf("\n");}}本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如:charc[]={'c','','p','r','o','g','r','a','m'};可写为:charc[]={"Cprogram"};或去掉{}写为:charc[]="Cprogram";用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:C

program\0‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。2、字符串的输入与输出在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。【例2】main(){charc[]="BASIC\ndBASE";printf("%s\n",c);}注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf("%s",c[]);【例3】main(){charst[15];printf("inputstring:\n");scanf("%s",st);printf("%s\n",st);}本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如当输入的字符串中含有空格时,运行情况为:inputstring:thisisabook输出为:this从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:【例4】main(){charst1[6],st2[6],st3[6],st4[6];printf("inputstring:\n");scanf("%s%s%s%s",st1,st2,st3,st4);printf("%s%s%s%s\n",st1,st2,st3,st4);}本程序分别设了四个数组,输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如&a,&b等。但在前例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组charc[10],在内存可表示如图。C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]

设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c)时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。下面介绍几个最常用的字符串函数。字符串输出函数puts格式:puts(字符数组名)功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。【例5】#include"stdio.h"main(){charc[]="BASIC\ndBASE";puts(c);}字符串输入函数gets格式:gets(字符数组名)功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。【例6】#include"stdio.h"main(){charst[15];printf("inputstring:\n");gets(st);puts(st);}可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。字符串连接函数strcat格式:strcat(字符数组名1,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志“\0”【例7】#include"string.h"main(){staticcharst1[30]="Mynameis";intst2[10];printf("inputyourname:\n");gets(st2);strcat(st1,st2);puts(st1);}本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。字符串拷贝函数strcpy格式:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”【例8】#include"string.h"main(){charst1[15],st2[]="CLanguage";strcpy(st1,st2);puts(st1);printf("\n");}本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。三、给出题目让学生编程:30分钟(师生互动)1、使用字符串处理函数,编写一个程序,该程序能够将两个字符串合并为一个字符串;2、编写一个函数,能够检查用户输入的用户名和密码是否正确。例如,用户名为“abc”,密码为“123,那么用户输入正确,则登录成功,否则,告知登录失败。作业及课外训练:课后习题参考资料(含参考书、文献等):1、《C语言程序设计》(第三版)谭浩强清华大学出版社课后自我总结分析:11X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第5章1、2、3节教学目的与要求:教学目的:学习指针的概念,和基本用法。教学要求:1.掌握变量的指针和指向变量的指针变量。2.掌握用指针访问所指向的变量。3.掌握指针与一维数组的关系。教学重点和难点:教学重点:通过指针访问所指向的变量。教学难点:指针与一维数组的关系。教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)复习一下一维数组的访问,特别是一维字符型数组和字符串的处理。二、介绍本次教学内容:5分钟(板书书写本次讲授内容提纲)1、指针概念,其实就是地址。2、建立指针变量与被指向变量的关系,及其访问方式。(较费解)3、一维数组与指针,通过指针访问一维数组。三、讲授知识点:30分钟(多媒体演示,并结合适当板书)1、指针型变量的定义形式。2、给指针变量赋值。(建立指向关系)3、通过指针访问原变量。(阐述2个符号:&*的用法)4、使用指针的注意事项,必须先赋值,否则很危险。5、(设问:为什么指针变量未赋值比普通变量危险?)举例说明:char*p;*p=‘a’;运行出现保护性错误。6、PPT展示了一维数组的内存结构,列出下标访问方式。7、将数组首地址赋值给指针变量。8、建立通过指针访问数组元素的各种方式。9、引出指针变量的加减运算,结合数组元素进行对比说明。作业及课外训练:5.235.24参考资料(含参考书、文献等):《C语言程序设计》谭浩强编。课后自我总结分析:根据学生的反馈自我评价。12X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第5章4、5节教学目的与要求:教学目的:学习用指针处理字符串的用法。教学要求:1.掌握字符型指针与字符型一维数组的关系。2.掌握字符型指针与常量字符串的关系。3.掌握指针与二维数组的关系。教学重点和难点:教学重点:弄清楚指针指向常量时的访问禁忌。教学难点:指针与二维数组的关系。教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)复习一下指针的间接访问功能以及加减运算。二、介绍本次教学内容:5分钟(板书书写本次讲授内容提纲)1、指针与常量字符串。2、通过指针问什么不能去改变常量字符串。(较费解)3、指针与二维数组。三、讲授知识点:30分钟(多媒体演示,并结合适当板书)1、将常量字符串赋值给一个字符型指针。2、(思考如何实现存储的?)内存空间的进一步阐释。3、试图通过指针改变常量字符串,引发错误。再次说明常量的含义。4、通过指针与一维数组元素的关系,引伸出指针与二维数组的关系。5、展示如何定义指向一维数组的指针,从而可以建立指针与二维数组的联系。举例说明:char(*p)[4];chara[5][4];p=a;6、利用指向一维数组的指针去访问二维数组的元素。7、字符串数组的处理。8、指针型数组。作业及课外训练:5.27参考资料(含参考书、文献等):《C语言程序设计》谭浩强编。课后自我总结分析:根据学生的反馈自我评价。13X周X次第X周,第X次课编写时间XXXX年X月X日章节名称第5章6、7节教学目的与要求:教学目的:学习指针更深入的用法。教学要求:1.掌握二级指针的概念。2.掌握二级指针与原变量的关系。3.掌握指针访问动态内存的方法。教学重点和难点:教学重点:二级指针。教学难点:动态内存分配的概念。教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):一、复习相关知识点:5分钟(多媒体演示)复习一下指针的间接访问功能。二、介绍本次教学内容:5分钟(板书书写本次讲授内容提纲)1、指向指针的指针。2、动态内存的概念。3、用指针访问动态内存空间。三、讲授知识点:30分钟(多媒体演示,并结合适当板书)1、定义一个二级指针。2、(思考这个二级指针该如何使用?)结合内存空间进一步阐释。3、关于更多级指针的引申。(不做过多的讲解)。4、C语言中涉及的内存空间管理问题。5、函数malloc()free)的使用。6、利用malloc实现一个1000万个元素的空间。作业及课外训练:5.26参考资料(含参考书、文献等):《C语言程序设计》谭浩强编。课后自我总结分析:根据学生的反馈自我评价。14X周X次第X周,第13次课编写时间XXXX年X月X日章节名称第6章6.1-6.3节教学目的与要求:1、C语言库函数的调用。2、函数的定义与声明。3、函数的类型与返回值。4、函数的形式参数与实在参数,参数值的传递。教学重点和难点:教学重点:函数的类型与返回值,形参与实参,参数值的传递教学难点:形参与实参教学组织(含课堂教学内容、教学方法、辅助手段、师生互动、时间分配、注明板书设计部分):步骤一复习引导步骤二讲授新课引入新课:开发大型软件时如操作系统时,一个系统一个人完成不了,引入一种形式,多人同时编写,形成自己的程序模块,并可相互对接,最后合并完成。这样其中的每一个程序模块可以称之为一个函数。一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。在C语言中,模块的作用是由函数来完成的:说明:(1)C程序的执行从main函数开始。也就是说系统在运行这个程序时不管先看到哪个函数,首先找到main(),函数开始执行。那有些同学问其它函数怎么被执行上呢。因为如一个程序中有很多函数,那么在main()函数中一定存在调用这些函数的语句,甚至于出现在main()中调用f1函数,又在f1函数中调用f2函数,就这样从main()开始,至main()结束。(2)所有子函数都是平行的,任何子函数都不属于其他函数函数之间可以相互调用(3)函数可返回值,也可不返回值例:getchar()在调用时一定有返回值,并将值赋给一个变量,ch=getchar(),也就是我们期待着从getchar这个函数得到一个字符赋给ch.putchar(ch)调用的功能是向显示器输出一个字符,这时此函数只完成了一个动作,向显示器输出一个字符,并没有返回值,就是说看它是否有返回值,也是看此函数是否给谁赋值,即有无变量期待它返回一个值。如无,则它只是完成了一个过程,不需返回值。(4)从用户的角度看,函数可分为:1)标准函数:即库函数是C语言在交给用户使用之前,事先预计到了大量用户经常使用的功能,将编写这些功能的程序语句省略下来,由C开发人员将其编写好,提供给用户,用户就没必要再自己编写。2)自定义函数:用户自定义的函数,种类\数量都很多)如前面所用到的fabs:求绝对值函数、getchar:标准输入函数,这些都是事先编好的,只要用户在适合的地方调用即可。这些标准函数放在相对应的库文件中,如:”math.h“库文件中包含了所有数学函数;“stdio.h”包含了标准输入输出函数;“string.h”字符串函数。在调用时,用#inclde预处理命令后跟库文件,作用就是告诉编译系统,需调用的函数在这个头文件中,头文件会带领编译系统找到C提供的库函数的入口地址,这样就可以通过include命令把C的库函数的源代码载入到用户编写的程序中。(5)从函数形式看,可分为:1)无参数函数:如getchar()2)有参数函数:如Printf(“格式控制符”,变量输出表列)通过例题使学生初步认识函数及其执行过程和作用。例6-1:通过例题使学生初步认识函数及其执行过程和作用。p1(){printf(“**********\n”);}p2(){printf(“##########\n”);}p3(){printf(“计算机系\n”);}main(){p1();p2();p3();}说明:(1)此程序一共有P1,P2,P3,main()四个函数,main()在最后;(2)Ctrl+F9后,系统开始找main()函数开始执行,不管位置在哪,开始执行函数体。(3)第一条语句是调用P1函数,就是将控制权交给P1这个子函数里,执行P1的函数体,执行到函数的右边大括号处返回,返回到调用处的下一条语句。(4)依此类推,最后再返回到main函数,整个程序运行完毕。§6.1函数定义的和声明函数的定义:类型标识符 函数名(类型标识符形参1,类型标识符形参2,…){函数体变量说明语句;函数体可执行语句}详细讲解,此题为学生理解函数的关键例6-2:求两个数中最大数详细讲解,此题为学生理解函数的关键intmax(intx,inty)/*定义两个整型形参*/{intz;/*子函数中用到的内部变量,为局部变量*/z=(x>y)?x:y;/*条件表达式*/return(z);/*将z值返回,通过max带回调用处*/}main(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);/*调用max子函数,在调用的同时把a,b值传进去给形参x,y*/printf(“Maxis%d\n”,c);}1.无参函数的定义形式格式:类型说明符函数名(){函数体}2.有参函数的定义形式格式:类型说明符函数名(形式参数说明){函数体}3.空函数的定义形式格式:类型说明函数名([形式参数表列]){}/*空语句*/作用:调用此函数时,什么工作也不做,没有任何实际作用。只是这些函数未编好,先占一个位置,等以后扩充程序时用一个编好的函数补充上。函数的声明: 当函数定义在主调函数之后,在主调函数中需要对被调用函数进行声明。格式:类型标识符函数名(类型标识符形参1,类型标识符形参2,…);类型标识符函数名(类型标识符,类型标识符,…);类型标识符函数名();例如:1)floatfun(inta,doubleb);2)floatfun(int,double);3)floatfun();说明:(1)函数与变量一样,必须先定义后使用。(2)如果没有声明函数类型,则编译程序自动将整型作为函数的缺省类型。(3)函数声明中,末尾的分号不可缺少。§6.2函数的调用与返回6.2.1函数名(实参表列)max(a,b)说明:(1)如调用无参函数,实参表列可忽略,但括号不能省。(2)实参的个数和形参一般相等(3)实参和形参的类型应一一对应,必要时使用类型转换注意:不同系统中,实参的计算顺序不同,为避免由此而引起的混乱,一般应用调用函数前计算出实参值。例:读程序,写结果intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;TC计算顺序右至左∴TC计算顺序右至左∴a=3,b=3,c=0但有些系统计算顺序左至右∴a=2,b=3,a=-1容易混乱,通用性差。所以改进。inti=2,j,p;j=++i;inti=2,j,p;j=++i;p=f(i,j);printf(“%d”,p);}main(){inti=2,p;p=f(i,++i);printf(“%d”,p);}结果:0函数调用方式(引入方式)1.函数调用语句格式:函数名(实参表);如:p1()说明:这种方式常用于调用无返回值的函数。2.函数表达式(函数必须返回一个值并参与表达式的运算)一般形式为:c=2*max(a,b);c=max(a,b);说明:1)这种方式用于调用有返回值的函数。函数的返回值将参加表达式的运算。2)不能用于void型函数(∵void不能返回值)3.函数参数(函数调用作为一个函数的实参)一般形式为:m=max(a,max(b,c));printf(“%d”,max(b,c);说明:此种调用方式是把函数作为函数的参数。补充内容函数调用的执行过程1.按顺序计算实参中各表达式的值2.按照位置,将实参的值一一对应地传送给形参3.执行被调用函数4.当遇到return(表达式)语句时,计算机表达式的值,并返回主调函数main(){inti=2;运行结果:416运行结果:416256printf(“%d\n”i=square(i));}square(x)int{return(x*x);}注意:1.在程序中调用函数需满足以下条件(1)被调用函数必须存在,且遵循“先定义后使用”的原则(即在调用子函数这个调用点之前,它必须已被定义)(2)如果被调用函数的定义在主调函数之后,并且不是整型或字符型,可以先给出“原形声明”2.原形声明的形式为:类型说明函数名(参数类型,参数类型…);注意:没有函数体3.说明:在主函数中对被调函数作类型说明,意在告诉编译系统,本函数中将要用到的某函数是什么类型,以便让编译系统作出相应的处理。4.注意:在编程时必须将子函数放在前面,主函数放在最后,避免因原形未作声明而出错。例:读程序,写结果floata(float)main(){floatx=-1.2,y;y=a(x)printf(“x=%f,a(x)=%f\n”,x,y);}floata(floatx){return(x>0?x;-x);}}结果:x=-1.2,a(x)=1.26.2.21.返回函数值的方法1)一个函数如有返回值,必须使用return语句,将得到的值返回到主调函数。格式:return(表达式)或return表达式(先求解表达式值,再返回该表达式的值)结果:1!is12!is23!is6将数带进去一步步做。例结果:1!is12!is23!is6将数带进去一步步做。{inti;for(i=1;i<=5;i++)printf((“%d!is%d\n”,i,factorial(i));}factorial(intn){intvalue;for(value=1;n>1;n--)value*=n;return(value);}2)一个函数可以有若干个return语句,但不论执行到哪个return语句,都将结束函数的调用返回主调函数。一个程序有多个return语句,说明该函数有多个出口,但只能执行一次return语句例6-5:main()一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论