天天看點

《實時控制軟體設計》第一個程式設計作業

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輸入圖形坐标和操作指令,并顯示圖形。
 
 考慮如何把上述三個軟體功能內建在一起,如何定義接口?

 估計做好這個軟體需要的時間,并且寫出大概的設計步驟和實作算法。