复杂的分工

时间:2017-03-02 19:30:28

标签: c header case divide

我的部门输出有问题。当我输入5和3的实部以及4和2的虚部时,我得到2.000000 + -2.000000i而不是1.769231 + 0.153846i。

以下是划分主程序的情况:

case 4:
     num1=Read_Complex();
     num2=Read_Complex();
     if ((num2.real=0)&&(num2.img=0));
     printf("Error. Cannot divide by 0.\n");
     }
     else{
        ans=Divide_Complex(num1,num2);
     }

这是调用Read_Complex的地方:

complex Read_Complex(void)
{
complex num;

printf("Enter real part:");
scanf("%d", &num.real);
printf("Enter img part:");
scanf("%d", &num.img);

return num;
}

以下是分部:

complex numer, denom;
float ans_real ans_img;

complex Divide_Complex(complex num1, complex num2)
{
   numer=Multiply_Complex(num1, Conjugate_Complex(num2));
   denom=Multiply_Complex(num2, Conjugate_Complex(num2));

   ans_real=numer.real/denom.real;
   ans_img=numer.img/denom.img;

   printf("%f + %fi\n", ans_real, ans_img);
}

任何帮助都会很棒。

Complex.h:

#ifndef COMPLEX_H_
#define COMPLEX_H_

typedef struct {
    int real;
    int img;
} complex;

#endif

1 个答案:

答案 0 :(得分:3)

您有几个问题,其中许多问题都包含在您的问题的评论中,但至少有一个重要问题没有。您似乎已经在检查中识别出除以零的问题。除此之外,

首先,声明函数Divide_complex()返回一个值,但是控件到达函数的末尾而没有执行return语句。如果调用者尝试使用返回值,则会导致未定义的行为;你的编译器应该发出警告。

第二,您的complex数据类型完全不足以表示复数,因为它只为实部和虚部提供整数值。特别是,它不能代表您特别询问的商数。

第三,Divide_Complex()在分割复数的组件时执行整数除法,必然会提供整数结果。从某种意义上说,你的complex数据类型只能保存整数组件,但是它不能产生接近你期望的结果。

但第四, 你把数学编码错了 。您将修正的分母计算为原始分母及其共轭的乘积,这很好,但结果是实数数,没有虚数分量。这就是重点 - 它将复杂/复杂的商变成复杂/真实的商。您应该将商的虚部计算为ans_img = (float) numer.img / denom.real(除以denom.real,而不是denom.img)。你现在的方式应该是整数除以零,因为如果其他一切都正常工作,denom.img将为零。