大学C程序设计方案教程ppt课件_第1页
大学C程序设计方案教程ppt课件_第2页
大学C程序设计方案教程ppt课件_第3页
大学C程序设计方案教程ppt课件_第4页
大学C程序设计方案教程ppt课件_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大学大学C+程序设计教程程序设计教程西安交通大学西安交通大学计算机教学实验中心计算机教学实验中心 第第8章章 函数和指针函数和指针C+言语的模块设计离不开函数,函数设计更离言语的模块设计离不开函数,函数设计更离不开参数。不开参数。掌握函数设计和调用的正确方法,是程序设计掌握函数设计和调用的正确方法,是程序设计的根本功。的根本功。正确设计函数原型和参数类型,不仅能保证函正确设计函数原型和参数类型,不仅能保证函数的正确性,而且能提高程序设计的效率。数的正确性,而且能提高程序设计的效率。引见函数调用、递归调用以及函数调用中的参引见函数调用、递归调用以及函数调用中的参数交换和

2、前往值等问题之外,还将结合软件编数交换和前往值等问题之外,还将结合软件编程技术的开展,讨论函数指针、内联函数、函程技术的开展,讨论函数指针、内联函数、函数重载等。数重载等。了解指针和函数的几种关系了解指针和函数的几种关系授课内容授课内容u8.1 递归函数递归函数u8.2 函数重载函数重载u8.3 指针和函数指针和函数u8.4 带参数的带参数的main函数函数u8.5 内联函数内联函数u8.6 不运用参数的函数不运用参数的函数u8.7 void和和const类型的指针类型的指针一、递归函数一、递归函数u函数调用,普通是一个函数调用另外函数调用,普通是一个函数调用另外一个函数。此外,函数还可以本人

3、调一个函数。此外,函数还可以本人调用本人,这种调用叫做函数的递归调用本人,这种调用叫做函数的递归调用。用。u递归调用有两种方式,一种是直接调递归调用有两种方式,一种是直接调用其本身,另一种是经过其他函数间用其本身,另一种是经过其他函数间接地调用。接地调用。u一个问题能否可以转换为递归来处置必需一个问题能否可以转换为递归来处置必需满足以下条件:满足以下条件:u1必需包含一种或多种非递归的根本方必需包含一种或多种非递归的根本方式;式;u2普通方式必需能最终转换到根本方式;普通方式必需能最终转换到根本方式;u3由根本方式来终了递归。由根本方式来终了递归。u递归调用在堆栈中暂时占据的存储区域是递归调用

4、在堆栈中暂时占据的存储区域是较多的,在实践运转时,递归调用的时间较多的,在实践运转时,递归调用的时间效率较差。效率较差。例例8-1 采用递归算法求采用递归算法求n!u算算 法:法:u由阶乘的概念可以写出其递归定义:由阶乘的概念可以写出其递归定义:u 0! = 1u n! = n*n-1!Example 8-1:用递归方法求:用递归方法求n!/ 函数函数fac:求阶乘的递归函数:求阶乘的递归函数int facint nifn1时,就需求借助另外一个针来挪时,就需求借助另外一个针来挪动。将动。将n片金片由片金片由A移到移到C上可以分解上可以分解为以下几个步骤:为以下几个步骤:u 1 将将A上的上的

5、n1片金片借助片金片借助C针针移到移到B针上针上;u 2 把把A针上剩下的一片金片由针上剩下的一片金片由A针移到针移到C针上针上;u 3 最后将剩下的最后将剩下的n1个金片借助个金片借助A针由针由B针移到针移到C针上。针上。u步骤步骤1和和3与整个义务类似,与整个义务类似,但涉及的金片只需但涉及的金片只需n1个了。这是一个了。这是一个典型递归算法。个典型递归算法。 例例8-2 梵塔梵塔hanoi塔问题塔问题#include const int N=3; /调查当金片数为调查当金片数为3个时的情个时的情况况void movechar from, char to / 函数函数move:将金片由一根

