2016-06-13 153 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吧。