把第二章几乎所有内容都揉在了这个程序里..........
//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;
}
}