0
点赞
收藏
分享

微信扫一扫

2、面向过程的编程风格

船长_Kevin 2022-04-17 阅读 79
c++

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();

//void test2_6();
int main()
{
    cout << "Hello World!" << endl;
   // test2_2();
   // test2_3();
    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()
{/*
   以while循环来执行题目要求的迭代行为。每次迭代结束时,询问用户是否愿意继续。如果用户回答NO,终止循环。
   more初始值true,便于进入循环,开始第一次迭代
*/
    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";//"\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';
}

举报

相关推荐

0 条评论