1、请改写main(),使它允许用户不断输入位置值,直到用户希望停止为止。

2、Pentagonal数列的求值公式是P(n)=n(3n-1)/2,借此产生1,5,12,22,35等元素值。

3、将Pentagonal数列的求值函数拆分为两个函数。

4、写一个函数,以局部静态的vector储存Pentagonal数列元素。

5、重载max函数

6、以template重新完成max函数。

六道题的代码
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool fibon_elem( int pos, int &elem );
void test2_1();
bool calc_elements(vector<int> &vec,int pos);
void display_elems(vector<int> &vec,const string &title,ostream &os=cout);
void test2_2();
inline bool calc_elems(vector<int> &vec,int pos);
void really_calc_elems(vector<int> &vec,int pos);
void test2_3();
inline bool check_validity(int pos){
return (pos<=0||pos>64)?false:true;
}
const vector<int>* pentagonal_series(int pos);
bool pentagoanl_elem(int pos,int &elem);
void test2_4();
inline int max(int t1,int t2)
{return t1>t2?t1:t2;}
inline float max(float t1,float t2)
{return t1>t2?t1:t2;}
inline string max(const string &t1,const string &t2)
{return t1>t2?t1:t2;}
inline int max(const vector<int> &vec)
{return *max_element(vec.begin(),vec.end());}
inline float max(const vector<float> &vec)
{return *max_element(vec.begin(),vec.end());}
inline string max(const vector<string> &vec)
{return *max_element(vec.begin(),vec.end());}
inline int max(const int *parray,int size)
{return *max_element(parray,parray+size);}
inline float max(const float *parray,int size)
{return *max_element(parray,parray+size);}
inline string max(const string *parray,int size)
{return *max_element(parray,parray+size);}
void test2_5();
template<typename Type>
inline Type max(Type t1,Type t2){return t1>t2?t1:t2;}
template<typename elemType>
inline elemType max(const vector<elemType> &vec)
{ return *max_element(vec.begin(),vec.end());}
void test2_6();
int main()
{
cout << "Hello World!" << endl;
test2_6();
return 0;
}
bool fibon_elem( int pos, int &elem )
{
if ( pos <= 0 || pos > 1024 )
{
cerr << "invalid position: " << pos
<< " -- cannot handle request!\n";
elem = 0;
return false;
}
elem = 1;
int n_2 = 1, n_1 = 1;
for ( int ix = 3; ix <= pos; ++ix )
{
elem = n_2 + n_1;
n_2 = n_1; n_1 = elem;
}
return true;
}
void test2_1()
{
int pos,elem;
char ch;
bool more=true;
while (more) {
cout<<"please enter a position:";
cin>>pos;
if(fibon_elem(pos,elem))
cout<<"element # "<<pos
<<" is "<<elem<<endl;
else {
cout<<"sorry could not calculate element #"
<<pos<<endl;
}
cout<<"would you try again ?(y/n)";
cin>>ch;
if(ch!='y'&&ch!='Y')
more=false;
}
}
void test2_2(){
vector<int> pent;
const string title("pentagonal numeric series");
if(calc_elements(pent,0))
display_elems(pent,title);
if(calc_elements(pent,8))
display_elems(pent,title);
if(calc_elements(pent,14))
display_elems(pent,title);
if(calc_elements(pent,138))
display_elems(pent,title);
}
bool calc_elements(vector<int> &vec,int pos){
if(pos<=0||pos>64){
cerr<<"sorry .invalid position:"<<pos<<endl;
return false;
}
for (int ix=vec.size()+1;ix<=pos;++ix) {
vec.push_back((ix*(3*ix-1))/2);
}
return true;
}
void display_elems(vector<int> &vec,const string &title,ostream &os){
os<<'\n'<<title<<"\n\t";
for (int ix=0;ix<vec.size();++ix) {
os<<vec[ix]<<' ';
}
os<<endl;
}
void test2_3(){
cout<<"2_3";
vector<int> pent;
const string title("pentagonal numeric series");
if(calc_elems(pent,0))
display_elems(pent,title);
if(calc_elems(pent,8))
display_elems(pent,title);
if(calc_elems(pent,14))
display_elems(pent,title);
if(calc_elems(pent,138))
display_elems(pent,title);
}
inline bool calc_elems(vector<int> &vec,int pos){
if(pos<=0||pos>64){
cerr<<"sorry .invalid position:"<<pos<<endl;
return false;
}
if(vec.size()<pos)
really_calc_elems(vec,pos);
return true;
}
void really_calc_elems(vector<int> &vec,int pos){
for (int ix=vec.size()+1;ix<=pos;++ix) {
vec.push_back((ix*(3*ix-1))/2);
}
}
const vector<int>* pentagonal_series(int pos){
static vector<int> _elems;
if(check_validity(pos)&&pos>_elems.size()) {
for (int ix=_elems.size()+1;ix<=pos;++ix) {
_elems.push_back((ix*(3*ix-1))/2);
}
}
return &_elems;
}
bool pentagoanl_elem(int pos,int &elem){
if(!check_validity(pos)){
cout<<"sorry .invalid position: "<<pos<<endl;
elem=0;
return false;
}
const vector<int> *pent=pentagonal_series(pos);
elem=(*pent)[pos-1];
return true;
}
void test2_4(){
int elem;
if(pentagoanl_elem(8,elem))
cout<<"element 8 is "<<elem <<'\n';
if(pentagoanl_elem(88,elem))
cout<<"element 88 is "<<elem <<'\n';
if(pentagoanl_elem(12,elem))
cout<<"element 12 is "<<elem <<'\n';
if(pentagoanl_elem(64,elem))
cout<<"element 64 is "<<elem <<'\n';
}
void test2_5(){
string sarray[]={"we","were","her","pride","of","ten"};
vector<string> svec(sarray,sarray+6);
int iarray[]={12,70,2,169,1,5,29};
vector<int> ivec(iarray,iarray+7);
float farray[]={2.5,24.8,18.7,4.1,23.9};
vector<float> fvec(farray,farray+5);
int imax =max(max(ivec),max(iarray,7));
float fmax =max(max(fvec),max(farray,5));
string smax =max(max(svec),max(sarray,6));
cout<<"imax should be 169 ----found: "<<imax <<'\n'
<<"fmax should be 24.8 ----found: "<<fmax <<'\n'
<<"smax should be were ----found: "<<smax <<'\n';
}
void test2_6(){
string sarray[]={"we","were","her","pride","of","ten"};
vector<string> svec(sarray,sarray+6);
int iarray[]={12,70,2,169,1,5,29};
vector<int> ivec(iarray,iarray+7);
float farray[]={2.5,24.8,18.7,4.1,23.9};
vector<float> fvec(farray,farray+5);
int imax =max(max(ivec),max(iarray,7));
float fmax =max(max(fvec),max(farray,5));
string smax =max(max(svec),max(sarray,6));
cout<<"imax should be 169 ----found: "<<imax <<'\n'
<<"fmax should be 24.8 ----found: "<<fmax <<'\n'
<<"smax should be were ----found: "<<smax <<'\n';
}