//例子:旋转方阵填充,要求矩阵大小任意,尺寸在运行时输入
设计思路:从上到下
int main()
{
cout << "Please input N:";
int size;
cin >> size;
Matrix obj(size);//生成N*N矩阵
obj.fill();
cout <<obj;
return ;
} 设计类的接口:设计Matrix的接口
class Matrix
{
public:
Matrix(int size);
void fill();
friend osream& operator<<(ostream& out,const Matrix& m);
} 实现类的接口:确定成员变量
class Matrix
{
int _size;//方阵的规模
int *_data;//数据空间
public:
Matrix(int size);
~Matrix();
void fill();
friend ostream& operator<<(ostream& out,const Matrix& m);
}; 实现类的接口:实现构造函数,析构函数,和流输出操作符
Matrix::Matrix(int size):_size(size)
{
_data = new int[size * size];
memset(_data,,sizeof(int)*_size*_size);
} Matrix::~Matrix()
{
delete[] _data;
} ostream& operator<<(ostream& out,const Matrix& m)
{
for(int r = ; r < m._size; r++)
for(int c = ; c < m._size)
cout << *(m + r * m._size + c) << '\t';
cout << endl;
} 如何实现填充的成员函数,将从1开始的数字以此存放在正确的位置?
怎么确定某个待填充的数字的位置? 细化:增加一个辅助函数来计算并填充
class Matrix
{
int findPosition();//新增的辅助函数
public:
}; void Matrix::fill()
{
for(int num = ; num <=_size * _size; num++)
{
int pos = findPosition();
_data[pos] = num;
}
}
进一步分析:
每一个数字都与上一个数字相邻(上下左右,根据上一个数字位置和当前运动方向,可以确定其位置)
所以需要存储上一个位置和当前的运动方向
class Matrix
{
int row,col;
char dir; int findPosition();
public:
};
初始状态:初始方向为向下,那么在1之前,当前位置应该是在(-,)
Matrix::Matrix(int size):_size(size),row(-),col(),dir('D')
{
_data = new int[size*size];
} 下一个位置:根据上一个位置和当前的方向来确定
int Matrix::findPosition()
{
switch(dir)
{
case 'D':
if(row < _size- && _data[(row+)*_size + col] == )
row++;
else
{
dir = 'R';//next direction
col++;
}
break;
case 'R':
if(col < _size - && _data[row*_size + col + ] == )
col++;
else
{
dir = 'U';//next direction
row--;
}
break;
case 'U':
if(row > && _data[(row-) * _size + col] == )
row--;
else
{
dir = 'L';//next direction
col--;
}
break;
case 'L':
if(col > && _data[row * _size + col - ] == )
col--;
else
{
dir = 'D';
row++;
}
break;
}
return row * _size + col;
} 对于Matrix类来说,如果需要多种方式填充矩阵只需要修改findPosition()这个成员函数就可以了;
但是每次都需要改变Matrix这个类吗?只有findPosition()需要改变,其他的都不需要改变,可以使用虚函数的方式:
多态的威力:使用虚函数,将findPosition()函数的实现推迟到子类中
class Matrix
{
virtual int findPosition() = ;
}; class ClockwiseMatrix:public Matrix
{
int row,col;
char dir;
public:
int findPosition();
}; class RowFirstMatrix:public Matrix
{
int next;//initialize as 0
public:
int findPosition()
{
return next++;
}
}; int main()
{
//
matrix.fill();
} void matrix::fill()
{
for(int num = ;num <= N*N; num++)
{
int pos = findPosition();//findPosition();可以调用不同的形式
_data[pos] = num;
}
}

C++程序设计方法5:接口设计实例的更多相关文章

  1. 优秀的API接口设计原则及方法(转)

    一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...

  2. STM32W108无线射频模块通用IO接口应用实例

    STM32W108无线射频模块通用IO接口应用实例 本实例编写STM32W108的GPIO測试程序,通过控制GPIO引脚,实现对LED灯的控制. 开发环境与硬件说明 硬件:STM32W108无线开发板 ...

  3. 《程序设计方法》【PDF】下载

    内容简介 <程序设计方法>主要以方法为主导,结合C语言,把程序设计方法学研究中若干成熟的理论和方法用通俗易懂的语言描述出来.<程序设计方法>还选取趣味性强.技巧性高.能够启发学 ...

  4. JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明

    1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...

  5. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27    关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充   说道接口设计第一反应就是r ...

  6. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  7. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  8. Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

    Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8 ...

  9. Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

随机推荐

  1. Navicat Premium 12.1.8.0安装与激活

    本文介绍Navicat Premium 12.1.8.0的安装.激活与基本使用. 博主所提供的激活文件理论支持Navicat Premium 12.0.x系列和Navicat Premium 12.1 ...

  2. ubuntu中vim下按上下左右键时输入A、B、C、D

    ubuntu系统自带的 vi 不完整导致,解决方法:安装完整的vi $ sudo apt-get install vim-gtk 1. 为root用户设置密码 sudo passwd root 需要先 ...

  3. 解开一个疑惑,为什么LVS开放的端口,使用netstat或ss命令,不能查找到其监听的端口呢?

    RT, 这个疑问,本周一直在心里,今天找到一个说法. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 另外LVS规则算是内核方法,用netstat -ntulp也显 ...

  4. Exception in thread "main" java.lang.NullPointerException

    1.在window操作系统上,使用eclipse开发工具从hdfs分布式文件系统上下载文件报空指针异常解决方法: log4j:WARN No appenders could be found for ...

  5. mysql四大特性与四种隔离级别

    四大特性 1:原子性.事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行. 2:隔离性.同一时间,只允许一个事务请求同一组数据.不同的事务彼此之间没有干扰. 3:一致性.事务开始前 ...

  6. alpha冲刺6/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:感恩节~ 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 设计了拍照界面和图片上传界面 沟通了前端进度 接下 ...

  7. ssh登陆linux服务器 实际场景讲解 让你管理服务器更安全

    很多时候我们管理linux系统,都谁使用ssh登陆,因为都知道ssh是加密传输的协议的,可以有效保证我们与 服务器之间的数据通信安全.但是我们忽略了一点,但是登陆的时候我们是输入的账号和密码,这一点其 ...

  8. Python学习(二十五)—— Python连接MySql数据库

    转载自http://www.cnblogs.com/liwenzhou/p/8032238.html 一.Python3连接MySQL PyMySQL 是在 Python3.x 版本中用于连接 MyS ...

  9. BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/8084891.html 题目传送门 - BZOJ3240 题意概括 F[1][1]=1F[i,j]=a*F[i][ ...

  10. Hive的配置| 架构原理

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. 本质是:将HQL转化成MapReduce程序 1)Hive处理的数据存储在HDFS 2)Hi ...