2016-06-13 151 views
0

無法計算出兩個複數的總和和差值。C函數無法正常工作

#include <stdio.h> 

void sum_diff(double *r3, double *i3, double *r4, double *i4); 

int main() 
{ 
    double r3, i3, r4, i4, s3, s4, d3, d4; 

    printf("Enter r3 and i3 where r3 + i3 is the first complex number.\n"); 
    printf("r3 = "); 
    scanf("%lf", &r3); 

    printf("i3 = "); 
    scanf("%lf", &i3); 

    printf("Enter r4 and i4 where r4 + i4 is the second complex number.\n"); 
    printf("r4 = "); 
    scanf("%lf", &r4); 

    printf("i4 = "); 
    scanf("%lf", &i4); 

    sum_diff(&r3, &i3, &r4, &i4); 

    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 

    return 0; 
} 
void sum_diff(double *r3, double *i3, double *r4, double *i4) 
{ 
    double s3, s4, d3, d4; 

    s3 = *r3 + *r4; 
    s4 = *i3 + *i4; 
    d3 = *r3 - *r4; 
    d4 = *i3 - *i4; 
} 
+1

請發表你的意思是「不工作」,或者你得到的錯誤。猜測你正在收到編譯錯誤。 – TenG

+0

我對這個模糊的描述表示歉意。所以基本上當我在CodeBlocks中運行它時,它會提示我輸入複數。總和和差異沒有被計算。它只給我「兩個複數的總和= 0.000 + 0.000」是否因爲我的引用在void函數中是不正確的? – lg713

+1

你實際上*正在計算總和和差值......你只是沒有對它們做任何事情,或者把它們傳回給main()。'sum_diff()'中的's3','s4'等與* main()中的變量不同*,它們是'sum_diff()'函數的本地變量實際上每次調用該函數)。 – Dmitri

回答

4

問題是與變量的範圍。 的功能更改爲:

void sum_diff(double *r3, double *i3, double *r4, double *i4, 
       double *s3, double *s4, double *d3, double *d4) 
{ 
    *s3 = *r3 + *r4; 
    *s4 = *i3 + *i4; 
    *d3 = *r3 - *r4; 
    *d4 = *i3 - *i4; 
} 

然後調用它爲:

sum_diff(&r3, &i3, &r4, &i4, &s3, &s4, &d3, &d4); 
+0

@Midas感謝您的編輯。我很感激! – sg7

+0

不客氣:-) – Midas

2

sum_diff()有沒有副作用。 s3, s4, d3, d4都是局部變量。也就是說,s3main()s3sum_diff()兩個不同變量

您正在尋找更多的東西一樣:

void sum_diff(double r3, double i3, double r4, double i4, 
       double *s3, double *s4, double *d3, double *d4) 
{ 
    *s3 = r3 + r4; 
    *s4 = i3 + i4; 
    *d3 = r3 - r4; 
    *d4 = i3 - i4; 
} 

而且你會因爲調用此:另外

sum_diff(r3, i3, r4, i4, &s3, &s4, &d3, &d4); 

,我強烈建議聽你的編譯器警告的某種組合/升級你的編譯器/使用標誌來包含警告級別。您的代碼如下給我產生以下內容:

[5:18pm][[email protected] /tmp] gcc -Wall blah.c 
blah.c:25:69: warning: variable 's3' is uninitialized when used here [-Wuninitialized] 
    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
                    ^~ 
blah.c:25:73: warning: variable 's4' is uninitialized when used here [-Wuninitialized] 
    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
                     ^~ 
blah.c:26:76: warning: variable 'd3' is uninitialized when used here [-Wuninitialized] 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 
                      ^~ 
blah.c:26:80: warning: variable 'd4' is uninitialized when used here [-Wuninitialized] 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 
                       ^~ 
4 warnings generated. 
0

(這是額外的信息是什麼在其他的答案中提供)

這是相當難以閱讀,有一個功能需要8個指針,其中一些是入站的,一些是出站的。

首先,你不應該使用指針參數來傳遞不會被改變的double。指針參數的使用既可以使函數改變數值,也可以在不信任編譯器高效地傳遞大值時進行手動優化。其次,該功能執行兩個單獨的任務。有兩個獨立的功能會更好。此外,對於返回的信息使用返回值會更好,這比使用out參數更易於閱讀和更習慣。

因此,代碼可能是,用C的本地複數支持:

complex double my_csum(complex double a, complex double b) 
{ 
    return a + b; 
} 

complex double my_cdiff(complex double a, complex double b) 
{ 
    return a - b; 
} 

如果你不想使用原生支持(例如,用於學習的原因),那麼我會建議使用一個結構與2會員代表複數,這樣你就可以return吧。