当前课程知识点:C++语言程序设计基础 > 第3章 函数 > 实验三(下)函数的应用 > 实验三(下)函数的应用
大家好
欢迎来到实验3的下半部分
本章的主要目标
是将一段功能独立的程序
写成函数
为今后的对象
和类的学习
打下一个良好的基础
本部分的实验内容
是通过练习
请大家进一步地理解和掌握
重载函数的使用
系统函数的使用
以及进一步熟悉step into
来跟踪程序的方法
在实验3我们介绍了
step into功能
利用它可以跟踪到函数的内部
再配合run to coursor
也就是运行到光标处
这样的功能
可以帮助我们进一步地理解
函数的执行过程和参数的传递
本章还给大家介绍了重载函数
为了方便使用
C++允许在同一范围内
定义几个功能接近
而名字相同的函数
不过这些同名的函数
它的形式参数必须不同
它经常被用来处理功能接近
但是数据类型不同的问题
也是多态性的一种体现
在接下来的第一个例子里
我们将来体会
和熟悉一下重载函数
除了自己编写函数
复用他人的函数
在C++中
还有大量现成好用的系统函数
如果弃之不用
而是一行一行的自己重头写
无异于重新发明文字
本部分的第二个例子
就是一个
使用系统函数的简单应用
首先我们来看例题一
分别编写四个同名函数
函数名叫max1
实现函数的重载
这四个函数
可以分别来求取
两个整数的最大值
三个整数的最大值
两个双精度数的最大值
和三个双精度数的最大值
最后要求在main函数中来测试
上述四个重名函数的函数功能
我们来看一下
我们已经准备好的代码
我们在这里有四个函数
那么它们的函数名字
是相同的
都是max1
那来看第一个重载形式
有两个形式参数
均为int
返回值也是int
它是用来计算
两个整数最大值的函数的函数体
那么我们再来看一下
三个整数最大值
如何去求取呢
我们可以看到
这个语句非常简捷
我们使用了一条return语句
就把这个函数的功能完成了
这是因为我们在这里
复用了一下
刚才有两个int参数的
这个max的重载形式
那么它的意思就是
先把x和y的最大值求出来
然后再把x y中最大的那一个
和z进行比较
然后再把它们比出来的最大值
作为函数值进行返回
所以我们在这里可以看到
刚才的这个有两个int形参
这个max1重载形式呢
在这里成了一个被调用的函数
而主要函数就成了
有三个int类型
形参的这个max1重载形式
那么到了main函数中呢
我们又会把main函数
作为主调函数
然后把具有三个int类型
形参的max1的重载形式
作为被调函数
所以同样一个函数
它有的时候是作为主调函数
有的时候会作为被调函数
是依情况而定的
那么在这里呢
需要给大家提到的一点就是
如果我们想去比较两个
双精度浮点数大小的时候
或者是一般浮点数大小的时候呢
因为它的1.4节中
讲到它的存储形式
所以你不能简单地
用x是否等于y这种方式来判断
而应该用x-y的绝对值
小于某一个
你可以容忍的精度来判断
这两个双精度数是是否相等
那么实现了这两个双精度数
最大值的这样一个
函数的重载形式呢
那么
我们去实现三个双精度数的
最大值的函数重载形式
就非常简单了
我们在这里看到
我们刚才用到的abs这个函数
它的作用呢
它是系统自带的一个标准库函数
是用来求某一个数
它的绝对值的
那么它求绝对值是放在数学函数
这个库里面
所以如果我们要使用它呢
先要在最前面的include
编译预处理指令中
把cmath包含进来
那么刚才我们看完了
四个不同重载形式的
函数体的声明和实现
那我们再来看一下
用main函数怎么去测试
和调用它们的这个功能
显然我们需要有
至少三个整数
和至少三个双精度浮点数
才能完成上述的测试
首先提示用户输入三个整数
a b和c的值
接下来呢
就去调用一下
求两个整数最大值的重载形式
接着再去调用
求三个整数最大值的函数
那同样地
我们去调用带有两个
双精度数参数的这样一个
求最大值的函数
和求三个双精度数最大值的
这样一个重载形式的函数
那接下来我们还是通过
我们刚才讲的逐语句的跟踪
来跟踪一下函数的调用
那么一开始呢
它是停留在
这个main函数的第一行的
也就是这里的第21行
我们可以看到
在这里呢
我们有int类型的a b c
尚未初始化
还有double类型的m n和l
也尚未初始化
我们把光标设置在这里
也就是在
读入了a b c三个整数之后
来计算一下a和b的最大值
我们来输a b c
今天是2015年的3月23日
那么这个时候我们可以看到
程序停在这里
a b c的值被初始化了
通过键盘初始化为2015 3
和23
接下来我们就应该调用
求两个整数最大值的
这样一个重载形式
那么我们用f11来跟踪一下
我们在调用栈里头可以看到
这个时候呢
调用max1这样一个重载形式
两个int类型的这样的形参
那这个时候呢
因为是要比较a和b的大小
那么a和b刚才分别是2015和3
那么进行了形实结合
之后
这个局部变量x和y的值呢
就变成了2015和3
通过这个调用栈可以看到
我们现在运行到了
光标所处的位置
回到了main函数刚才调用的地方
这个时候呢
调用返回来一个临时无名的整型
它的值呢
刚好就是a和b最大值2015
我们再来看一下
这个时候就打印输出了
2015和3的最大值
求出来是2015
接下来
大家还可以用类似的方式
去跟踪一下
求三个整数最大值的情形
后面会请求用户
进行浮点数的输入
并且把它们的最大值求出来
进行输出
我们在这里呢
就不一一跟踪了
大家回去可以试一下
独立地去跟踪一下这个过程
去体会一下主调函数
被调函数
还有返回的整个过程
接下来我们来看例题二
在main函数中提示输入两个整数
x和y
使用cin语句得到x和y的值
然后调用pow函数
来计算x的y次幂的结果
再显示出来
需要注意的是
我们尽管可以自己编写一个程序
来把y个x累次相乘
然后来计算x的y次幂
但是
因为在我们的标准系统库函数
cmath库中
包含这样一个pow函数
可以直接来计算求得x的y次幂
所以我们这个例子呢
主要是要来展示一下
如果使用系统函数
来完成这样的功能
我们来看一下
已经准备好的例子程序
在这里有两个int类型的变量
分别是x和y
然后提示用户进行x y值的输入
通过cin把x和y的键盘输入读入
接下来打印输出一下
x的值和y的值
然后再调用一下
cmath中的pow这个函数
就完成了x的y次幂计算结果
大家看一看
利用了这个系统函数
我们整个功能的实现
是不是非常非常的简便呢
在这里求x的y次幂
虽然也可以自己写函数来实现
但是调用系统函数的好处
不仅仅是方便快捷
还有一个好处是既安全
又稳定
所以只要是系统函数
已经提供了的功能
就希望大家尽量充分地利用它
而不要再去做
重新发明文字的这样的事情
由于pow这个函数
是在cmath库中预先定义好的
所以如果你要去使用它的话
一定要在
记得在最开始的位置
用编译预处理指令include
来把它包含进来
这样我们的编译器
才能够知道pow这个函数
从而而来
它的定义是什么
它的函数体是什么
具体实现怎样的功能
接下来
我们用step into跟踪一下
看看怎么样
执行调用到系统库中去的
还是通过f1
那这个时候呢
我们的光标
停在了main函数的第1行
在调用栈显示行数是第12
这里
那我们在这里声明了两个
int类型的变量x y
都没有进行初始化
我们把光标设置在这个
调用pow函数的位置
那我们比如说想
求x是9
9的3次方 那y就是3
我们在这里打印输出了
刚才读入的x和y的值
分别是9和3
接下来就进行了函数的调用
我们用f11
来跟踪到pow函数的内部
可以看到
它已经跳转到了
另外一个头文件中去
这是我们系统库函数
自带的头文件
那么它会停在pow函数的
这样的第一行的位置
然后进入这个函数的调用
当调用结束之后呢
它又会退回到
main函数的第25行
也就是
调用pow函数的这个地方
同时呢
pow这个函数调用返回的结果
会以一个
临时无名变量的形式返回
结果是729
而且是double类型的
然后会把729输出
那么这个例子很简单
我们的例子就到这里
那大家回去以后呢
可以做一个扩展练习
就是试着用一下
系统函数中的三角函数
来做一下各种不同
三角函数计算的练习
记住一定要用
include编译预处理指令
把cmath这个库包含进去
在实验3的下半部分
我们通过例子
进一步熟悉了重载函数
和系统函数
并利用step into功能
跟踪到函数调用的内部
也理解函数的执行过程
和参数传递
重载函数的一个主要好处是
功能相似的多个函数
共用同一个名字
这样我们在调用的时候
只要根据参数表的不同
就能自动地调用
对应的重载形式
不用记录多个不同的名字了
关于重载函数
一定要注意
重载函数的参数个数
和类型一定要不同
即要么参数的类型不同
要么参数的个数不同
要么参数的类型和个数
都不同
否则编译器就不知道
该调用哪一个重载函数了
了解并且利用好系统函数
可以使得我们获得
事半功倍的好处
在使用时
记得要用include指令
把系统函数所属的库包含进来
实验3的下半部分就到这里
我们下次再见
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)