6、针移到另:将金片由一根针移到另一根针上一根针上 cout From from to to endl;void hanoiint n, int p1, int p2, int p3 ifn=1movep1, p3;elsehanoin-1, p1, p3, p2;movep1, p3;hanoin-1, p2, p1, p3;int mainhanoiN, A, B, C; return 0;二、函数重载二、函数重载u函数重载使一个函数名具有多种功能,即函数重载使一个函数名具有多种功能,即具有具有“多种形状,称这种形状为多态性。多种形状,称这种形状为多态性。u函数重载函数重载: 一组参数和前往值

7、不同的函数共一组参数和前往值不同的函数共用一个函数名。用一个函数名。u例如求绝对值函数,对应不同的参数类型,例如求绝对值函数,对应不同的参数类型,可以定义如下几个重载函数:可以定义如下几个重载函数:u int absint;u double fabsdouble;u long labs1ong;u当某个函数中调用到重载函数时,编当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进相应的函数。匹配过程按如下步骤进展:展:u1假设有严厉匹配的函数,就调用假设有严厉匹配的函数,就调用该函数;该函数;u2参数内部转换后假设匹配

8、,调用参数内部转换后假设匹配,调用该函数;该函数;u3经过用户定义的转换寻求匹配。经过用户定义的转换寻求匹配。例例8-3 重载绝对值函数重载绝对值函数#include int absint xreturn x=0?x:-x;double absdouble xreturn x=0?x:-x;long abslong xreturn x=0?x:-x;void main int x1 = 1; double x2 = 2.5; long x3 = 3L; cout |x1| = absx1 endl; cout |x2| = absx2 endl; cout |x3| = absx3 =1 &a

9、mp; n=12?monthn:month0;void main coutendl; coutmonth_name3; cout“ 15,2000;8.3.3 指向函数的指针指向函数的指针u首地址是函数的入口地址。主函数在首地址是函数的入口地址。主函数在调用子函数时,就是让程序转移到函调用子函数时,就是让程序转移到函数的入口地址开场执行。数的入口地址开场执行。u指向函数的指针:就是指针的值为该指向函数的指针:就是指针的值为该函数的入口地址。函数的入口地址。u指向函数的指针变量的阐明格式为指向函数的指针变量的阐明格式为:u *;u例如例如:uint*p;/ p为指向前为指向前往值为整型的函数的指

10、针往值为整型的函数的指针ufloat*qfloat,int;/ q为指为指向前往值为浮点型函数的指针向前往值为浮点型函数的指针例例8-5 通用数值积分函数通用数值积分函数double integraldouble a, double b, double *fundouble, int ndouble h = b-a/n;double sum = *funa+*funb/2;int i;fori=1; in; i+sum += *funa+i*h;sum *= h;return sum;/调试函数调试函数 integral 的主函的主函数数double funcdouble x return s

11、inx+x; void main double sum; sum = integral0.0, 1.0, func, 1000; coutThe Integral of sinx+x, 0, 1 is sum; 8.4 带参数的带参数的main函数函数u函数原型为:函数原型为:uint mainint argc, char *argv u第一个整型参数指明在以命令行方式执行第一个整型参数指明在以命令行方式执行本程序时所带的参数个数包括程序名本本程序时所带的参数个数包括程序名本身,故身,故argc的值至少为的值至少为1;u第二个参数为一个字符型指针数组其中第二个参数为一个字符型指针数组其中第第1

12、个下标变量个下标变量argv0指向本程序名,接下指向本程序名,接下来的下标变量来的下标变量argv1,argv2.等分别指向等分别指向命令行传送给程序的各个参数,用来存命令行传送给程序的各个参数,用来存放命令行中命令字及各个参数的字符串。放命令行中命令字及各个参数的字符串。例例8-6 带参数的带参数的main函数函数#includeint mainint a, char *ar ifa!=2coutError!endl;coutUsage: ProgramName endl;return 1;coutHello, ar1. Welcome to the world of C+ !endl;re

13、turn 0;自学内容自学内容u8.5 内联函数内联函数 u8.6 不运用参数的函数不运用参数的函数 u8.7 void和和const类型的指针类型的指针 8.5 内联函数内联函数u内联函数机制经过将函数体的代码直内联函数机制经过将函数体的代码直接插入到函数调用途来节省调用函数接插入到函数调用途来节省调用函数的时间开销,的时间开销,u内联函数实践上是一种用空间换时间内联函数实践上是一种用空间换时间的方案,其目的是为了提高函数的执的方案,其目的是为了提高函数的执行效率。行效率。u要定义一个内联函数,只需在定义函要定义一个内联函数,只需在定义函数时将该函数用关键字数时将该函数用关键字inline修

