向量值函數的範例

因為 C 的函式必定返回至多一個值,所以它應用在數學上, 只能拿來計算單值函數 (single-valued function)。 如果要設計一個 C 函式來製造一個多值 (multi-valued) 或向量值函數, 就必須利用 Call by Name 的機制。 例如將直角坐標 (x, y) 變換到極坐標 (r, d) 的計算,就是一個向量值函數。 以下我們用指標變數示範這種 C 函式的做法。


#include <stdio.h>
#include <math.h>
  
/* 示範向量值函數 (demo-polar.c) */
void polar(float, float, float*, float*);
 
main() {
    float x, y, r, d;
    while (scanf("%f%f", &x, &y) != EOF) {
        polar(x, y, &r, &d);
        printf("%f\t%f\n", r, d);
    }
}
 
void polar(float x, float y, float *r, float *d) {
    float pi;
    pi = 4*atan(1);
    *r = sqrt(x*x + y*y);
    if (y == 0) {
        if (x >= 0)
            *d = pi/2;
        else
            *d = -pi/2;
    }       
    else
        *d = atan(x/y);
}

注意上面 scanf() 的用法,我們一次讀兩個數進來。 也注意上面定義 pi 的技巧。 以上程式在技巧和數學的考慮上,都還有改進的空間,但是不在這裡說明了。 我們看到 polar() 這個函式表面上根本沒有返回值。 實際上,我們用兩個指標變數來傳回函數值 (r, d)。

前面的示範,只要傳回兩個值。 如果一次要傳回很多值,那麼就要利用序列比較方便。

習題

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Feb 28, 2001
Last Revised: Feb 28, 2001
© Copyright 2001 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw