第3章函数 主教材要点导读 本章的主要目标是学会将一段功能相对独立的程序写成一个函数,为第4章学习类和 对象打好必要的基础。掌握函数定义和调用的语法形式并不难,但是要有效地应用函数,必 须对函数调用的执行过程和参数的传递有深刻的认识,这也正是初学时的难点。 要很好地理解函数的调用和参数传递,尤其是嵌套调用和递归调用的执行过程,比较有 效的方法是利用编译器的调试功能,跟踪函数调用的执行过程、观察参数和变量的值,实验 3会引导你进行跟踪和观察。 利用引用传递参数,是函数间数据共享的一个重要方法,但是一部分读者对引用类型的 理解会有困难,其实只要简单地将引用理解为一个别名就可以了。 在介绍函数的同时,本章也介绍了一些有用的算法。例3-6介绍了产生随机数序列的 方法,例3-8、例3-9、例3-10 介绍了递归算法。本章的例题程序与第2章相比显然复杂了一 些,需要仔细阅读并上机调试才能完全理解。对于较复杂的程序,书中都以注释的形式给出 了详细说明,读者在阅读程序时务必认真阅读注释文字。递归算法是一种非常简洁高效的 算法,用途很广泛,但理解起来有一定的难度,自己编写递归程序更不是件容易的事。作为 初学者,对此不必着急。学习是一个循序渐进的过程,本章介绍递归算法主要是为了说明 C++语言允许函数的递归调用,如果要完全理解和熟练编写递归程序,还需要学习“数据结 构”课程,一般数据结构方面的书中都会详细介绍递归算法及其应用。当然,喜欢钻研的读 者不妨准备一张大纸,在利用调试功能跟踪递归程序的执行过程时,记录下递归过程中各个 变量的值,会有助于对递归算法的理解。 实验 3 函数的应用(2学时) 一、实验目的 (1)掌握函数的定义和调用方法。 (2)练习重载函数的使用。 (3)练习使用系统函数。 (4)学习使用VisualStudio2019 以及Eclipse的Debug调试功能,使用StepInto追踪 到函数内部。 二、实验任务 (1)编写一个函数把华氏温度转换为摄氏温度,转换公式为:C=(F-32)*5/9。 (2)编写重载函数max1可分别求取两个整数、三个整数、两个双精度数、三个双精度 ·37· 数的最大值。 (3)使用系统函数pow(x,y)计算xy 的值,注意包含头文件math.h。 (4)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 三、实验步骤 (1)编写函数floatConvert(floatTempFer),参数和返回值都为float类型,实现算法 C=(F-32)*5/9,在main()函数中实现输入、输出。程序名:lab3_1.cpp。 (2)分别编写4个同名函数max1,实现函数重载,在main()函数中测试函数功能。程 序名:lab3_2.cpp。 (3)在main()函数中提示输入两个整数x、y,使用cin 语句得到x、y的值,调用 pow(x,y)函数计算x的y次幂的结果,再显示出来。程序名:lab3_4.cpp。 (4)编写递归函数intfib(intn),在主程序中输入n的值,调用fib函数计算Fibonacci 级数。公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib(1)=fib(2)=1;使用if语句判断函 数的出口,在程序中用cout语句输出提示信息。程序名:lab3_5.cpp。 (5)使用Debug中的StepInto追踪到函数内部,观察函数的调用过程,参考程序如下: //lab3_5 #include using namespace std; int fib(int n); int main() { int n, answer; cout<<"Enter number: "; cin>>n; cout<<"\n\n"; answer=fib(n); cout< using namespace std; int main() { int intOne; int &rSomeRef=intOne; intOne=5; cout<<"intOne: \t"< using namespace std; typedef unsigned short int USHORT; short int divide(USHORT a, USHORT b) { if (b==0) return -1; else return a/b; } int main() { USHORT one, two; short int answer; cout<<"Enter two numbers.\n Number one: "; cin>>one; cout<<"Number two: "; ·41· cin>>two; answer=divide(one, two); if (answer >-1) cout<<"Answer: "< #include using namespace std; int prime(int i); //判断一个数是不是质数的函数 int main() { int i; cout<<"请输入一个整数: "; cin>>i; if (prime(i)) cout< #include using namespace std; int fn1(int i,int j); //求最大公约数的函数 int main() { int i,j,x,y; cout<<"请输入一个正整数: "; cin>>i ; cout<<"请输入另一个正整数: "; cin>>j ; x=fn1(i,j); y=i*j / x; cout< #include using namespace std; int fn1(int i); int main() { int i; cout<<"请输入一个正整数: "; cin>>i; cout<<"从1 累加到" <2), F1=F2=1 观察递归调用的过程。 解:源程序见实验3部分。 3-14 用递归的方法编写函数求n 阶勒让德多项式的值,在主程序中实现输入输出;递 归公式为: pn(x)= 1 (n=0) x (n=1) ((2n-1)×x×pn-1(x)-(n-1)×pn-2(x))/n (n>1) ì . í .. .. 解: #include using namespace std; float p(int n, int x); int main() { int n,x; cout<<"请输入正整数n: "; cin>>n; cout<<"请输入正整数x: "; cin>>x; cout<<"n="<>iNumber; cout<<"Enter a double base number: "; ·46· cin>>dNumber; cout<<"To what power? "; cin>>power; iAnswer=getPower(iNumber,power); dAnswer=getPower(dNumber,power); cout<