C教案—第六章
- 格式:docx
- 大小:22.44 KB
- 文档页数:9
第6章函数一、教学要求熟练掌握C++语言中函数与函数调用;使用函数形式编写程序;不同返回值类型函数的编写与调用。
掌握C++语言中的编译预处理;形数与实际参数的关系;根据变量的生存期与作用域正确使用变量;C++语言中函数参数。
了解常见的编译预处理方式;C++语言中变量与其生存期。
二、教学重点C++语言中函数与函数调用;使用函数形式编写程序;不同返回值类型函数的编写与调用。
三、教学难点形数与实际参数的关系;根据变量的生存期与作用域正确使用变量。
四、课时安排本章安排10课时。
其中,理论讲授6课时,上机实验4课时。
五、教学大纲一、程序与函数二、函数定义与声明1.函数声明2.函数定义三、函数参数与调用1.函数调用模式2.按数值调用函数3.函数嵌套与递归四、函数与指针1.指针参数类型2.数组参数3.函数返回指针类型五、变量作用域与生存期1.变量作用域2.变量生存期六、预处理1.定义2.件包含3.件编译六、主要概念1.函数声明2.函数定义3.函数的传值调用与地址调用4.按数值调用函数5.函数嵌套调用6.函数递归调用7.指针参数类型8.数组参数9.函数返回指针类型10.形式参数11.实际参数12.变量作用域13.局部变量14.文件变量15.全局变量16.变量生存期17.普通变量生存期18.静态变量生存期19.宏定义20.文件包含21.条件编译七、实验实验1 函数的调用(2学时)1. 在主函数中调用其他函数。
2. 编写一个求阶乘函数,并调用求输出1~5的阶乘值(即1!,2!,3!,4!,5!)。
实验2 变量不同域(2学时)1.用extern对外部变量作提前引用声明,以扩展程序文件中的作用域。
2.静态局部变量的值。
3.输入两个整数,要求输出其中的大者。
用外部函数实现。
int m=10;m++;printf("m=%d\n",m);}void main(){printf("the first time :");test();printf("the second time :");test();printf("the third time :");test();}6.8.3 用static声明的局部变量【例6.11】静态局部变量例题【启动Visual C++】|【新建工程】|【新建源程序文件】:选中【C++ Source File】项输入如下代码:/* 源文件名:Li6_11.c功能:测试静态局部变量的空间分配情况*/#include "stdio.h"void test(){static int m=10; //定义m为静态局部变量m++;printf("m=%d\n",m);}void main(){printf("the first time :");test();printf("the second time :");test();printf("the third time :");test();}6.8.4 register变量为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。
【例6.12】使用寄存器变量。
【启动Visual C++】|【新建工程】|【新建源程序文件】:选中【C++ Source File】项输入如下代码:/* 源文件名:Li6_12.c功能:测试寄存器存储变量的空间分配情况*/。
第十七讲函数(1)
学时:2学时
授课形式:板书+多媒体讲解+实例程序演示
主要内容及时间安排(课堂90分钟, 80分钟讲课,5分钟复习,5分钟总结):
(1)模块化程序结构的概念、C语言程序结构回顾(5分钟);
(2)函数调用简单例子分析(10分钟);
(3)函数的定义方法(三种有参、无参、空函数)(10分钟)
(4)函数参数和函数值(参数传递方法、参数类型对应关系、函数返回值的含义、返回值的类型等)(20分钟)
(5)简单函数定义和调用举例(40分钟)
(6)总结、习题布置和下一节知识点提要(习题8.1、8.3、8.4,下一节函数的使用深入、变量的作用域、变量的存储分类等)(5分钟)
重点:函数定义方法、函数调用方法、函数参数传递方法、返回值的使用和类型确定;
难点:函数调用方法、函数参数传递方法。
教学内容细节:
一、以具体实例引出函数的优点及函数的作用
例题:打印行列数不同的*号组成的多个矩形,比如打印3*4的、5*6、9*9的。
例题2:求连加和。
输入的数不同;
例题3:程序规模方面考虑,如果有些题目太大,把所有程序都编在主函数中,主函数可读性会下降,规模结构也不尽合理。
所以可以考虑将部分程序功能做成功能包(函数),什么时候需要这个功能,什么时候调用这个功能包,这时只写功能包的名字就好了。
代码的重用性增强、程序结构简化、可读性强、结构性强。
二、函数的定义方法
定义函数的一般形式如下:
类型标识符函数名(形式参数列表)
{声明部分;
执行部分;}
说明:
(1)类型标识符:C语言的数据类型,包括基本数据类型、指针、结构体等;
(2)函数名:符合C语言用户标识符的命名规则;
(3)形式参数列表:与从主调函数中传过来的参数相对应的形式参数列表,根据实际情况可有可无,但是小
扩号必须要有;与形参对应的是实参,主调函数中变量成为实际参数,实际参数在程序运行时分配空间,直到程序结束,空间释放,而形式参数什么时侯调用什么时候分配空间,子函数调用结束空间就释放。
(4){}:大括号必须要有,表示函数体的开始(左括号)和结束(用return或右括号)
特殊说明:
函数定义有两种形式:传统方式和现代方式,上面的是现代方式,传统方式的形参放在小括号外进行说明,小括号内只写上参数列表,对于参数类型不做说明,具体说明放在小括号和大括号之间。
对于函数体中用到的局部变量(不是用来接收主调函数传过来的变量),需要放到函数体中进行声明,就像我们以前设计主函数的函数体是一样的。
例1:两个数求最大值
int max(int x,int y)
{int t;
if(x>y) t=x;
else t=y;
return(t);}
分析:
(1)这个函数定义属于现代类型,函数返回值为两
个整数的较大值,所以函数类型需要说明为int类型;
(2)形式参数是两个,也就是主调函数需要给它两个值,让它在函数体内进行操作,形参的命名可以随意;
(3)在函数体中为了保存两个数中的最大值,新定义一个局部变量t,这个变量不能放在形参列表中,否则会要求主调函数传过来3个参数;
(4)return的作用是返回到主调函数,从哪调用的返回到哪。
然后子函数结束。
三、函数的调用方法
依据上个例子,进行函数调用,只有产生函数调用,子函数才会起作用,否则子函数不起作用。
#include <stdio.h>
main()
{
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max=%d",c);
}
int max(int x,int y)
{
int t;
if(x>y) t=x;
else t=y;
return(t);
}
四、关于return的说明
return的作用是将值返回到主调函数,其后的小括号可省略,但要用空格将返回的值和return分开。
每个子函数只能执行一次return,只要执行return 就返回到主调函数,return后的语句将不被执行。
return后的值类型和函数定义时的类型说明标识符一致,否则会出错,如果不一致编译也没有出错,则返回值的类型以类型说明符为准。
return语句不是子函数必须的,有的子函数只是执行具体功能语句,并不返回值,所以可以没有return语句。
return每次只能返回一个值,如果想返回多个值,就要考虑其他方法了。
五、关于变量类别及作用范围的说明
变量的类型包括:
Auto:自动变量,定义变量时默认的设置,使用时分配空间;
Static:静态变量,值一旦更改不能被二次初始化,只能用改变之后的值,一般考试时,这种定义往往放在子
函数中。
如果定义了整形的静态变量,并没有赋初值,则
默认为0;
Register:寄存器变量,类似于auto只不过是放在
计算机CPU的寄存器中,运算速度比较快,但不能定义太多。
六、简单函数调用程序的设计
例1、设计函数实现求n!。
例2、设计函数实现数组的排序;注意交换两个数也
用函数实现;
七、其他练习题
(1)若函数中有定义语句:int k; ,则
A)系统将自动给k赋初值0 B)这时k中的值无
定义
C)系统将自动给k赋初值-1 D)这时k中无任何
值
(2)设函数中有整型变量n,为保证其未赋初值
的情况下初值为0,应选择的存储类别是
A)auto B)register C)static D)auto或register
(3)在C 语言中,只有在使用时才占用内存单元的
变量,其存储类型是
A)auto和 register B)extern 和register
C)auto 和static D)static 和register (4)有以下程序
#include <stdio.h>
int f(int x,int y)
{ return((y-x)*x);}
main( )
{int a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf(“%d\n”,d);
}
程序运行后的输出结果是
A)10 B)9 C)8 D)7
(5)有以下程序
#include <stdio.h>
void f(int *p,int *q);
main( )
{int m=1,n=2,*r=&m;
f(r,&n); printf(“%d,%d”,m,n);
}
void f(int *p,int *q)
{p=p+1; *q=*q+1;}
程序运行后的输出结果是
A)1,3 B)2,3 C)1,4 D)1,2 (6)有以下程序
#include <stdio.h>
void fun(int a,int b)
{int t;
t=a;a=b;b=t;
}
main()
{int c[10]={1,2,3,4,5,6,7,8,9,0},i;
for(i=0;i<10;i+=2)
fun(c[i],c[i+1]);
for(i=0;i<10;i++) printf("%d,",c[i]);
printf("\n");
}
程序运行的结果是
A)1,2,3,4,5,6,7,8,9,0,
B)2,1,4,3,6,5,8,7,0,9,
C)0,9,8,7,6,5,4,3,2,1,
D)0,1,2,3,4,5,6,7,8,9,
(7)有以下程序
#include <stdio.h>
int a=1;
int f(int c)
{static int a=2;
c=c+1;
return (a++)+c;
}
main()
{int i,k=0;
for(i=0;i<2;i++)
{int a=3; k+=f(a);}
k+=a;
printf("%d\n",k);
}
程序的运行结果为
A)14 B)15 C)16 D)17。