使用结构体在C中实现复杂的乘积?

Gab*_*ini 0 c struct pointers

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

\n

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

\n

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

\n

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

\n

几何.c

\n
#include "complex.h"\n#include "stdlib.h"\nvoid complex_product(struct complex *comp1, struct complex *comp2) {\n    *comp1 =  ((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

几何.h

\n
#if !defined COMPLEX_H \n#define COMPLEX_H\nstruct complex {\n    double re, im; \n};\nextern void complex_product(struct complex* comp1, struct complex* comp2); \n\n#endif \n
Run Code Online (Sandbox Code Playgroud)\n

Gil*_*il' 5

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

\n
\n
*comp1 = /*some number*/;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

*comp1是一个struct complex. 右侧是一个数字。您无法为结构分配编号。

\n
\n

我知道两个复数以这种方式相乘:

\n

(a+ib)*(c+id)=(ac\xe2\x88\x92bd)+i(ad+bc)

\n
\n

正确的。

\n
\n
((comp1->re * comp2->im) - (comp1->im * comp2->im)) + ((comp1->re * comp2->im) + (comp1->im * comp2->re))\n
Run Code Online (Sandbox Code Playgroud)\n
\n

那不是你上面写的。请注意,您在这里计算的是实数。该i零件缺失。

\n

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

\n
struct complex result = { /*expression for the real part*/, /*expression for the imaginary part*/ };\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
struct complex result = {\n  .re = /*expression for the real part*/,\n  .im = /*expression for the imaginary part*/,\n};\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
struct complex result;\nresult.re = /*expression for the real part*/;\nresult.im = /*expression for the imaginary part*/;\n
Run Code Online (Sandbox Code Playgroud)\n

显然complex_product应该使用它的第一个参数作为输入和输出。当您这样做时,您需要小心,不要在完成计算之前覆盖输入。这是行不通的:

\n
comp1->re = \xe2\x80\xa6;\ncomp1->im = \xe2\x80\xa6;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
void complex_product(struct complex *comp1, struct complex *comp2) {\n    struct complex result;\n    result.re = \xe2\x80\xa6;\n    result.im = \xe2\x80\xa6;\n    *comp1 = result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我将让您将所有这些整合在一起。请注意,在 \xe2\x80\x93 之上至少存在一个错误,您计算了a*d两次而不计算a*c

\n