Essential C++ 第二章代码

把第二章几乎所有内容都揉在了这个程序里..........

//fibon.h

#ifndef FIBON_H_INCLUDED
#define FIBON_H_INCLUDED

#include <iostream>
#include <vector>

using namespace std;

//inline函数必须定义在头文件内
inline bool is_size_ok(int size, const int max_size = 30)//设定默认值
{
    if (size <= 0 || size > max_size)
        return false;

    return true;
}

//六个数列的声明
const vector<int>* fibon_seq(int);
const vector<int>* lucas_seq(int);
const vector<int>* pell_seq(int);
const vector<int>* triang_seq(int);
const vector<int>* squar_seq(int);
const vector<int>* penta_seq(int);

bool seq_elem(int, int &, const vector<int>* (*)(int));

//模板函数也必须定义在头文件内
template <typename elemType>
void print(const vector<elemType> *vec)
{
    for (int ix = 0; (unsigned)ix < vec->size(); ++ix)
    {
        elemType t = (*vec)[ix];
        cout << t << (ix%10 == 9 ? "\n\t":" ");
    }

}

template <typename elemType>
void print(const elemType &name, int pos)
{
    cout << "The " << name << " Sequence for " << pos << " positions: \n\t";
}




#endif // FIBON_H_INCLUDED




//fibon.cpp

#include "fibon.h"


const vector<int> *fibon_seq(int size)
{

    static vector<int> elems;//局部静态

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
    {
        if (ix == 0 || ix == 1)
            elems.push_back(1);
        else elems.push_back(elems[ix - 1] + elems[ix - 2]);
    }

    return &elems;

}

const vector<int> *lucas_seq(int size)
{

    static vector<int> elems;

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
    {
        if (ix == 0 || ix == 1)
            elems.push_back(2 * ix + 1);
        else elems.push_back(elems[ix - 1] + elems[ix - 2]);
    }

    return &elems;

}

const vector<int> *pell_seq(int size)
{

    static vector<int> elems;

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
    {
        if (ix == 0 || ix == 1)
            elems.push_back(ix + 1);
        else elems.push_back(2 * elems[ix - 1] + elems[ix - 2]);
    }

    return &elems;

}

const vector<int> *triang_seq(int size)
{

    static vector<int> elems;

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
    {
        if (ix == 0)
            elems.push_back(1);
        else elems.push_back(elems[ix - 1] + ix + 1);
    }

    return &elems;

}

const vector<int> *squar_seq(int size)
{

    static vector<int> elems;

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
        elems.push_back((ix + 1) * (ix + 1));

    return &elems;

}

const vector<int> *penta_seq(int size)
{

    static vector<int> elems;

    if (! is_size_ok(size))
        return 0;


    for (int ix = elems.size(); ix < size; ++ix)
        elems.push_back((ix + 1) * (3 * (ix + 1) - 1) / 2);

    return &elems;

}

bool seq_elem(int pos, int &elem, const vector<int>* (*seq_ptr)(int))
{
    const vector<int> *pseq = seq_ptr(pos);

    if (! pseq)
    {
        elem = 0;
        return false;
    }

    elem = (*pseq)[pos - 1];
    return true;
}


//main.cpp

#include "fibon.h"



void play()
{   //函数指针
    const vector<int>* (*seq_array[])(int) = {fibon_seq,lucas_seq,pell_seq,triang_seq,squar_seq,penta_seq};
    const vector<int>* (*seq_ptr)(int);

    string name[6] = {"1.Fibonacci","2.Lucas","3.Pell","4.Triangular","5.Square","6.Pentagonal"};
    vector<string> name_vec(name,name+6);

    print(&name_vec);
    cout << endl;
    cout << "Please choose a sequence: ";



    int choose;
    cin >> choose;

    if(!is_size_ok(choose,6))
    {
        cout << "Invalid input!";
        return;
    }

    seq_ptr = seq_array[choose-1];

    int pos;
        cout << "Please enter a position: ";
        cin >> pos;

        int elem;
        if (seq_elem(pos, elem, *seq_ptr))
            {
                cout << "element # " << pos
                 << " is " << elem << endl;

                 print(name[choose-1], pos);
                 print(seq_ptr(pos));
            }
        else
            cout << "Sorry. Could not calculate element # "
                 << pos << endl;


}


int main()
{

    char ans = 'Y';
    while(ans == 'Y' || ans == 'y')
    {
        play();
        cout << "\n\nAgain?(Y/N) ";
        cin >> ans;
        cout << endl;
    }
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值