以前接触到一个旋转数字的题目,感觉写写代码练练挺好的。
前几天用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();
}
}