這九九乘法程式就在下面了,有興趣的人可以直接丟到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有幫助:
沒有留言:
張貼留言