return(max);}
main()
{intx,y,z,w,m;
scanf(“%d,%d,%d,%d”,&x,&y,&z,&w);
m=max(x-y,y-z,z-w);/*调用求3个整数中最大数的函数*/
printf(“max=%d\n”,m);}
可再给出一个编写函数的题目,供学生进行课堂练习。
再给出一个形参是数组的例子讲解
被调函数出现在主调函数之前,不必说明。
【例3】编一个程序,将整型数组中最大数与第一个数交换。
整型数组在主函数中由键盘输入。
main()
{voidf();inta[10],i;
for(i=0;i<10;i++)scanf(“%d”,&a[i]);
f(a);
for(i=0;i<10;i++)printf(“%d”,a[i]);}
voidf(intb[])
{intmax,max_i,i;max=b[0],max_i=0;
for(i=1;i<10;i++)
if(max
max=b[0],b[0]=b[max_i],b[max_i];
return;}
六、小结
函数定义、调用方法;return语句;
七、作业
重点强调函数使用中应注意的问题
教师自留
函数程序设计
(二)
内容
说明
主要内容
重点
难点
1.函数调用中的数据传递方法
2.局部变量、全局变量的定义和使用方法
3.函数的嵌套调用
函数使用中的难点
通过第一讲的【例2】分析值传递过程
通过第一讲的【例3】分析地址传递过程
1.函数调用中的数据传递方法
2.函数的嵌套调用
1.函数调用中的数据传递方法
2.函数的嵌套调用
一、函数调用中的数据传递方法
函数间传递数据有四种方式:
值传递方式;地址传递方式;返回值传递方式;全局变量传递。
前2种利用函数的参数来传递数据,后2种不是利用函数参数传递数据。
1.值传递方式
①是在形式参数和实际参数之间传递数据
②所传递的是参数值
调用函数时,将实际参数的值求出赋予对应的形式参数。
在函数体中对形参的处理与实参无关。
当函数体执行完毕,形参的值可能发生变化,但返回后,形参的值不带回到对应的实参中。
③特点:
参数值的单向传递
④形参一般是变量;实参可是变量或表达式。
2.地址传递方式
1是在形式参数和实际参数之间传递数据
②所传递的是地址
调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。
由于形参和实参的地址相同(占用相同的内存),所以调用时,可看成将实参的值传递给形参;返回时,可看成将形参的值回带给对应的实参。
③特点:
参数值的双向传递
④形参是数组名或指针变量;实参是变量的地址、数组名或指针变量
3.值传递和地址传递方式的区别
值传递:
传递的是数值
地址传递:
传递的是地址。
二、变量的作用域、局部变量和全局变量
1.变量的作用域规则
变量只能在它的作用范围内使用。
变量的作用域与定义变量的位置有关。
2.局部变量:
在一个函数内部(或复合语句内部)定义的变量是内部变量,它只在本函数范围内有效。
①函数不能使用其他函数中定义的变量
②不同函数中可使用相同名字的变量,它们代表不同的对象,互
不干扰
③形式参数也是局部变量
在一个函数内部,在复合语句中定义的变量只在本复合语句中有效。
(2)全局变量:
在函数之外定义的变量称外部变量,外部变量是
全局变量(全程变量)。
它的有效范围为从定义变量的位置开始到本源文件结束。
三、函数的嵌套调用
在调用一个函数的过程中,又调用另一个函数。
例:
分析下列程序完成的功能
floatp(longi)
{longk,j;
注意嵌套调用的方法
for(k=j=1;j<=i;j++)
k=k*j;/*计算k=i!
*/
return((float)(k));
}
floats(longn)
{floatsum=0.0;
longk;
for(k=1;k<=n;k++)
sum+=p(k);/*计算sum=p
(1)+p
(2)+…+p(n)*/
return(sum);
}
floatf(longx,y)
{floatf1;
f1=s(x)/s(y);/*嵌套调用函数p()*/
return(f1);
}
main()
{longx1,y1;
scanf(“%ld,%ld”,&x1,&y1);
printf(“f(x,y)=%f\n”,f(x1,y1));}
结果:
f(x,y)=s(x)/s(y),s(n)=p
(1)+p
(2)+…+p(n),p(i)=i!
此程序中,函数f()通过函数s()调用了p()、主函数通过函数f()调用函数s()都称为两层嵌套调用;主函数调用通过函数f()、s()调用函数p()称为三层嵌套调用。
C语言规定:
不限制嵌套调用的层数,嵌套调用的层数仅受计算机内存的限制。
作业:
四、小结
全局变量、局部变量;函数的嵌套调用;数值传递与地址传递。
五、思考与练习
1、写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。
2、写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
3、写一个函数,输入以行字符,将此字符串中最长的单词输出。
教师自留
函数程序设计(三)
内容
说明
主要内容
重点
难点
概念
1.函数的递归调用
2.系统函数
1.函数的递归调用
2.系统函数
函数的递归调用
一、函数的递归调用
1.定义:
在调用一个函数的过程中又出现直接或间接地调用该函数本身。
如图所示:
2.递归过程必须解决两个问题
(1)递归计算的公式
(2)递归结束的条件
3.递归过程的算法描述:
if(递归结束条件)return递归结束条件下的返回值);
elsereturn(递归计算公式);
4.递归调用函数的调用方法和一般函数的调用方法完全相同
【例1】编写一个计算n!
(n>1)的递归调用函数
函数清单如下:
main()
{longfact(intn);
intn;
printf(“\nPleaseentern:
”);
scanf(“%d”,&n);
printf(“\nn!
=%ld”,fact(n));
}
longfact(intn);
{if(n<1)
{printf(“inputerror!
\n”);
return(-1);
}
elseif(n==1)return
(1);
elsereturn(n*fact(n-1));
}
输入4
程序执行过程:
分2个阶段
递归过程:
将原始问题不断转化为规模小了一级的问题,从未知向已知推进,最终达到递归的结束条件;
回溯过程:
从已知条件出发,沿递归的逆过程逐一求值返回,直至递归初始处,完成递归调用(如下图)。
二、常用的系统函数
1.数学函数:
主要有14个,均包括在”math.h”中。
(1)求整型绝对值函数
【函数头】intabs(intx)
【返回值】参数x(整型)的绝对值(|x|)。
(2)求长整型绝对值函数
【函数头】Longlabs(longx)
【返回值】参数x(长整型)的绝对值(|x|)。
(3)求实型绝对值函数
【函数头】doublefabs(doublex)
【返回值】参数x(实型)的绝对值(|x|)。
(4)求小于或等于x的最大整数函数
【函数头】doublefloor(doublex)
【返回值】小于或等于x的最大整数
(5)求大于或等于x的最小整数函数
【函数头】doubleceil(doublex)
【返回值】大于或等于x的最小整数
(6)求正平方根函数
【函数头】doublesqrt(doublex)
【返回值】参数x的正平方根。
(7)求常用对数函数log10
(8)求自然对数函数log
(9)求指数函数exp
(10)求10的x次方函数pow10
(11)求x的y次方函数pow
(12)求正弦函数sin
(13)求余弦函数cos
(14)求正切函数tan
2.字符处理函数
主要有4个,均包括在头函数“ctype.h”中。
(1)判断是否是英文字母函数isalpha
(2)判断是否是英文小写字母函数islower
(3)判断是否是英文大写字母函数isupper
(4)判断是否是数字字符函数isdigit
3.类型转换函数
主要有5个,包括在不同的头函数中。
(1)将大写字母转换为小写字母函数tolower
(2)将小写字母转换为大写字母函数toupper
(3)将字符转换成ASCII代码值函数toascii
上述3个函数包括在头函数“ctype.h”中。
(4)将字符串转换成浮点数函数atof
(5)将字符串转换成整数函数atoi
上述2个函数包括在头函数“math.h”中。
4.字符串处理函数
主要有8个,前2个包括在头函数“stdio.h”中。
后6个均包括在头函数“string.h”中。
(1)字符串输出函数puts
(2)字符串输入函数gets
(3)测试字符串长度函数strlen
(4)字符串大写字母该小写字母函数strlwr
(5)字符穿小写字母改大写字母函数strupr
(6)字符串复制函数strcpy
(7)字符串比较函数strcmp
(8)字符串连接函数strcat
【例2】输入一个字符串存入数组a,将其复制到数组b,然后将数组b中的所有小写字母改为大写字母,再将a中字符串连接到b。
比较并输出a、b中字符串的大小,统计并输出a、b中字符串的长度,最后输出a、b中的字符串。
#include“stdio.h”
#include“string.h”
main()
{chara[40],b[80];
gets(a);strcpy(b,a);strupr(b);strcat(b,a);
if(strcmp(a,b)<0)printf(“a
elseif(strcmp(a,b)>0)printf(“a>b\n”);
elseprintf(“a=b\n”);
printf(“lengthofa(%s)=%d\n”,a,strlen(a));
printf(“lengthofb(%s)=%d\n”,b,strlen(b));
puts(a);puts(b);
}
三、小结
教师自留
递归定义、调用方法、执行过程、递归的算法。
字符、字符串处理函数
四、思考与练习
1、写几个函数:
a、输入10个职工的姓名和职工号b、按职工号有小到大顺序排序,姓名顺序也随之调整c、要求输入一个职工号,用折半查找的方法找出该职工的姓名,从主函数输入要查询的职工号,输出该职工的姓名。
2、写一个函数,输入一个十六进制数,输出相应的十进制数。
3、给出年月日,计算该日是该年的第几天。
4、用递归法将一个整数n转换成字符串。
例如输入483,应输出字符串“483”,n的位数不确定,可以是任意位数的整数。
重点讲解字符处理函数
floor(-10.5)为–11.0
labs(-10L)
abs(-10)
abs(-327
68)
根据情况可再举一个例子
难点是回溯过程