168-7-1计算机程序计-函数与指针(赵老师).ppt_第1页
168-7-1计算机程序计-函数与指针(赵老师).ppt_第2页
168-7-1计算机程序计-函数与指针(赵老师).ppt_第3页
168-7-1计算机程序计-函数与指针(赵老师).ppt_第4页
168-7-1计算机程序计-函数与指针(赵老师).ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

0 计算机程序设计 C 第7章函数与指针 西安交通大学计算机教学实验中心 1 教学目标 掌握递归函数的使用掌握函数重载掌握函数指针的使用熟悉带参数的main函数了解内联函数 2 教学内容 7 1递归函数7 2函数重载7 3指针和函数7 4带参数的main 函数7 5内联函数7 6无参函数7 7void和const类型的指针 3 7 1递归函数 在数学上 有一些递推计算问题 如求n n 0 时 n 1 n n n 1 f 0 1 f n n f n 1 算法 1 输入n 用f表示计算结果 2 如果n 0 f 1表示出错 3 如果n 0 f 1 否则f n f n 1 4 最后f为计算结果 4 求n 的函数 intfac intn intf if n 0 return 1 if n 0 return1 else f n fac n 1 returnf 5 7 1递归函数 1 递归调用一个函数自己调用自己 这种调用称为递归调用 2 递归调用的方式 1 直接调用其本身 2 通过其他函数间接地调用 A调用B B调用A3 一个问题是否可以转换为递归来处理必须满足以下条件 1 具有递推公式或递推关系 2 必须包含一种或多种非递归的基本形式 由基本形式来结束递归 6 求斐波那契序列的第n项 递推公式 f 0 0 f 1 1f n f n 1 f n 2 算法 1 输入n 2 如果n 0 返回 1表示错误 3 如果n 0 f 0 0 如果n 1 f 1 1 否则 f k f k 1 f k 2 k 2 3 n 4 输出f n 7 程序 intfibonacci intn if n1 returnfibonacci n 1 fibonacci n 2 8 猴子吃桃问题 例 求解猴子吃桃问题 猴子在第一天摘下若干个桃子 当即就吃了一半 又感觉不过瘾 于是就多吃了一个 以后每天如此 到第10天时 就只剩下了一个桃子 请编程计算第一天猴子摘的桃子个数 递推公式1n 10f n 2 f n 1 1 1 n 10 9 猴子吃桃问题的函数 intpeach intn if n 10 return1 elsereturn2 peach n 1 1 10 includeusingnamespacestd intpeach intn intmain cout0 i cout peach i cout endl return0 11 例7 9 采用递归算法寻找一个整型数组中的最大元素 方法 ifx0 f x n 1 max x0elsemax f x n 1 算法求a n 中的最大数 下标从0到n 1 1 如果n 1 则最大数即a 0 2 否则 设max是a 1 a n 1 中的最大数 若a 0 max则a 0 最大 否则max最大 3 使用类似 1 2 的方法求a 1 a n 1 中的最大数 12 采用递归算法寻找一个整型数组中的最大元素 includeusingnamespacestd intmax element constintarray intlower intupper intmaximum if lower upper returnarray lower else maximum max element array lower 1 upper if array lower maximum returnarray lower elsereturnmaximum 13 测试递归函数的主函数 intmain intA 19 33 69 55 77 12 52 cout Themaximumelementofthearrayis max element A 0 6 endl return0 14 includeusingnamespacestd intf int p intn intmain intA 19 33 69 55 77 12 52 coutm2 return p elsereturnm2 15 例7 2梵塔 hanoi塔 问题 16 算法 设三根针为A B C 初始金片在A上 目标C 1 如果只有1片金片时 只要直接将金片从A针移到C针上即可 2 当n 1时 就需要借助另外一个针来移动 将n片金片由A移到C上可以分解为以下几个步骤 1 将A上的n 1片金片借助C针移到B针上 2 把A针上剩下的一片金片由A针移到C针上 3 最后将剩下的n 1个金片借助A针由B针移到C针上 步骤 1 和 3 与整个任务类似 但涉及的金片只有n 1个了 这是一个典型递归算法 17 函数 函数hanoi 将n片金片由p1借助p2移到p3上voidhanoi intn charp1 charp2 charp3 if n 1 move p1 p3 else hanoi n 1 p1 p3 p2 move p1 p3 hanoi n 1 p2 p1 p3 18 测试用主函数 includeusingnamespacestd constintN 3 考察当金片数为3个时的情况 函数move 将金片由一根针移到另一根针上voidmove charfrom charto cout From from to to endl voidhanoi intn charp1 charp2 charp3 intmain hanoi N A B C return0 19 7 2函数重载 求最大值 1 求两个整数的最大值 includeusingnamespacestd intmax1 inta intb if a b returna elsereturnb 2 求双精度数的最大值doublemax2 doublea doubleb if a b returna elsereturnb 20 求三个实数的最大值 doublemax3 doublea doubleb doublec if a b if a c returna elsereturnc else if b c returnb elsereturnc 21 求数组的最大值 求数组的最大值 非递归doublemax4 double array intN doublemax max array for inti 1 imax max array i returnmax 22 求数组的最大值 递归doublemax5 double array intN intM doublemaximum tmp if N M return array N else maximum array N tmp max array N 1 M if maximum tmp returntmp elsereturnmaximum 23 主函数 intmain doubleA 19 33 69 55 77 12 52 cout maxximunnumberof21 8is max1 21 8 endl cout maxximunnumberof2 1 8 6is max2 2 1 8 6 endl cout maxximunnumberof3 2 1 4is max3 3 2 1 4 endl cout Themaximumelementofthearrayis max5 A 0 6 endl cout Themaximumelementofthearrayis max4 A 7 endl return0 24 7 2函数重载 函数重载一组参数和返回值不同的函数共用一个函数名 函数重载使一个函数名具有多种功能 即具有 多种形态 称这种形态为多态性 当某个函数中调用到重载函数时 编译器会根据实参的类型去对应地调用相应的函数 匹配过程如下 1 如果有严格匹配的函数 就调用该函数 2 参数内部转换后如果匹配 调用该函数 3 通过用户定义的转换寻求匹配 25 重载的条件 函数在参数个数上不同或者参数类型不同仅返回值的类型不同不能重载重载函数描述的应该是相同功能 而只是数据类型不同的代码 否则会影响程序的可读性 26 例7 3重载绝对值函数 includeusingnamespacestd intabs intx returnx 0 x x doubleabs doublex returnx 0 x x longabs longx returnx 0 x x 27 重载绝对值函数的主函数 intmain intx1 1 doublex2 2 5 longx3 3L cout x1 abs x1 endl cout x2 abs x2 endl cout x3 abs x3 endl return0 28 7 3指针和函数 一 指针作为函数的参数二 返回指针的函数三 指向函数的指针 29 一 指针作为函数的参数 函数的参数不仅可以是基本数据类型的变量 对象名 数组名或函数名 而且可以是指针 通过使实参与形参指针指向共同的内存空间 达到了参数双向传递的目的 30 二 返回指针的函数 函数返回值也可以是一个地址 如变量 数组和函数的地址 指针变量的值等 在说明返回值为地址的函数时 要使用指针类型说明符 例如 char strchr char string intc char strstr char string1 char string2 31 例7 4将月份数值转换为相应的英文名称 char month name intn staticchar month Illegalmonth January February March April May June July August September October November December return n 1 32 mainfunction voidmain cout endl cout month name 4 cout 7 2011 Anothercallofthefunctionintmain char p for inti 0 i 13 i p month name i cout i t p endl return0 33 三 指向函数的指针 函数的积分定义函数fdoublef doublex 编写求积分的函数doubleintegral doublea doubleb intn doubleh b a n doublesum f a f b 2 inti for i 1 i n i sum f a i h sum h returnsum 求两个函数的积分 34 例7 5通用数值积分函数 doubleintegral doublea doubleb double fun double intn doubleh b a n doublesum fun a fun b 2 inti for i 1 i n i sum fun a i h sum h returnsum 35 待求积分的函数 doublefunc1 doublex returnsin x x doublefunc2 doublex returnx x 其他函数f x sin x a 0 b 1g x ex sin x a 0 b 2h x 3x3 2x2 1 a 0 b 3 36 Mainfunction 用于调试函数integral 的主函数 include includeusingnamespacestd voidmain doublesum sum integral 0 0 1 0 func1 1000 cout TheIntegralofsin x x 0 1 is sum endl sum integral 0 0 1 0 func2 1000 cout TheIntegralofx x 0 1 is sum endl 37 三 指向函数的指针 指向函数的指针 就是能够存放某个函数入口地址的指针变量 指向函数的指针变量的说明格式为 例如 double p double p为指向返回值为double型的函数的指针Float q float int q为指向返回值为浮点型函数的指针 38 指向函数的指针的使用方法 设函数intfac intn 已定义指向函数的指针的声明double p double 指针的赋值p fac 通过指针调用函数cout p 5 cout p 5 39 Usingoffunctionpointer intfac intn intf if n 0 return 1 if n 0 return1 else f n fac n 1 returnf voidmain int p int p fac cout p 5 endl cout p 5 endl 40 7 4带参数的main 函数 41 带参数的main 函数 voidmain intn char s intresult if n 3 cout Usingplusxy endl else result stoi s 1 stoi s 2 cout result endl plus123321 42 includeusingnamespacestd intstoi char s intf 0 inti 0 while s i 0 f f 10 s i 0 i returnf 43 7 4带参数的main 函数 函数原型为 intmain intargc char argv 第一个整型参数指明在以命令行方式执行本程序时所带的参数个数 包括程序名本身 故argc的值至少为1 第二个参数为一个字符型指针数组 其中第1个下标变量argv 0 指向本程序名 接下来的下标变量argv 1 argv 2 等分别指向命令行传递给程序的各个参数 用来存放命令行中命令字及各个参数的字符串 44 7 5内联函数 内联函数机制通过将函数体的代码直接插入到函数调用处来节省调用函数的时间开销要定义一个内联函数 只需在定义函数时将该函数用关键字inline修饰即可inlineintmax intx inty returnx y x y 自学内容 45 7 7将例5 8的函数max 改写成内联函数 Example求两数中的大数 includeusingnamespacestd inlineintmax intx inty returnx y x y intmain cout a b cout Themaximumis max a b endl return0 46 7 6无参函数 void用于函数的参数表明确说明该函数不使用参数void说明函数的返回值说明该函数不提供任何返回值例如 声明函数 voidfunc void 调用方式 func 47 7 7void和const类型的指针 1 指向void类型的指针通用型的指针 可以指向任何类型的变量 2 用关键字const修饰一个指针修饰符const多用于修饰函数的指针或引用参数 以防止在编程中无意识地改变其值根据其位置的不同有不同的含义 例如 1 constchar ptr Pointtoconstantstring 定义了一个指向常数字符串的指针 2 char constqtr Aconstantpointer 定义了一个常指针 48 程序设计举例 例7 8改善模拟梵塔问题的递归程序 打印更多的信息 例7 9采用递归算法寻找一个整型数组中的最大元素 例7 10重载上例的求最大元素的函数 例7 11编写一个用于在字符串中查找某字符的函数 例7 12编写一个用于三个整型变量排序的程序 49 例7 8 改进的梵塔问题模拟程序 includeusingnamespacestd constintN 3 函数move 将金片由一根针移到另一根针上voidmove charfrom charto staticlongno 0 局部静态变量 用于统计调用本函数的次数staticintpillar 3 N 0 0 局部静态数组 用于记录每根针上的金片数目no 移动金片的次数加1 pillar from A from针上的金片数目减1 pillar to A to针上的金片数目加1cout Step no From from to to cout A pillar 0 B pillar 1 C pillar 2 endl 50 函数hanoi 将n片金片由p1借助p2移到p3上voidhanoi intn charp1 charp2 charp3 if n 1 move p1 p3 else hanoi n 1 p1 p3 p2 move p1 p3 hanoi n 1 p2 p1 p3 51 测试用主函数 intmain cout Simulationofhanoitower endl cout Step0 A N B 0C 0 endl hanoi N A B C return0 52 例7 10 重载采用递归算法寻找数组最大元素的函数 includeusingnamespacestd intmax element constintarray intlower intupper intmaximum if lower upper returnarray lower else maximum max element array lower 1 upper if array lower maximum returnarray lower elsereturnmaximum 53 重载 采用递归算法寻找双精度型数组中的最大元素的函数doublemax element constdoublearray intlower intupper doublemaximum if lower upper returnarray lower else maximum max element array lower 1 upper if array lower maximum returnarray lower elsereturnmaximum 54 测试递归函数的主函数 intmain intA 19 33 69 55 77 12 52 doubleB 10 1 21 3 12 4 321 42 5 2 7 1 8 3 12 31 70 0 cout ThemaximumelementofthearrayAis max element A 0 6 endl cout ThemaximumelementofthearrayBis max element B 0 8 endl return0 55 例7 11 函数strchr 在字符串中查找指定字符 char strchr char string intc while string c 其他解法 调用 56 另外一种

温馨提示

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

评论

0/150

提交评论