qq_31490163 2015-12-15 05:28 采纳率: 0%
浏览 1876

C++问题面相对象编程敲击键盘产生猫

编写程序,实现每按一次任意键时就将一只猫放在一个围栏里,这个围栏可以容纳7只猫。每只猫都是一个类Cat的实例化对象。在实例化每只猫时,都会随机地赋予一种毛色(如:Black、Gray或Brown),还将被随机地赋予一种眼睛颜色(如:Green、Blue或Brown)以及毛长(short、long)。对于这三种属性,程序提供set和get方法。

将猫放在围栏中,某些组合会发生争斗。例如,如果灰猫的数量超过棕色猫的数量,灰猫就会与棕色猫打架。如果在围栏里有一只黑毛、棕色眼睛的猫,同时还至少有一只黑色绿眼睛猫和至少一只黑色蓝眼睛猫,也会发生争斗。

分别输出7只猫的特征, 并判断猫是否会打架。

  • 写回答

1条回答 默认 最新

  • 凡沙-Fanrncho 2015-12-15 08:13
    关注

    #include
    #include
    #include
    #include
    using namespace std;

    enum HAIR_COLOR
    {
    HAIR_BLACK,
    HAIR_GRAY,
    HAIR_BROWN,
    };

    enum EYE_COLOR
    {
    EYE_GREEN,
    EYE_BLUE,
    EYE_BROWN,
    };

    enum HAIR_TYPE
    {
    HAIR_SHORT,
    HAIR_LONG,
    };

    class Cat
    {
    public:
    Cat();
    virtual ~Cat();
    inline HAIR_COLOR GetHairColor()const { return m_hairColor; }
    inline EYE_COLOR GetEyeColor()const { return m_eyeColor; }
    inline HAIR_TYPE GetHairType()const { return m_hairType; }
    inline void SetLabel( string strLabel ){ m_strLabel = strLabel; }
    inline string GetLabel()const { return m_strLabel; }
    inline string GetHairColorName(){ return m_strHairColor; }
    inline string GetHairTypeName(){ return m_strHairType; }
    inline string GetEyeColorName(){ return m_strEyeColor; }
    private:
    void _SetHairColor( const HAIR_COLOR hairColor );
    void _SetEyeColor( const EYE_COLOR hairColor );
    void _SetHairType( const HAIR_TYPE hairType );
    private:
    HAIR_COLOR m_hairColor;
    EYE_COLOR m_eyeColor;
    HAIR_TYPE m_hairType;
    string m_strLabel;
    string m_strHairColor;
    string m_strHairType;
    string m_strEyeColor;
    };

    Cat::Cat()
    {
    m_strLabel = "";
    _SetHairColor( ( HAIR_COLOR )( rand() % 3 ) );
    _SetEyeColor( ( EYE_COLOR )( rand() % 3 ) );
    _SetHairType( ( HAIR_TYPE )( rand() % 2 ) );
    }

    Cat::~Cat()
    {

    }

    void Cat::_SetHairColor( const HAIR_COLOR hairColor )
    {
    m_hairColor = hairColor;
    switch( hairColor )
    {
    case HAIR_BLACK:
    m_strHairColor = "黑毛";
    break;
    case HAIR_BROWN:
    m_strHairColor = "棕毛";
    break;
    case HAIR_GRAY:
    m_strHairColor = "灰毛";
    break;
    }
    }

    void Cat::_SetEyeColor( const EYE_COLOR eyeColor )
    {
    m_eyeColor = eyeColor;
    switch( eyeColor )
    {
    case EYE_BLUE:
    m_strEyeColor = "蓝色眼睛";
    break;
    case EYE_BROWN:
    m_strEyeColor = "棕色眼睛";
    break;
    case EYE_GREEN:
    m_strEyeColor = "绿色眼睛";
    break;
    }
    }

    void Cat::_SetHairType( const HAIR_TYPE hairType )
    {
    m_hairType = hairType;
    switch( hairType )
    {
    case HAIR_SHORT:
    m_strHairType = "短毛";
    break;
    case HAIR_LONG:
    m_strHairType = "长毛";
    break;
    }
    }

    bool CheckCatEyeColor( vector< Cat >catContainer )
    {
    int iEyeBlueCount = 0, iEyeBrownCount = 0, iEyeGreenCount = 0;
    while( !catContainer.empty() )
    {
    switch( catContainer.back().GetEyeColor() )
    {
    case EYE_BLUE:
    iEyeBlueCount++;
    break;
    case EYE_BROWN:
    iEyeBrownCount++;
    break;
    case EYE_GREEN:
    iEyeGreenCount++;
    break;
    }
    catContainer.pop_back();
    }
    if( iEyeBlueCount != 0 && iEyeBrownCount != 0 && iEyeGreenCount != 0 )
    {
    return true;
    }
    else
    {
    return false;
    }

    }

    int CheckCatContainerEmpty( vector< Cat >cat, ... )
    {
    int iNonEmptyCount = 0;
    va_list parameters;
    va_start( parameters, cat );
    vector< Cat > prevItem = cat;
    while( prevItem.back().GetLabel() != "Non" )
    {
    if( !prevItem.empty() )
    {
    iNonEmptyCount++;
    }
    prevItem = va_arg( parameters, vector< Cat > );
    }
    va_end( parameters );
    return iNonEmptyCount;
    }

    bool CheckCatMutualAttack( vector< Cat >cat1, vector< Cat >cat2, vector< Cat >cat3 )
    {
    bool bRet = false;
    Cat non;
    non.SetLabel( "Non" );
    vector< Cat >nonContainer;
    nonContainer.push_back( non ) ;
    int iNonEmptyCount = CheckCatContainerEmpty( cat1, cat2, cat3, nonContainer );
    if( iNonEmptyCount == 3 )
    {
    if( cat1.size() != cat2.size() || cat1.size() != cat3.size() || cat2.size() != cat3.size() )
    {
    bRet = true;
    }
    else
    {
    if( CheckCatEyeColor( cat1 ) )
    {
    bRet = true;
    }
    else if( CheckCatEyeColor( cat2 ) )
    {
    bRet = true;
    }
    else if( CheckCatEyeColor( cat3 ) )
    {
    bRet = true;
    }
    }
    }
    else if( iNonEmptyCount == 2 )
    {
    if( cat1.empty() )
    {
    if( cat2.size() != cat3.size() )
    {
    bRet= true;
    }
    else
    {
    if( CheckCatEyeColor( cat2 ) )
    {
    bRet= true;
    }
    else if( CheckCatEyeColor( cat3 ) )
    {
    bRet= true;
    }
    }
    }
    else if( cat2.empty() )
    {
    if( cat1.size() != cat3.size() )
    {
    bRet= true;
    }
    else
    {
    if( CheckCatEyeColor( cat1 ) )
    {
    bRet= true;
    }
    else if( CheckCatEyeColor( cat3 ) )
    {
    bRet= true;
    }
    }
    }
    else if( cat3.empty() )
    {
    if( cat2.size() != cat1.size() )
    {
    bRet= true;
    }
    else
    {
    if( CheckCatEyeColor( cat2 ) )
    {
    bRet= true;
    }
    else if( CheckCatEyeColor( cat1 ) )
    {
    bRet= true;
    }
    }
    }
    }
    else
    {
    if( cat1.empty() && cat2.empty() )
    {
    if( CheckCatEyeColor( cat3 ) )
    {
    bRet = true;
    }
    }
    else if( cat2.empty() && cat3.empty() )
    {
    if( CheckCatEyeColor( cat1 ) )
    {
    bRet = true;
    }
    }
    else if( cat1.empty() && cat3.empty() )
    {
    if( CheckCatEyeColor( cat2 ) )
    {
    bRet= true;
    }
    }
    }
    return bRet;
    }

    void main()
    {
    vector< Cat > catContainer, blackCatContainer, grayCatContainer, brownContainer;

    for( int i = 0; i < 7; i++ )
    {
        Cat cat;
        switch( cat.GetHairColor() )
        {
        case HAIR_BLACK:
            blackCatContainer.push_back( cat );
            break;
        case HAIR_GRAY:
            grayCatContainer.push_back( cat );
            break;
        case HAIR_BROWN:
            brownContainer.push_back( cat );  
            break;
        }
        catContainer.push_back( cat );
    }
    
    string strMutualAttack;
    if( CheckCatMutualAttack( blackCatContainer, grayCatContainer, brownContainer ) )
    {
        strMutualAttack = "是";
    }
    else
    {
        strMutualAttack = "不是";
    }
    for( int i = 0; i < 7; i++ )
    {
        cout << "猫ID:" << i << "\t"<< "毛色:" << catContainer[ i ].GetHairColorName().c_str() << "\t" << "毛类型:" << catContainer[ i ].GetHairTypeName().c_str() << "\t" << "眼睛颜色:"  << catContainer[ i ].GetEyeColorName().c_str()  << endl;
    }
    cout << "是否相互攻击:" << strMutualAttack.c_str() <<endl;
    system( "pause" );
    

    }

    不知道这个程序运行后有没有达到你的作业要求,你拿去运行试试结果,还有疑问请私密我。

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用