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

        }

    }

          主函数调用一下打印函数就可以了。 
  • 相关阅读:
    单元测试——破除依赖
    单元测试——基础概念
    2015年9月书单推荐
    菜鸟vimer成长记——第4.2章、编程插件
    克服弱点,愈发完美-自我篇——《人性的弱点》读后感
    菜鸟vimer成长记——第4.0章、Vim插件管理利器-Vundle
    菜鸟vimer成长记——第3章、文件
    阿里IPO法律咨询费达1580万美元 为Facebook六倍
    新移民漫画家 以幻想构筑奇妙世界
    请教Amazon FBA里面Label Service, Stickerless, Commingled Inventory是什么意思?
  • 原文地址:https://www.cnblogs.com/wangchenggen/p/3558543.html
Copyright © 2011-2022 走看看