《大学C程序设计方案教程.ppt》由会员分享,可在线阅读,更多相关《大学C程序设计方案教程.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、大学C程序设计方案教程 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望第第8章章 函数和指针函数和指针C+语言的模块设计离不开函数,函数设计更离语言的模块设计离不开函数,函数设计更离不开参数。不开参数。掌握函数设计和调用的正确方法,是程序设计掌握函数设计和调用的正确方法,是程序设计的基本功。的基本功。正确设计函数原型和参数类型,不仅能保证函正确设计函数原型和参数类型,不仅能保证函数的正确性,而且能提高程序设计的效率。数的正确性,而且能提高程序设计的效率。介绍函数调
2、用、递归调用以及函数调用中的参介绍函数调用、递归调用以及函数调用中的参数替换和返回值等问题之外,还将结合软件编数替换和返回值等问题之外,还将结合软件编程技术的发展,讨论函数指针、内联函数、函程技术的发展,讨论函数指针、内联函数、函数重载等。数重载等。理解指针和函数的几种关系理解指针和函数的几种关系1/33授课内容授课内容u8.1 递归函数递归函数u8.2 函数重载函数重载u8.3 指针和函数指针和函数u8.4 带参数的带参数的main()函数函数u8.5 内联函数内联函数u8.6 不使用参数的函数不使用参数的函数u8.7 void和和const类型的指针类型的指针2/33一、递归函数一、递归函
3、数u函数调用,一般是一个函数调用另外函数调用,一般是一个函数调用另外一个函数。此外,函数还可以自己调一个函数。此外,函数还可以自己调用自己,这种调用叫做函数的递归调用自己,这种调用叫做函数的递归调用。用。u递归调用有两种方式,一种是直接调递归调用有两种方式,一种是直接调用其本身,另一种是通过其他函数间用其本身,另一种是通过其他函数间接地调用。接地调用。3/33u一个问题是否可以转换为递归来处理必须满一个问题是否可以转换为递归来处理必须满足以下条件:足以下条件:(1)必须包含一种或多种非递归的基本形式;)必须包含一种或多种非递归的基本形式;(2)一般形式必须能最终转换到基本形式;)一般形式必须能
4、最终转换到基本形式;(3)由基本形式来结束递归。)由基本形式来结束递归。u递归调用在堆栈中临时占据的存储区域是较递归调用在堆栈中临时占据的存储区域是较多的,在实际运行时,递归调用的时间效率多的,在实际运行时,递归调用的时间效率较差。较差。4/33例例8-1 采用递归算法求采用递归算法求n!u算算 法:法:u由阶乘的概念可以写出其递归定义:由阶乘的概念可以写出其递归定义:u 0!=1u n!=n*(n-1)!5/33Example 8-1:用递归方法求:用递归方法求n!/函数函数fac():求阶乘的递归函数:求阶乘的递归函数int fac(int n)if(n1时,就需要借助另外一个针来移动。将
5、时,就需要借助另外一个针来移动。将n片金片由片金片由A移到移到C上可以分解为以下几个步骤:上可以分解为以下几个步骤:(1)将将A上的上的n 1片金片借助片金片借助C针移到针移到B针上针上;(2)把把A针上剩下的一片金片由针上剩下的一片金片由A针移到针移到C针上针上;(3)最后将剩下的最后将剩下的n 1个金片借助个金片借助A针由针由B针针移到移到C针上。针上。步骤步骤(1)和和(3)与整个任务类似,但涉及的金片与整个任务类似,但涉及的金片只有只有n 1个了。这是一个典型递归算法。个了。这是一个典型递归算法。7/338/33例例8-2 梵塔梵塔(hanoi塔塔)问题问题#include const
6、 int N=3;/考察当金片数为考察当金片数为3个时的情个时的情况况void move(char from,char to)/函数函数move():将金片由一根针移到另一:将金片由一根针移到另一根针上根针上 cout From from to to endl;9/33void hanoi(int n,int p1,int p2,int p3)if(n=1)move(p1,p3);elsehanoi(n-1,p1,p3,p2);move(p1,p3);hanoi(n-1,p2,p1,p3);int main()hanoi(N,A,B,C);return 0;10/33二、函数重载二、函数重载u
7、函数重载使一个函数名具有多种功能,即具函数重载使一个函数名具有多种功能,即具有有“多种形态多种形态”,称这种形态为多态性。,称这种形态为多态性。u函数重载函数重载:一组参数和返回值不同的函数共一组参数和返回值不同的函数共用一个函数名。用一个函数名。u例如求绝对值函数,对应不同的参数类型,例如求绝对值函数,对应不同的参数类型,可以定义如下几个重载函数:可以定义如下几个重载函数:int abs(int);double fabs(double);long labs(1ong);11/33u当某个函数中调用到重载函数时,编当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用译器会根据实参的
8、类型去对应地调用相应的函数。匹配过程按如下步骤进相应的函数。匹配过程按如下步骤进行:行:(1)如果有严格匹配的函数,就调用该)如果有严格匹配的函数,就调用该函数;函数;(2)参数内部转换后如果匹配,调用该)参数内部转换后如果匹配,调用该函数;函数;(3)通过用户定义的转换寻求匹配。)通过用户定义的转换寻求匹配。12/33例例8-3 重载绝对值函数重载绝对值函数#include int abs(int x)return x=0?x:-x;double abs(double x)return x=0?x:-x;long abs(long x)return x=0?x:-x;void main()i
9、nt x1=1;double x2=2.5;long x3=3L;cout|x1|=abs(x1)endl;cout|x2|=abs(x2)endl;cout|x3|=abs(x3)=1&n=12)?monthn:month0;void main()coutendl;coutmonth_name(3);cout“15,2000”;17/338.3.3 指向函数的指针指向函数的指针u首地址是函数的入口地址。主函数在首地址是函数的入口地址。主函数在调用子函数时,就是让程序转移到函调用子函数时,就是让程序转移到函数的入口地址开始执行。数的入口地址开始执行。u指向函数的指针:就是指针的值为该指向函数的
10、指针:就是指针的值为该函数的入口地址。函数的入口地址。18/33u指向函数的指针变量的说明格式为指向函数的指针变量的说明格式为:(*)();u例如例如:int(*p)();/p为指向返回值为整为指向返回值为整型的函数的指针型的函数的指针float(*q)(float,int);/q为指向返回值为浮为指向返回值为浮点型函数的指针点型函数的指针19/33例例8-5 通用数值积分函数通用数值积分函数double integral(double a,double b,double(*fun)(double),int n)double h =(b-a)/n;double sum=(*fun)(a)+(*
11、fun)(b)/2;int i;for(i=1;in;i+)sum+=(*fun)(a+i*h);sum*=h;return sum;/20/33调试函数调试函数 integral()的主函数的主函数double func(double x)return sin(x)+x;void main()double sum;sum=integral(0.0,1.0,func,1000);cout(The Integral of sin(x)+x,0,1 is”sum;21/338.4 带参数的带参数的main()函数函数u函数原型为:函数原型为:uint main(int argc,char*argv
12、)第一个整型参数指明在以命令行方式执行本程第一个整型参数指明在以命令行方式执行本程序时所带的参数个数(包括程序名本身,故序时所带的参数个数(包括程序名本身,故argc的值至少为的值至少为1););第二个参数为一个字符型指针数组(其中第第二个参数为一个字符型指针数组(其中第1个个下标变量下标变量argv0指向本程序名,接下来的下标指向本程序名,接下来的下标变量变量argv1,argv2.等分别指向命令行传递等分别指向命令行传递给程序的各个参数),用来存放命令行中命令给程序的各个参数),用来存放命令行中命令字及各个参数的字符串。字及各个参数的字符串。22/33例例8-6 带参数的带参数的main函
13、数函数#includeint main(int a,char*ar)if(a!=2)coutError!endl;coutUsage:ProgramName endl;return 1;coutHello,ar1.Welcome to the world of C+!endl;return 0;23/33自学内容自学内容u8.5 内联函数内联函数 u8.6 不使用参数的函数不使用参数的函数 u8.7 void和和const类型的指针类型的指针 24/338.5 内联函数内联函数u内联函数机制通过将函数体的代码直内联函数机制通过将函数体的代码直接插入到函数调用处来节省调用函数接插入到函数调用处来
14、节省调用函数的时间开销,的时间开销,u内联函数实际上是一种用空间换时间内联函数实际上是一种用空间换时间的方案,其目的是为了提高函数的执的方案,其目的是为了提高函数的执行效率。行效率。u要定义一个内联函数,只需在定义函要定义一个内联函数,只需在定义函数时将该函数用关键字数时将该函数用关键字inline修饰即可修饰即可25/338.6 不使用参数的函数不使用参数的函数 uvoid用于函数的参数表用于函数的参数表,是明确说明该是明确说明该函数不使用参数函数不使用参数;uvoid说明函数的返回值则是说明该函说明函数的返回值则是说明该函数不提供任何返回值。数不提供任何返回值。26/338.7 void和
15、和const类型的指针类型的指针 u指向指向void类型的指针是通用型的指针类型的指针是通用型的指针,可以可以指向任何类型的变量。指向任何类型的变量。u用关键字用关键字const修饰一个指针时,根据其位修饰一个指针时,根据其位置的不同有不同的含义。例如置的不同有不同的含义。例如:uconst char*ptr=“Point to constant string”;u /定义了一个指向常数字符串的指针定义了一个指向常数字符串的指针uchar*const qtr=“A constant pointer”;u/定义了一个常指针。定义了一个常指针。u修饰符修饰符const多用于修饰函数的指针或引用多用
16、于修饰函数的指针或引用参数,以防止在编程中无意识地改变其值。参数,以防止在编程中无意识地改变其值。27/33程序设计举例程序设计举例u例例8-8 改善模拟梵塔问题的递归程序,打改善模拟梵塔问题的递归程序,打印更多的信息。印更多的信息。u例例8-9 采用递归算法寻找一个整型数组中采用递归算法寻找一个整型数组中的最大元素。的最大元素。u例例8-10 重载上例的求最大元素的函数。重载上例的求最大元素的函数。u例例8-11 编写一个用于在字符串中查找某字编写一个用于在字符串中查找某字符的函数。符的函数。u例例8-12 编写一个用于三个整型变量排序编写一个用于三个整型变量排序的程序。的程序。28/33实
17、例编程-五子棋五子棋u算法 u棋局棋局数组数组u数组内部相干元素的关系数组内部相干元素的关系29/33小小 结结递归函数是直接或间接地调用了自身的递归函数是直接或间接地调用了自身的函数。函数。每个递归函数必须包含一种或多种非递每个递归函数必须包含一种或多种非递归的基本形式,一般形式必须能最终转归的基本形式,一般形式必须能最终转换到基本形式,而基本形式可以结束递换到基本形式,而基本形式可以结束递归。归。函数重载是指一组参数和返回值不同的函数重载是指一组参数和返回值不同的函数共用一个函数名,编译器会根据函函数共用一个函数名,编译器会根据函数参数的不同(包括类型、个数和顺序)数参数的不同(包括类型、
18、个数和顺序)来确定应该调用哪一个函数。来确定应该调用哪一个函数。30/33重载函数之间必须在参数的类型或个数重载函数之间必须在参数的类型或个数方面有所不同。只有返回值类型不同的方面有所不同。只有返回值类型不同的几个函数不能重载。几个函数不能重载。指针和函数的关系可以有以下几种:指指针和函数的关系可以有以下几种:指针作为函数的参数,指针作为函数的返针作为函数的参数,指针作为函数的返回值,指向函数的指针。回值,指向函数的指针。带参数的带参数的main()函数原型:函数原型:int main(int argc,char*argv)31/33习习 题题1用指针重新编写例用指针重新编写例4-5的冒泡排序
19、程序。的冒泡排序程序。2编写程序,将某一个输入的位数不确定的正编写程序,将某一个输入的位数不确定的正整数按照标准的三位分节格式输出,例如,当整数按照标准的三位分节格式输出,例如,当用户输入用户输入82668634时,程序应该输出时,程序应该输出82,668,634。3编写程序,把编写程序,把10个整数个整数1、2、10赋予某赋予某个个int型数组,然后用型数组,然后用int型指针输出该数组元素型指针输出该数组元素的值。的值。4用指针编写一个程序,当输入一个字符串后,用指针编写一个程序,当输入一个字符串后,要求不仅能够统计其中字符的个数,还能分别要求不仅能够统计其中字符的个数,还能分别指出其中大
20、、小写字母、数字以及其他字符的指出其中大、小写字母、数字以及其他字符的个数。个数。32/335编写一个函数编写一个函数,用于将一个字符串转换为整用于将一个字符串转换为整型数值。其原型为型数值。其原型为:int atoi(char*string);其中参数其中参数string为待转换的字符串为待转换的字符串(其中包括正、其中包括正、负号和数字负号和数字),返回值为转换结果。,返回值为转换结果。6编写一个函数,用于生成一个空白字符串,编写一个函数,用于生成一个空白字符串,其原型为其原型为:char*mystrspc(char*string,int n);其中参数其中参数string为字符串为字符串,n为空白字符串的长为空白字符串的长度度(空格符的个数空格符的个数)。返回值为指向。返回值为指向string的指针。的指针。33/33