2012年1月29日

用SAS Macro表列九九乘法表 (SAS Macro入門教學)

表列出九九乘法表,我認為是很棒的迴圈入門,這個迴圈概念不論是用在SAS Data Step或SAS Macro都很適合。以下用SAS Macro做個簡單的說明。
這九九乘法程式就在下面了,有興趣的人可以直接丟到SAS執行看看,結果會在LOG視窗裡面喔!(在LOG,在LOG喔!!)
%macro A99;
%do A=1 %to 9;
    %put -----A=&A.-----;
    %do B=1 %to 9;
        %let C=&A X &B;
        %let D=%eval(&A * &B);
        %put &C = &D ;
    %end;
%end;
%mend A99;

%A99;



九九乘法

我先假設讀者都沒有SAS Macro的概念好了…我自己都亂學的有點怕XD

SAS Macro為「子程式」或「副程式」的概念,因此需要給這個子程式一個名字,『A99』就是這個程式的名字。

%macro A99%mend A99 中包裹著九九乘法的的程式。

緊接要設定第一個巨集變數,巨集變數A要自動跑出1,2,3,…,8,9的數字,同樣巨集變數B也是要能跑出1…9這些數字,剩下便是把這這些數字相乘。

「%do  [1] %to [2] ;…; %end;」為設定回圈的開始,%do%to %end均為macro的語法(Statement),在[1]要放入巨集變項的名字及起使數字,如程式所寫的A=1。[2]則放入結束的數字,程式所寫的為9。而%end這是宣告這個迴圈結束,如果忘了放入%end,此迴圈程式可是會無法執行的(大家可以試試不加的後所跑出的錯誤訊息)

「%put [3] ;」,%put為將文字或巨集變項的訊息呈現於LOG視窗中。如果沒有%put這個語法幫我們把文字或結果「列印」出來,我們也就無法看到結果了。

「%put -----A=&A.-----;」只有一個是巨集變項,那就是&A,但注意看喔,對就是要很注意!對後面有一個,點的功能是將巨集變項與後面的文字做一個連結,有點像膠水一樣的功能,當然也歡迎大家嘗試把刪除後再跑跑看。

喔對了~忘了說,這一小段程式,我是希望能在看到結果時,能多分隔線,請自己試試看了喔!

「%do B=1 %to 9; 」為巨集變項專屬的迴圈。&B變項迴圈和A變項迴圈關係為,當&A變項跑出1後,&B變項會跑出1~9,接者&A變項跑出2,然後&B變項會再跑出1~9。

所以這也是為什麼「%put -----A=&A.-----;」要放在「%do B=1 %to 9; 」之前,因為我希望在&B變項跑出1~9之前就有一個分隔線。

「%let C=&A X &B; 」,%let也是SAS Macro非常常用的語法,主要是新增一個巨集變項,這裡新增一個巨集變項C,&C包含了&A的結果以及&B的結果,因此我預期的&C應該為「1 X 1」、「1 X 2」…「9 X 9」。

巨集變項其實均以文字的形式儲存資料,因此可以有空白或是其他的文字,當然也可以包含其他的巨集變項。

「%let D=%eval(&A * &B); 」同樣也是在新增巨集變項,巨集變項D就不是那麼單純做文字呈現了,這裡我希望能計算&A和&B相乘後的結果,如果沒有使用%eval巨集函數,程式只會呈現&A和&B的值喔。

%eval可做整數運算,如果有浮點運算的需求,要改用%SYSEVALF

終於要把結果都表列出來了,因此「%put &C = &D ; 」就是要來幫忙這個部分了,有點像機器人合體!把前面的東西一次組合在一起。

終於辛苦把程式寫完了,要如何執行這個SAS MACRO程式呢?

前面我們不是有把程式命名為A99,因此使用時,只要前面多一個%就可以使用了,所以執行方式為「%A99;」

如果今天我們想要的不只是九九乘法表,我想要十五乘十五的表可以嗎?

如果已經確實學會上面迴圈,就會知道只要改%do…%to…那兩個地方就好了,但其實我們把程式作一些彈性的調整,就可以「依據客戶需求」跑出所需要的乘法表了。

修改的程式如下,同時將程式命名為AXX,不過這隻程式我就不多說了,應該很容易瞭解的!

%macro AXX ( last1, last2 );
%do A=1 %to &last1 ;
    %put -----A=&A.-----;
    %do B=1 %to &last2 ;
        %let C=&A X &B;
        %let D=%eval(&A * &B);
        %put &C = &D ;
    %end;
%end;
%mend AXX;

%AXX (15,15);
%AXX (15,20);

如果您覺得這篇文章對您有幫助,文章旁的廣告您也剛好有興趣,請幫忙點擊廣告,讓我多一點寫下去的動力。感謝您的幫忙!

有興趣的讀者可以參考以下這篇教學的文章,希望能對學習SAS Macro有幫助:

沒有留言:

張貼留言