当前课程知识点:C++语言程序设计基础 > 第3章 函数 > 函数调用 > 例3-3
例3-3
l π的计算公式如下:
l 其中arctan用如下形式的级数计算:
l 直到级数某项绝对值不大于10-15为止;π和x均为double型。
#include <iostream>
using namespace std;
double arctan(double x) {
double sqr = x * x;
double e = x;
double r = 0;
int i = 1;
while (e / i > 1e-15) {
double f = e / i;
r = (i % 4 == 1) ? r + f : r - f;
e = e * sqr;
i += 2;
}
return r;
}
int main() {
double a = 16.0 * arctan(1/5.0);
double b = 4.0 * arctan(1/239.0);
//注意:因为整数相除结果取整,如果参数写1/5,1/239,结果就都是0
cout << "PI = " << a - b << endl;
return 0;
}
大家好
欢迎继续学习C++语言程序设计
在这一节
我继续给大家介绍
函数调用的例题
这个例题呢
是让我们编写一个程序
求圆周率π的值
那么这个公式是给出来的
这是一个典型的
已经描述好了算法
给定的算法
然后让我们用程序
来实现这个算法
应该说
这是比较容易的一件事情
因为算法
已经不用我们自己设计了
只要用程序把数学中的公式
算法
转化成计算机执行的步骤
就可以了
但是对于初学者来说
看见这么有点麻烦的一个公式呢
仍然会觉得摸不到头脑
怎么办呢
还是用功能分解的方式
如果认为这个公式太复杂了
就把它分成多个部分
我们用不同的函数
来实现不同的部分
这样问题就能够逐步简化
到了最简单的地方呢
大家就会解决了
好
现在我们来看一下面这个例子
怎么来实现
先来分析一下这个公式
我们看这个公式中
给出了π的计算方法
16乘以arctan1/5
再减去4乘以arctan1/239
这里面显然地用到了arctan
当然了
系统函数里面是有
现成的arctan函数的
但是我们这个例题要求不能用
学习一下自己怎么编写程序
也实现这个arctan函数里
那么这里也给出了一个
arctan函数的公式
好 那么这里面
显然就有两件事情
放在一起了
一个是当你已知arctan函数
怎么写的情况下
如何去计算π
另一件事情就是说
arctan函数它自己的公式是什么
当然我们写程序的时候
也就可以按照功能分解的方式
把它分开两部分处理
用一个函数去实现arctan
然后呢 另外一个函数
比如说主函数
就调用这个arctan函数
来计算π的值
这就是一种自底向下
逐步求精的功能分解的方法
现在再看这个arctan函数的公式
大家看
x-x^3/3+x^5/5-x^7/7
通过前几项
我们可以看得出来它的规律了
然后后面点点点
这算不算一个合格的算法呢
如果仅仅到此为止
这个不是一个计算机
可以实现的算法
为什么呢
因为点点点到什么时候结束
没有规定
那就无穷无尽地加下去了
实际上我们必须在加一个
终止的条件
也就是在这道题里面呢
是运算精度的条件
直到某项的绝对值
不大于10的-15次方
那么就可以了
不加后续的项了
这就是将来在程序中
控制我们循环终止的条件
接下来我们来看这个程序代码
在这个例题中呢
我们将功能分解成一个
求arctan函数
和一个主函数
首先
我们来看这个arctan函数的实现
那么这个arctan函数呢
它的主体
就是这样一个while循环
按照我们公式里面
这个公式的规定 我们看
按照这个公式的规定
我们去逐项累加
所以要用while循环
每一项它到底应该是正的
还是负的呢
正好 凡是这个i除以4
它的余数为1的时候
就应该是加上一项的时候
否则就应该是减去一项的时候
大家自己看看
是不是这样一个规律
然后这个while循环
以什么来控制循环结束呢
以这个精度要求
当这一项e除以i
大于10的-15次方的时候
我们就需要继续加上这一项
如果这一项小于精度的要求了
我们就不往下加了
有了这样一个arctan函数
那么主函数中
计算这个π值就比较方便了
主函数中就只需要
先计算出第一个部分是a
然后第二个部分是b
然后a-b就这么简单
但是需要注意的是
arctan它接收的参数
是1/5 1/239
但是你不能写1除以5 1除以239大家要记得整数相除结果取整
如果你做整数相除的除法的话
那么这两个参数就都是0了
肯定得不到正确的结果
所以我们在程序中
要写1除以5.0 1除以239.0
好 这一节就是这样
-导学
--第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章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)