《实时控制软件设计》第一个编程作业

C++编程是基本功训练,邹欣老师在教学中,第一个作业是

 花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,要求:
 a) 除了整数以外,还要支持真分数的四则运算。 (例如:  1/6 + 1/8 = 7/24)
 b) 让程序能接受用户输入答案,并判定对错。 最后给出总共 对/错 的数量。

详见 http://www.cnblogs.com/xinz/p/3803035.html

在此基础上,进一步可以完成第二个作业,进行模块化编程,信息隐藏,接口设计,TDD等方面的训练。
详见 http://www.cnblogs.com/xinz/p/4421170.html

侯捷老师在他的C++课程中,则以复数的运算为例讲解面向对象编程的关键知识点。

本课程以OROCOS机器人软件为主要实战对象,整个OROCOS软件包比较大,但OROCOS里有大量的矩阵运算,是通过调用一个线性代数的开源库Eigen实现的,所以应用Eigen进行矩阵运算完成编程练习,一方面易于上手,另一方面也有利于理解OROCOS的代码。
Eigen的库用起来很容易,只要把源代码下载到本地的开发环境,写一个最简单的程序:

#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}

然后编译运行,就可以在命令行环境中看到输入结果了。

因为采用C++编程,所以开发环境也有多种选择,如Ubuntu Linux/vim/gcc、Windows/Visual Studio, 由于OROCOS是用gcc编译器编译的,我们优先选用Ubuntu Linux/vim/gcc,如果你对Linux环境不熟悉,可以采用Windows下的轻量级开发环境Dev-C++,该软件也是基于gcc编译器。Dev-C++开发环境的建立过程如下:

1)到Dev-C++的官网上下载Dev-C++安装包,目前版本号是5.11,大约40多M,地址为:
http://sourceforge.net/projects/orwelldevcpp/?source=directory
2)运行该安装文件,按提示完成安装过程。
3)打开Dev-C++软件,新建一个新项目,新建一个main.cpp文件,把上面的程序代码拷贝到main.cpp文件中。

为了使上述代码能够运行,我们还必须在开发环境中集成Eigen库,为此:

4)到Eigen官网下载Eigen库软件压缩包,官网地址为:http://eigen.tuxfamily.org/
5)对压缩包解压缩到刚才新建的项目目录下。
6)点击Dev-C++的菜单“项目->项目属性”,在弹出对话框中选择“文件/目录”选项卡下的“包含文件目录”。
7)把Eigen代码所在的根目录添加到“包含文件目录”列表中,如下图所示。

8)现在编译运行程序,就可以看到运行结果了,如图所示。

在此基础上,同学们可以着手应用Eigen库完成一个具体的功能。参照邹欣老师布置的作业,我们的第一个“软件”开发作业如下:

 第一步: 写一个根据输入坐标生成一个平面图形(点、线段和三角形)并能对该几何图形进行平移和旋转操作的命令行 “软件”,要求:

 a) 通过命令行输入图形的名称,端点数(1为点,2为线段,3为三角形)和端点坐标(x,y)。

 如:输入一个点 p1 1 (2,5)
     输入一个线段 l1 2 (3,5) (4,6)
     输入一个三角形 t1 3 (1,1) (2,5) (-4,7)

 b) 输入一个计算指令,实现对上述图形的平移和绕原点旋转等操作,并输出该图形新的坐标值。

 如:move l1 (3,6) 表示把线段l1沿x方向移动3,沿y方向移动6。
     rotate t1 -30 表示把三角形t1绕原点逆时针旋转30度。

 程序设计要求使用Eigen库函数,(如觉得有难度可先用自己编写的函数实现,但在实现第二步前必须修改成使用Eigen库函数),先在博客上提交代码,并附上运行结果截图。同学之间可相互阅读博客,比较一下各自程序的功能、实现方法的异同。

 第二步,

 在小组内每个同学在如下方向中选择一个,进行功能扩展:

 a) 实现更复杂的二维图形操作,如定义更复杂的图形(多边形),实现图形围绕任意点的旋转,图形相对于某一条线的镜像,并考虑扩展到三维空间。

 b) 把图形数据保存到文件,并能从文件中恢复。

 c) 实现简易GUI,通过GUI输入图形坐标和操作命令,并显示图形。
 
 考虑如何把上述三个软件功能集成在一起,如何定义接口?

 估计做好这个软件需要的时间,并且写出大概的设计步骤和实现算法。
posted @ 2015-10-29 10:39  chenhust  阅读(1284)  评论(3编辑  收藏  举报