使用struct的c中的复杂产品?

complex product in c using struct?

(c环境,visual studio) 我有这个练习:计算两个复数之间的乘积。结果由 comp1 指向。 我知道两个复数是这样相乘的:

(a+ib)*(c+id)=(ac−bd)+i(ad+bc)。我做到了。这是一个非常简单的程序,实际上我只用了 1 行(在函数中)。但在调试器中我读到:

“double 类型的实体不能分配给“struct complex”类型的实体”。

我尝试使用强制转换运算符,但我发现这对于结构类型是非法的。所以我觉得完全迷失了。 我知道这个理论: 如果我想将结构传递给函数,我需要使用指针。为了使用指针访问结构成员,我使用语法糖“箭头运算符”->。它的意思是“*(p).x”。 那到底有什么问题呢?

geometry.c

#include "complex.h"
#include "stdlib.h"
void complex_product(struct complex *comp1, struct complex *comp2) {
    *comp1 =  ((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re));
}

geometry.h

#if !defined COMPLEX_H 
#define COMPLEX_H
struct complex {
    double re, im; 
};
extern void complex_product(struct complex* comp1, struct complex* comp2); 

#endif 

仔细阅读编译器给出的错误。理解错误信息是一项重要的技能!问题不在于您访问 comp1comp2 字段以执行数值计算的方式,而是您如何处理计算结果。

*comp1 = /*some number*/;

*comp1 是一个 struct complex。右边是一个数字。您不能将数字分配给结构。

I know that two complex numbers are multiplied to each other in this way:

(a+ib)*(c+id)=(ac−bd)+i(ad+bc)

正确。

((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re))

你上面写的不是这个。请注意,您在这里计算的是实数。 i 部分缺失。

在您的程序中,复数由一个结构表示,该结构具有两个字段 reim,用于实部和虚部。 i 不表示为可以相乘的东西。您需要分别计算实部和虚部,而不是将它们相加。

struct complex result = { /*expression for the real part*/, /*expression for the imaginary part*/ };

struct complex result = {
  .re = /*expression for the real part*/,
  .im = /*expression for the imaginary part*/,
};

struct complex result;
result.re = /*expression for the real part*/;
result.im = /*expression for the imaginary part*/;

显然 complex_product 应该使用它的第一个参数作为输入和输出。执行此操作时,需要注意不要在完成计算之前覆盖输入。这行不通:

comp1->re = …;
comp1->im = …;

因为comp1->im的计算需要comp1->re的旧值。最简单的处理方法是使用一个中间变量来存储结果,如我上面所示,并将其复制到最后的输出:

void complex_product(struct complex *comp1, struct complex *comp2) {
    struct complex result;
    result.re = …;
    result.im = …;
    *comp1 = result;
}

确保您了解此程序何时使用 * 以及何时使用 ->。这是你学习C语言时需要习惯的事情。

我会留给你把所有这些放在一起。请注意,上面至少有一个错误——您计算了两次 a*d 而不是计算 a*c.

问题很简单,你的运算是正确的,但你没有将结果存储在正确的变量中,对于一个复数,你有一个实部和一个虚部。您要做的是将它们混合在一起并将该值分配给一个复杂的结构(这是非法的 bcz 不同变量类型)。

您需要做的是将实部分配给 double 变量,将虚部分配给另一个变量,然后将这些变量分配给结构的相应属性,如下所示:

double re_result = (comp1->re * comp2->im) - (comp1->im * comp2->im);
double im_result = (comp1->re * comp2->im) + (comp1->im * comp2->re);

comp1.re = re_result;
comp1.im = im_result;

这样您的 comp1 复数变量将具有实部和虚部的结果值。