旋转数字题

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

    前几天用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();

    }

}

      主函数调用一下打印函数就可以了。 
原文地址:https://www.cnblogs.com/wangchenggen/p/3558543.html