
C语言程序设计4.ppt
37页C++语言程序设计Lecture 41第4章 函数o函数的概念o函数的调用过程o如何使用函数使程序具有更好的结构o局部变量与全局变量o递归函数o一些例子24.1 函数的概念o 函数的例子:ndouble myAVG = avg ( 1.0,4.0);o函数的作用:代码重用、使程序的结构更加清晰n一般来说,任何有实际应用价值的代码都由多个函数构成o函数可以有参数和返回值n在C++中,即使没有参数,括号仍然不能省略o函数的两种类型nC++标准库函数n自定义函数3插曲:再论结构化o结构化程序设计方法的思想:自顶向下,逐自顶向下,逐步细化基本结构,组合而成清晰第一,步细化基本结构,组合而成清晰第一,效率第二书写规范,缩进格式效率第二书写规范,缩进格式o一个简单的例子:求a,b,c三个数中的最大值4举例o找出三个数中最大数输入三个数a,b,c找出a,b,c中最大数max输出最大数max找出a,b中最大数max找出max,c中最大数5输出最大数max把它们组合起来,就得到完整解用函数可以更好地解决用函数可以更好地解决6无参数函数类型 函数名( ){ 函数体}例: int getint( ) { int c; cin>>c; return c; }7有参数函数类型 函数名(参数表) { 函数体 }例:int max(int x, int y) { int z; z=x>y?x:y; return z; //返回值 } 类型函数名形参表函数体两者类型要求一致8基本规则o调用一个函数前,必须完整地声明它的类型调用一个函数前,必须完整地声明它的类型信息信息o“类型”信息是什么?o对C++库函数而言,使用#include进行声明o对自定义函数而言,在使用前进行显式地声明n如何声明?n在程序代码的什么位置进行声明?94.2 函数调用过程 C++程序执行从main( )开始,调用其它函数后回到main( )。
在main中结束整个程序 int main(){ double a=1.2; double b=2.7; cout << avg(a,b); return 0;}double avg(double a,double b){ double v = (a+b) /2; return v;}1234104.3 函数的使用o在程序开头,以原型形式声明声明函数o在程序的某个地方定义定义函数o在程序任何其他地方调用调用函数,函数可以不限次地调用o必须既声明又定义吗?不能将其合并进行吗?n——可以,但这不是最好的做法114.3.1 声明函数o声明函数的语法结构ntype function_name(argument_list);ntype: 一种已知的数据类型nfunction_name:函数名nargument_list:参数列表(多个参数用逗号隔开)ndouble avg(double x, double y);n注意:函数声明是一个语句,因此在末尾有分号”;”ndouble avg(double x, y);正确吗?ndouble avg(double, double);正确吗?124.3.2 定义函数o形式上与声明类似,但需将;改为{ }o含义上定义是描述了函数所要实现的功能n插曲:“声明”的含义是什么?odouble avg(double x,double y){ return (x+y) /2 ; }o如果函数类型为void,则可以一个不带参数的return语句进行返回,也可以不写return语句n不写return会怎样呢?n那么为什么还要写return?134.3.3 调用函数o声明、定义完成的函数可被多次调用o函数调用相当于一个表达式(当类型不是void时),可以在任何表达式能够出现的场合出现n合理的例子:z= x+y+avg(a,b)+25.3;n极端的例子:无谓的调用 avg(a,b);o在使用函数进行赋值时应注意类型的一致——需要时进行强制类型转换o在编译时会进行参数类型检查144.4 示例:triangle函数o功能:计算1+2+…+no函数声明:nint triangle(int num);o函数定义:nint triangle(int n){ int i; int sum = 0; for(i=1;i<=n;i++)sum = sum +i; return sum; }可以不同15调用情况o一定要triangle(n)吗?能否将main中的变量声明为m?o直接调用triangle(4)可以吗?o形式参数和实际参数int main( ){ int n1; cout <<“Enter a number and Press ENTER”; cin >> n1; cout <<“Function returned”< 174.5 质数函数o把检验一个数是否为质数的功能抽取到一个函数中o在主函数main中无限地循环调用该函数,直到用户发出停止测试的指令o程序代码见P68o练习:写一个程序来查找大于10亿的第一个质数184.6 局部变量和全局变量o局部变量:n在函数内部定义的变量称为局部变量,它只在本函数内有效也就是说只有在本函数内才能使用它们,在此函数外是不能使用这些变量的n不同的函数中的局部变量可以同名,但它们之间没有任何关系n形式参数也是局部变量n在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效19全局变量o在函数之外定义的变量称为全局变量全局变量可以为本文件中其它函数所共用它的有效范围为从定义变量的位置开始到本源文件结束o在某全局变量声明之前的函数不能访问该全局变量o若在同一源文件中,全局变量与局部同名,则在局部变量的作用范围内,全局变量被“屏蔽”,即它不起作用20int func( );int n=5; //n为全局变量void main( ){ int x; cout< 但是,一个函数能调用它自己吗?o是的,在函数体内直接或间接地调用函数本身的函数被称为递归函数otriangle的递归表示int triangle(int n){ if(n<=1) return 1; else return n+triangle(n-1);}22另一个简单的例子:factorialo1!=1o2!=1*2=1!*2o3!=1*2*3=2!*3o4!=1*2*3*4=3!*4o......on!=1*2*3*......*(n-1)*n=(n-1)!*n23函数(假设n=3)的执行过程 long fact(int n) { long c; if(n==1||n==0) c=1; else c=fact(n-1)*n; return c;} long fact(int n) { long c; if(n==1||n==0) c=1; else c=fact(n-1)*n; return c;}24递归的条件o有终止递归调用的语句。 o要有递归调用的语句o一般一般 先判断是否到达终止条件,后递归调用254.9 示例:素因子分解o目的:在发现一个自然数不是质数的时候,能够将其素因子素因子打印出来o素因子:能够整除该自然数的那些质数o例如:n输入36,打印出2,2,3,3n输入99,打印出3,3,11n输入质数时,直接打印出该数,如1726(1)思路o设输入的数为n,计数变量为ioi从2开始判断n是否能被i整除,如果能,则i是n的素因子,将i打印出来n在这个问题中,第一个整除n的数一定是质数吗?o将n的值改写为n/io重复这个过程o如果n已经是质数,即找不出能整除n的i,则直接打印出n27(2)实例演算o36o打印出2on=36/2=18o打印出2on=18/2=9o打印出3o9=9/3=3o找不出素因子,即3已经是质数,打印出328(3)将步骤用C++描述void getDivisors(int n){ for(i=2;i<=n-1;i++){ if(n%i==0){ cout<< i; getDivisors(n/i); } } cout<












