靈兒 發問時間: 電腦與網際網路程式設計 · 1 0 年前

怎麼用c語言寫出巨集程式

1.試寫一程式,以巨集定義數學函式f(x,y)=3x+2y,從鍵盤輸入x,y值,並從螢幕輸出計算結果

2.試寫一程式,計算下面式子中,到第N項的和,N值由鍵盤輸入取得。(1+2)+(2+3)+(3+4)....+(N+(N+1))

拜托各位程式高手^^

5 個解答

評分
  • 1 0 年前
    最佳解答

    Question 1:

    在 C 語言中,是以 #define 來定義巨集(Marco)。以 # 開頭的 C 語言元素稱為 C 的前置編譯(Precompiler),也就是在實際編譯之前要先處理的動作。例如 #include <stdio.h>,表示在實際編譯之前,編譯器會將系統路徑內 stdio.h 的檔案內容,完完整整地取代 #include <stdio.h> 這一行。從 #define 的角度來看,例如 #define PI 3.1415926,表示在編譯之前,程式碼中所有的 PI 都會被取代成 3.1415926。淡藍色先舉一些例子來解釋如何定義好的巨集,假設:

     /*POW2(X) 是一個巨集,利用 POW(2) 可以求得 2 的平方*/

     #define POW2(X) X*X

    但是如果您的程式碼如果撰寫 r=POW2(2+3); 目的是為了要求出 5 的平方,但是 r=POW2(2+3); 會在前置編譯階段被取代成 r=2+3*2+3; 運算結果會是 11 而非 25,所以原來的巨集應該被定義成以下形式才能解決上述問題:

     /*利用 ( ) 提高 X 運算式的優先性*/

     #define POW2(X) (X)*(X) /*POW2(2+3); 被取代成 (2+3)*(2+3);*/

    再來一個:

     /*ADD(X,Y) 是一個巨集,利用 ADD(2,3) 可以得到兩個值的加總*/

     #define ADD(X,Y) (X)+(Y)

    但是如果您的程式碼撰寫 r=ADD(2,3)*ADD(2,3); 目的是為了求出 5*5; 但是 ADD(2,3)*ADD(2,3); 會在前置編譯階段被取代為 r=(2)+(3)*(2)+(3); 運算結果為 11 而非 25,所以原來的巨集應該被定義成以下形式才能解決上述問題:

     /*利用最外面的一對 ( ),避免巨集外部其他運算子的較高優先性*/

     #define ADD(X,Y) ((X)+(Y)) /*ADD(2,3)*ADD(2,3); 被取代成 ((2)+(3))*((2)+(3));*/

     /*重新改寫 POW2(X),使之避免可能出現的類似情況*/

     #define POW2(X) ((X)*(X))

    所以您的 f(x,y)=3x+2y 應該被定義成 #define F(X,Y) (3*(X)+2*(Y)),以下是程式碼實例:

    #include <stdio.h>

    /*依照 C 的撰寫慣例,巨集與符號常數以大寫為原則,並且要考慮運算式中各種運算子的優先性甚至結合性*/

    #define F(X,Y) (3*(X)+2*(Y))

    int main(int argc, char* argv[])

    {

    int x,y;

    printf("x="); scanf("%d",&x);

    printf("y="); scanf("%d",&y);

    printf("f(%d,%d)=%d\n",x,y,F(x,y));

    return 0;

    }

    Question 2:

    #include <stdio.h>

    #define TERM(N) ((N)+((N)+1))

    /*#define TERM(N) (2*(N)+1)*/ /*為化簡後的巨集定義方式*/

    int main(int argc, char* argv[])

    {

    int i,n,s=0;

    printf("N=");scanf("%d",&n);

    if(n>0) /*假設 n 於自然數系*/

    {

    for(i=1;i<=n;i++) s+=TERM(i);

    printf("result=%d\n",s);

    }

    return 0;

    }

    2007-05-23 06:03:49 補充:

    To 達仔,標準 C 語言沒有「//」型式的註解。「//」是 C++ 的單行註解方式 。 ^_^

    To Parkin, iostream 屬於 C++ 語言的範疇,C 語言沒有。^_^

    2007-05-23 06:14:58 補充:

    巨集的使用,無法避免邊際效益(Side Effect)所帶來的麻煩,例如上述 POW2(X) 的巨集,程式碼 r=POW2(i++); 會再前置編譯階段被替換成 r=((i++)*(i++)); 無論您如何改寫巨集,都無法避免 i++ 重覆兩次,這也是慣例上,巨集使用大寫命名的原因,主要在提醒程式設計師正在面對巨集,要避免有邊際效應參與的運算式。此例非得改寫成 r=POW2(i); i++; 不可。所以複雜的陳述式還是以函數(Function)方式製作比較適宜。

    2007-05-23 13:29:50 補充:

    To 琳琳,由於可攜性考量,淡藍色還是建議以 C 作者所提及的 /*...*/ 方式註解較為恰當。^_^

    參考資料: 無, 無
  • 匿名使用者
    6 年前

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

    【 最新活動→迎接新會員,首存狂送20% 】

    【運動→電子→對戰→現場→彩球 】

    【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

  • 鳳琳
    Lv 5
    1 0 年前

    // 型式 comment C99 有支援了... 雖然大多 C compiler 不支援 C99 ,但又是 C++ compiler 所以也支援.

  • 達仔
    Lv 4
    1 0 年前

    ㄛ ~ 註解的問題 , 對 ~ 突然忘了 ~ 謝謝 淡藍色的提醒 ! 感謝指導 ~

    2007-05-23 11:01:03 補充:

    某位網友說過 "知識是嚴謹的" , 所以在下自行刪除回答內容以示負責 , 也是對發問者的尊重 , 造成各位先進及同好的不便 , 向大家說聲抱歉 ! ~達仔~ 仍需虛心學習 , 由衷感謝 ~淡藍色~ 大大 的指導 , 日後回答發問者的問題時 , 定當站在發問者的立場去思考 , 小心求證 !

    TO ~淡藍色~ 先輩 , 嘿嘿 ! 您的實力 ~達仔~ 沒有看錯人 , 對吧 ?

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 1 0 年前

    1.

    #include<iostream>

    #define f(x,y) (3*x+2*y)

    using namespace std;

    int main( int argc, char * argv[] )

    {

    int x,y;

    cin >> x >> y;

    cout << f(x,y) << endl;

    system("pause");

    return 0;

    }

    2.

    2007-05-23 00:57:37 補充:

    2.

    #include<iostream>

    using namespace std;

    int main( int argc, char * argv[] )

    {

    int n,i,sum=0;

    cin >> n;

    for(i=1;i<=n;i++)

    sum+=i+(i+1);

    cout << sum << endl;

    system("pause");

    return 0;

    }

    參考資料: 自己, 自己
還有問題?馬上發問,尋求解答。