zoukankan      html  css  js  c++  java
  • 旋转数字题

        以前接触到一个旋转数字的题目,感觉写写代码练练挺好的。

        前几天用C语言实现了,感觉我还是“面向过程的思想”比“面向对象的思想”更多一些。于是又拿这个题目练练手。

        题目是就要实现打印如下结果:

        01 02 03 04 05 

       16 17 18 19 06 

       15 24 25 20 07 

       14 23 22 21 08 

       13 12 11 10 09 

        具体代码如下:

        

    #ifndef ARRAY_H

    #define ARRAY_H

    #define NUM 5

    typedefenum eDir

    {

        E_DIR_RIGHT,

        E_DIR_DOWN,

        E_DIR_LEFT,

        E_DIR_UP,

    }E_DIR;

    typedefstructstMargin

    {

        int _ln1;

        int _ln2;

        int _col1;

        int _col2;

    }ST_MARGIN;

    typedefstructstCurInfo

    {

    int_curLn;

    int_curCol;

    }ST_CUR_INFO;

    classCDirection

    {

    private:

        E_DIR _dir;

        ST_MARGIN *_margin;

        ST_CUR_INFO *_cur;

    private:

        bool isLastPos();

        void right();

        void down();

        void left();

        void up();

    public:

        CDirection(ST_MARGIN *pm, ST_CUR_INFO *pi);

        ~CDirection();

        void getNextPos();

    };

    classCData

    {

    private:

        constint_num;

        ST_CUR_INFO_cur;

        ST_MARGIN_margin;

        int * _pArray;

        CDirection_dir;

        void initArray();

        void initCurInfo();

        void initMargin();

        void arrange();

    public:

        CData(const int ci);

        ~CData();

        void printData();

    };

    #endif

        源文件如下:

    /*

     * Arrange.cpp

     *

     *  Created on: 2014-2-17

     *      Author: wangchenggen

     */

    #include"Arrange.h"

    #include<stdlib.h>

    #include<assert.h>

    #include<stdio.h>

    #include<memory.h>

    CDirection::CDirection(ST_MARGIN *pm, ST_CUR_INFO *pi)

        :_dir(E_DIR_RIGHT),_margin(pm),_cur(pi)

    {

        assert(NULL != _margin);

        assert(NULL != _cur);

    }

    CDirection::~CDirection()

    {

        ////

    }

    bool CDirection::isLastPos()

    {

        if (_margin->_col1 > _margin->_col2 && _margin->_ln1 > _margin->_ln2)

        {

            return true;

        }

        return  false;

    }

    void CDirection::up()

    {

        if (_cur->_curLn > _margin->_ln1)

        {

            --_cur->_curLn;

        }

        else

        {

            _dir = E_DIR_RIGHT;

            ++_margin->_col1;

            ++_cur->_curCol;

        }

    }

    void CDirection::right()

    {

        if (_cur->_curCol < _margin->_col2)

        {

            ++_cur->_curCol;

        }

        else

        {

            _dir = E_DIR_DOWN;

            ++_margin->_ln1;

            ++_cur->_curLn;

        }

    }

    void CDirection::down()

    {

        if (_cur->_curLn < _margin->_ln2)

        {

            ++_cur->_curLn;

        }

        else

        {

            _dir = E_DIR_LEFT;

            --_margin->_col2;

            --_cur->_curCol;

        }

    }

    void CDirection::left()

    {

    if (_cur->_curCol > _margin->_col1)

    {

    --_cur->_curCol;

    }

    else

    {

    _dir = E_DIR_UP;

    --_margin->_ln2;

    --_cur->_curLn;

    }

    }

    void CDirection::getNextPos()

    {

    if(isLastPos())

    {

    return;

    }

    switch(_dir)

    {

    caseE_DIR_RIGHT:

            right();

    break;

    caseE_DIR_DOWN:

    down();

    break;

    caseE_DIR_LEFT:

    left();

    break;

    caseE_DIR_UP:

    up();

    break;

    default:

    break;

    }

    }

    CData::CData(const int ci):_num(ci),_pArray(NULL),_dir(&_margin,&_cur)

    {

        initArray();

        initCurInfo();

        initMargin();

    arrange();

    }

    void CData::initArray()

    {

    _pArray = newint[_num * _num];

    assert(NULL != _pArray);

    memset(_pArray,0,_num * _num);

    }

    void CData::initCurInfo()

    {

    _cur._curLn = 0;

    _cur._curCol = 0;

    }

    void CData::initMargin()

    {

    _margin._col1 = 0;

    _margin._col2 = _num-1;

    _margin._ln1 = 0;

    _margin._ln2 = _num-1;

    }

    CData::~CData()

    {

    delete[] _pArray;

    }

    void CData::printData()

    {

    for (int i=0;i<_num * _num; ++i)

    {

    if (i%_num == 0)

    {

    printf(" ");

    }

    printf("%02d ",_pArray[i]);

    }

    }

    void CData::arrange()

    {

        for (int i=1;i <= _num * _num;++i)

        {

            int *p = _pArray + _cur._curLn * _num + _cur._curCol;

            *p = i;

            _dir.getNextPos();

        }

    }

          主函数调用一下打印函数就可以了。 
  • 相关阅读:
    算法二:选择排序
    算法一:冒泡算法
    windows+nginx+fcgi配置
    shell if判断的种类
    lua闭包的理解函数与表的几种表达方法
    bash: jps:未找到命令
    解决 jmeter 在非GUI模式下生成的jtl,导入到结果树,看不到请求、返回的信息
    centos 解决python3.7 安装时No module named _ssl
    dbms复习(二)
    dbms复习(一)
  • 原文地址:https://www.cnblogs.com/wangchenggen/p/3558543.html
Copyright © 2011-2022 走看看