使用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
仔细阅读编译器给出的错误。理解错误信息是一项重要的技能!问题不在于您访问 comp1
和 comp2
字段以执行数值计算的方式,而是您如何处理计算结果。
*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
部分缺失。
在您的程序中,复数由一个结构表示,该结构具有两个字段 re
和 im
,用于实部和虚部。 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 复数变量将具有实部和虚部的结果值。
(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
仔细阅读编译器给出的错误。理解错误信息是一项重要的技能!问题不在于您访问 comp1
和 comp2
字段以执行数值计算的方式,而是您如何处理计算结果。
*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
部分缺失。
在您的程序中,复数由一个结构表示,该结构具有两个字段 re
和 im
,用于实部和虚部。 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 复数变量将具有实部和虚部的结果值。