14、饰即可修饰即可8.6 不运用参数的函数不运用参数的函数 uvoid用于函数的参数表用于函数的参数表, 是明确阐明该是明确阐明该函数不运用参数函数不运用参数; uvoid阐明函数的前往值那么是阐明该阐明函数的前往值那么是阐明该函数不提供任何前往值。函数不提供任何前往值。8.7 void和和const类型的指针类型的指针 u指向指向void类型的指针是通用型的指针类型的指针是通用型的指针, 可以可以指向任何类型的变量。指向任何类型的变量。u用关键字用关键字const修饰一个指针时,根据其位修饰一个指针时,根据其位置的不同有不同的含义。例如置的不同有不同的含义。例如:uconst char *ptr

15、 = “Point to constant string; u /定义了一个指向常数字符串的指针定义了一个指向常数字符串的指针uchar *const qtr = “A constant pointer; u /定义了一个常指针。定义了一个常指针。u修饰符修饰符const多用于修饰函数的指针或援用多用于修饰函数的指针或援用参数,以防止在编程中无认识地改动其值。参数,以防止在编程中无认识地改动其值。程序设计举例程序设计举例u例例8-8 改善模拟梵塔问题的递归程序,打改善模拟梵塔问题的递归程序,打印更多的信息。印更多的信息。u例例8-9 采用递归算法寻觅一个整型数组中采用递归算法寻觅一个整型数组中

16、的最大元素。的最大元素。u例例8-10 重载上例的求最大元素的函数。重载上例的求最大元素的函数。u例例8-11 编写一个用于在字符串中查找某字编写一个用于在字符串中查找某字符的函数。符的函数。u例例8-12 编写一个用于三个整型变量排序的编写一个用于三个整型变量排序的程序。程序。实例编程-五子棋u算法 u棋局数组u数组内部相关元素的关系小小 结结递归函数是直接或间接地调用了本身的递归函数是直接或间接地调用了本身的函数。函数。每个递归函数必需包含一种或多种非递每个递归函数必需包含一种或多种非递归的根本方式,普通方式必需能最终转归的根本方式,普通方式必需能最终转换到根本方式,而根本方式可以终了递换

17、到根本方式,而根本方式可以终了递归。归。函数重载是指一组参数和前往值不同的函数重载是指一组参数和前往值不同的函数共用一个函数名,编译器会根据函函数共用一个函数名,编译器会根据函数参数的不同包括类型、个数和顺序数参数的不同包括类型、个数和顺序来确定应该调用哪一个函数。来确定应该调用哪一个函数。重载函数之间必需在参数的类型或个数重载函数之间必需在参数的类型或个数方面有所不同。只需前往值类型不同的方面有所不同。只需前往值类型不同的几个函数不能重载。几个函数不能重载。指针和函数的关系可以有以下几种:指指针和函数的关系可以有以下几种:指针作为函数的参数,指针作为函数的前针作为函数的参数,指针作为函数的前

18、往值,指向函数的指针。往值,指向函数的指针。带参数的带参数的main函数原型:函数原型:int mainint argc, char *argv习习 题题1用指针重新编写例用指针重新编写例4-5的冒泡排序程序。的冒泡排序程序。2编写程序,将某一个输入的位数不确定的正编写程序,将某一个输入的位数不确定的正整数按照规范的三位分节格式输出,例如,当整数按照规范的三位分节格式输出,例如,当用户输入用户输入82668634时,程序应该输出时,程序应该输出82,668,634。3编写程序,把编写程序,把10个整数个整数1、2、10赋予某赋予某个个int型数组,然后用型数组,然后用int型指针输出该数组元素型指针输出该数组元素的值。的值。4用指针编写一个程序,当输入一个字符串后,用指针编写一个程序,当输入一个字符串后,要求不仅可以统计其中字符的个数,还能分别要求不仅可以统计其中字符的个数,还能分别指出其中大、小写字母、数字以及其他字符的指出其中大、小写字母、数字以及其他字符的个数。个数。5编写一个函数编写一个函数, 用于将一个字符串转

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论