panda ID:pandaxcl
81379次访问,排名1162(-1)好友0人,关注者3
pandaxcl的文章
原创 61 篇
翻译 0 篇
转载 0 篇
评论 153 篇
pandaxcl的公告

博客文档资源下载在本人的网站下载!!!

我也优先在我的网站论坛上面回答问题

在研究C++自动化编程好久之后,发现C++自动化编程在国内还是一个空白。所谓的C++自动化编程,简单点说就是采用了C++的高级模板技术配合产生式编程技法实现了C++代码的自我配置,自动维护代码之间的种种一致性问题。关于这个问题的讨论,将会在我的网站上面进行细致的讨论。如果有问题,欢迎来我的网站提问哦。看看下面的我的网站的链接。

EMail:pandaxcl@163.com

QQ:56637059

我的网站: http://www.autodev.net

最近评论
skyapples:不得不说,这真是一篇好文章,作者是用心做事情的人
skyapples:不得不说,这真是一篇好文章,作者是用心做事情的人
huxi043715:博主,在很强阿。你的文章也很容易懂。
wangwei200508:呵呵,谢了
您的这里指到自己硬盘了
<a href="file:///D:/work/lex_yacc/chapter01/lexyacc.rar.png" target="_top">这里</a>
imath:老大我引用了你的 这系列文章,嘿嘿
文章分类
收藏
    相册
    友情连接
    小熊猫
    我的另外一个博客
    我的网站-自动化编程社区
    我的论坛-自动化编程社区论坛
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 使用虚拟容器的方法实现梯形公式的逐次分半法求积分(2)收藏

    新一篇: 自定义STL插入器实现分流器 | 旧一篇: 使用虚拟容器的方法实现二分法求解方程的根(2)

    #include <iostream>
    #include <iterator>
    #include <algorithm>
    #include <functional>
    #include <cmath>
    #include "dummy.h"
    template< class Function > struct Method
    {
    typedef std::pair<double,double> element_type;
    struct Generator:std::unary_function<const size_t&,element_type&>
    {
    element_type&operator()(const size_t&i)
    {
    Function f;
    const double&a=Method::range().first;//积分下限
    const double&b=Method::range().second;//积分上限
    double&Tn = Method::value().first;//上一次的分办法的梯形法积分结果
    double&T2n= Method::value().second;//这一次分半之后的梯形法积分结果
    if(i==0||i==1){//第一次执行的时候才会执行下面的代码
    Tn = (b-a)/2*(f(a)+f(b));
    T2n = Tn/2+(b-a)/2*f((a+b)/2);
    }else{
    const size_t n = i+1;
    Tn = T2n;//保存上一次的积分结果
    T2n = 0;//将这个变量用来存储临时结果
    size_t j; for(j=1;j<=n;j++) T2n += f(a+(2*j-1)*(b-a)/2/n);
    T2n = Tn/2+(b-a)/2/n*T2n;//该变量用来保存最后的积分结果
    }
    return Method::value();
    }
    };
    //积分的循环终止条件
    struct Predicate:std::unary_function<const element_type&,bool>
    {
    Predicate(const double&eps):_eps(eps){}
    bool operator()(const element_type&e)
    {
    return fabs( e.first - e.second ) < 3 * _eps;
    }
    private:
    Predicate(){}
    double _eps;
    };
    public:
    //这个静态函数用来设置积分的上限值和下限值
    static void range(const double&a,const double&b)
    {
    range() = std::make_pair(a,b);
    }
    private:
    //这个静态函数用来保存积分上限和积分下限值
    static element_type&range()
    {
    static element_type _value;
    return _value;
    }
    //这个静态函数用来保存前一次积分值和再次分半之后的积分值
    static element_type&value()
    {
    static element_type _value;
    return _value;
    }
    };
    //下面的这个仿函数就是我们将要进行积分的函数
    struct Function:std::unary_function<const double&,double>
    {
    double operator()(const double&x)
    {
    return sin(x);
    }
    };
    //在这里实现了方法和被积函数的分离,而且充分利用了STL已有的算法,避免了这些重复代码
    //因而代码可读性增加。这也是使用虚拟容器的目的所在!
    int main()
    {
    std::cout.precision(20);
    typedef Method<Function> M;
    typedef dummy<M::element_type,M::Generator> INTEGRAL;
    const double PI = 3.1415926535897932384626433832795;
    {
    M::range(0.0,PI/2.0);//设置积分区间
    INTEGRAL v(0,10000);//为了避免死循环给出了最大的循环次数
    INTEGRAL::iterator result = std::find_if(v.begin(),v.end(),M::Predicate(1e-5));
    std::cout << "迭代次数:[" << static_cast<const size_t&>(result) << "]" << std::endl;
    std::cout << "左积分:[" << (*result).first << "]" << std::endl;
    std::cout << "右积分:[" << (*result).second << "]" << std::endl;
    }
    {
    M::range(-PI/2.0,0.0);//设置积分区间
    INTEGRAL v(0,10000);//为了避免死循环给出了最大的循环次数
    INTEGRAL::iterator result = std::find_if(v.begin(),v.end(),M::Predicate(1e-5));
    std::cout << "迭代次数:[" << static_cast<const size_t&>(result) << "]" << std::endl;
    std::cout << "左积分:[" << (*result).first << "]" << std::endl;
    std::cout << "右积分:[" << (*result).second << "]" << std::endl;
    }
    return 0;
    }
    ////////////////////////////////////////////////////////////////////////////////
    //运行结果如下:
    /*******************************************************************************
    迭代次数:[20]
    左积分:[1.0002621998308148]
    右积分:[1.0002404226766435]
    迭代次数:[20]
    左积分:[-1.0002621998308148]
    右积分:[-1.0002404226766435]
    *******************************************************************************/
    ////////////////////////////////////////////////////////////////////////////////

    发表于 @ 2006年04月02日 11:24:00|评论(loading...)|编辑

    新一篇: 自定义STL插入器实现分流器 | 旧一篇: 使用虚拟容器的方法实现二分法求解方程的根(2)

    评论

    #pandaxcl 发表于2006-05-17 17:42:00  IP: 202.114.78.*
    谢谢剑客 和 许帆 的关注。dummy.h在这个博客的《自定义STL游标实现虚拟容器(4)》一文中啊:)。
    最近忙着写毕业论文所以,博客暂时没有继续了,不过毕业论文写完工作搞定之后就会写很多东西了,敬请关注:)
    #剑客 发表于2006-05-17 16:17:00  IP: 222.171.23.*
    dummy.h 在哪里啊?
    #许帆 发表于2006-05-17 16:33:00  IP: 222.171.23.*
    #include<dummy.h>
    不能打开是怎么回事
    #许帆 发表于2006-05-17 21:28:00  IP: 218.7.32.*
    得到你的回帖,我十分惊讶,也很高兴。
    以后会多多关注你的博客,不知道能否帮我用C语言或C++实现一下,就是很简单那种,不需要用容器方法。如果能那就感激不禁了。我会在我的论坛里宣传一下你的博客。
    #许帆 发表于2006-05-17 16:47:00  IP: 222.171.23.*
    大哥,你什么时候能看见我的帖子,我等着救命那
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © pandaxcl