计算机程序设计基础 第五饼函数
1 计算机程序设计基础 第五讲 函数
、数组 问题:编程求解∑ 现假定n=6,k=4 我们用函数来编写这个题的程序,参考程序如下: #include /预编译命令 #define n 6 /定义n为6 t define k 4 定义k为4 void maino /主函数 /主程序开始 printf("sum of %dth powers of integers from 1 to %d=",k,n 提示信息 printf("%d\n",SoP(n, k)); 输出结果,其中 /SOP(k)为被调用函数 } 主程序结束
2 三、数组 问题:编程求解 1 n k x x = 现假定 n=6,k=4 我们用函数来编写这个题的程序,参考程序如下: #include //预编译命令 #define n 6 //定义n为6 #define k 4 //定义k为4 void main() //主函数 { //主程序开始 printf("sum of %dth powers of integers from 1 to %d=",k,n ); //提示信息 printf("%d\n",SOP(n,k)); //输出结果,其中 //SOP(n,k)为被调用函数 } //主程序结束
/以下函数是被主程序调用的函数 int SoP(m, D) 整型自定义函数,m,为形参 int m, 形参m,为整型变量 自定义函数体开始 int i sum: 整型变量i,sum sum≡0 初始花累加器 for (i=l; i<=m; i=i+1) 计数循环(i 循环体开始 sum=sum+power( i, ) 累加 循环体开始 return(sum); 返回值um给函数sop(n,k 自定义函数体结束 以下函数是被函数sop(n,k)调用的函数 int power(p, q) 整型自定义函数 Int p, 9; /形参pq为整型变量 自定义函数体开始 int i, product; 敦 product=1 初始化累乘器 for(i=l; K<=q: i=i+1) 计数循 ∥循环体开始(i product=product*p; 累乘 循环体结束(i) return(product) /累乘值 produc返回给 power3 自定义函数体结束
3 //以下函数是被主程序调用的函数 int SOP(m,l) //整型自定义函数,m,l 为形参 int m,l; //形参m,l 为整型变量 { //自定义函数体开始 int i,sum; //整型变量i,sum sum=0; //初始化累加器 for (i=1; i<=m; i=i+1 ) //计数循环(i) { //循环体开始 sum=sum+power( i ,l ); //累加 } //循环体开始 return (sum) ; //返回值sum给函数sop(n,k) } //自定义函数体结束 //以下函数是被函数sop(n,k)调用的函数 int power(p,q) //整型自定义函数 int p,q; //形参p,q 为整型变量 { //自定义函数体开始 int i,product; //整型变量 product=1; //初始化累乘器 for(i=1; i<=q; i=i+1) //计数循环( i ) { //循环体开始( i ) product=product*p; //累乘 } //循环体结束( i ) return(product); //累乘值product返回给power } //自定义函数体结束
自定义函数 为了突出重点,先学会基本东西,省略掉一些事情先不讲。 数据类型>() 例: int powert(p,n) power为函数名,要以英文字母开头。 int是函数值的数据类型,这里是int(整型)。 (p,n)括号中的p,m为函数的形式参数,形式参数也要定义其数据 类型。 函数定义的一般格式: 数据类型>()
4 自定义函数 () 例: int power(p,n) power为函数名,要以英文字母开头。 int是函数值的数据类型,这里是int(整型)。 (p,n)括号中的p,n为函数的形式参数,形式参数也要定义其数据 类型。 函数定义的一般格式: () { } 为了突出重点,先学会基本东西,省略掉一些事情先不讲
形式参数与实在参数 1、形式参数是在定义函数时放在函数名后括号中的参数。在未进 行函数调用时,并不对形式参数分配内存单元。在发生函数调 用时,立刻给形式参数分配内存单元。调用结束后,释放掉行 参所占的内存单元。 2、因此,形参变量属于局部变量,其作用域在它所在的函数体内。 3、在定义函数的时候,必须指定形参变量的类型,如何指定?有 二种方法: (1) int power(p, n) (2)int power(int p, int n) int p, n; 有些编译系统不认识第(2)种形式
5 1、形式参数是在定义函数时放在函数名后括号中的参数。在未进 行函数调用时,并不对形式参数分配内存单元。在发生函数调 用时,立刻给形式参数分配内存单元。调用结束后,释放掉行 参所占的内存单元。 2、因此,形参变量属于局部变量,其作用域在它所在的函数体内。 3、在定义函数的时候,必须指定形参变量的类型,如何指定?有 二种方法: 形式参数与实在参数 (1) int power(p,n) int p,n; { …… } (2) int power(int p,int n) { …… } 有些编译系统不认识第(2)种形式
4、实在参数是一个具有确定值的表达式。函数在调用时,将实在 参数赋给形式参数。 比如,主函数调用SOP(m,k),这时,m,k为是在参数,m的 值为6,k的值为4。在被调用函数定义中, int SOP(m,D中的m 为形式参数,在SOP被调用时,系统给m,这两个形式参数分配 了内存单元。之后,n的值6赋给m,k的值4赋给l 实在参数的个数及类型应与形式参数一致。赋值时前后对应关系 不会改变。下面画出主函数与SOP函数,调用与被调用时参数 传递关系:
6 4、实在参数是一个具有确定值的表达式。函数在调用时,将实在 参数赋给形式参数。 比如,主函数调用SOP(n,k),这时,n,k为是在参数,n的 值为6,k的值为4。在被调用函数定义中,int SOP(m,l)中的m,l 为形式参数,在SOP被调用时,系统给m,l这两个形式参数分配 了内存单元。之后,n的值6赋给m,k的值4赋给l。 m l 6 4 实在参数的个数及类型应与形式参数一致。赋值时前后对应关系 不会改变。下面画出主函数与SOP函数,调用与被调用时参数 传递关系:
主函数执行下述语句时, printi%dn”,SOP(口,k); 传值给被调用函数 int SoP(m, D) n的值6传给m, k的值4传给l 6和4为实在参数,m和为形式参数。 被调用函数在其形式参数被赋值之后,开始执行函数体,先是让 累加器初始化为0(sum=0),接着进入以i为控制变量的计算 循环,i1变到m(m=6),即累加m次(即6次)。循环体为 sum=sum+ power(i)当6次循环执行完后,实现的是 sunn ∑x(=4) x=1 注意这里是由另一个自定义函数 power(i,实现的
7 主函数执行下述语句时, printf(“%d\n”,SOP(n,k)); 传值给被调用函数 int SOP(m,l) n的值6传给m, k的值4传给l。 6和4为实在参数,m和l为形式参数。 被调用函数在其形式参数被赋值之后,开始执行函数体,先是让 累加器初始化为0(sum=0),接着进入以i为控制变量的计算 循环,i从1变到m(m=6),即累加m次(即6次)。循环体为 sum=sum+power(i,l)。当6次循环执行完后,实现的是 6 1 ( 4) l x sum x l = = = 注意这里 是由另一个自定义函数power(i,l)实现的。 l i
power(i,处在SOP(m,D函数中,表示SOP函数去调用 power函数。其中订为实在参数,而 Jint power(p,q)中 的p,q为形式参数 比如,执行SOP(6,4)时,=4,m=6, 当i=1时, sum=sum+power(1, 4) 这里1,4为实在参数,调用 power(p,q),两个形式参数 p,q分别被赋以1,4
8 power(i,l)处在SOP(m,l)函数中,表示SOP函数去调用 power 函数。其中i,l为实在参数,而int power(p,q)中 的p,q为形式参数。 比如,执行SOP(6,4)时,l=4,m=6, 当i=1时, sum=sum+power(1,4) 这里1,4为实在参数,调用power(p,q),两个形式参数 p,q分别被赋以1,4
oOP(m,k)执行SOP(6,4) 调用 执行 power(1. (1,4) 调用 sum=0 product=11*1*1 1: sum=sum+ power(iD) return(1)F1 0+1 返回 调用 执行 i=2: sum=sum+ pe Dower(i,D) product=2 22*2 1+16 return(16)=16 返回 执行powe 3,4): 3:sm=smm土 power((D调用 product=33*3*3 17+81 返回 return(81)=81 98 i=4: sum= sum+ power(i,D) 周用 执行 power(4,4) 98+256 product=4为44 返回 354 return(256)=256 :sum=sum + power(i, I) 调用 执行 power(5,4): 354+625 produ 979 return(625)∈625 =6: sum= sum power(i, I) 週用 =979+129 返回 执行 power(6,4) 2275 product=666为 2275 return(sum) return(1296)=12969 返闻
9 执行 SOP(6,4) l=4 sum=0 i=1: sum = sum + power(i,l) = 0 + 1 = 1 i=2: sum = sum + power(i,l) = 1 + 16 = 17 i=3: sum = sum + power(i,l) = 17 + 81 = 98 i=4: sum = sum + power(i,l) = 98 + 256 = 354 i=5: sum = sum + power(i,l) = 354 + 625 = 979 i=6: sum = sum + power(i,l) = 979 + 1296 = 2275 return (sum) 2275 返 回 执行 power(1, 4): product = 1*1*1*1 return(1) = 1 调用 返回 执行 power(2, 4): product = 2*2*2*2 return(16) = 16 调用 返回 执行 power(3, 4): product = 3*3*3*3 return(81) = 81 调用 返回 执行 power(4, 4): product = 4*4*4*4 return(256) = 256 调用 返回 执行 power(5, 4): product = 5*5*5*5 return(625) = 625 调用 返回 执行 power(6, 4): product = 6*6*6*6 return(1296) = 1296 调用 返回 SOP(n,k) 调用
递归及其实现 递归算法在可计算性理论中占有重要地位,它是算法 设计的有力工具,对于拓展编程思路非常有用。就 递归算法而言并不涉及高深数学知识,只不过初学 者要建立起递归概念不十分容易。 我们先从一个最简单的例子导入 用递归算法求n 定义:函数fact(m)=n! fac(n-1)=(n-1) 则有fact(m)=n.fact(n-1) 已知fac(1)=1
10 递归算法在可计算性理论中占有重要地位,它是算法 设计的有力工具,对于拓展编程思路非常有用。就 递归算法而言并不涉及高深数学知识,只不过初学 者要建立起递归概念不十分容易。 我们先从一个最简单的例子导入。 递归及其实现 用递归算法求n! 定义:函数 fact(n) = n! fact(n-1) = (n-1)! 则有 fact(n) = n fact(n-1) 已知 fact(1) = 1 •