使用结构的c中的复杂产品?
Posted
技术标签:
【中文标题】使用结构的c中的复杂产品?【英文标题】:complex product in c using struct? 【发布时间】:2021-12-31 15:03:07 【问题描述】:(c 环境,视觉工作室) 我有这个练习:计算两个复数之间的乘积。结果由comp1 指向。 我知道两个复数是这样相乘的:
(a+ib)*(c+id)=(ac−bd)+i(ad+bc)。我做到了。这是一个非常简单的程序,实际上我只使用了 1 行(在函数中)。但在调试器中我读到:
“double类型的实体不能分配给”struct complex”类型的实体”。
我尝试使用强制转换运算符,但我发现这对于结构类型是非法的。所以我感到完全迷失了。 我知道这个理论: 如果我想将结构传递给函数,我需要使用指针。为了使用指针访问结构成员,我使用语法糖“箭头运算符“->”。它的意思是“*(p).x”。 那么它有什么问题呢?
几何.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));
几何.h
#if !defined COMPLEX_H
#define COMPLEX_H
struct complex
double re, im;
;
extern void complex_product(struct complex* comp1, struct complex* comp2);
#endif
【问题讨论】:
请注意,C 原生支持 C99 中的复数。只需包含complex.h
是的,我知道,但这是我在大学时必须做的练习,所以我不能使用图书馆。我必须学习如何手动操作。等我学会了,就可以使用库了。
*comp = ((...) + (...));
-> *comp = (struct complex) ..., ... ;
最好用不同于complex.h
的名称来称呼您的标头,以避免与该名称的标准标头发生冲突
【参考方案1】:
仔细阅读您从编译器得到的错误。理解错误信息是一项重要的技能!问题不在于您访问comp1
和comp2
的字段以执行数值计算的方式,而在于您如何处理计算结果。
*comp1 = /*some number*/;
*comp1
是 struct complex
。右边是一个数字。您不能为结构分配编号。
我知道两个复数是这样相乘的:
(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
。
【讨论】:
我正在写一个类似的回复:你打败了我 :) PS:我对实际编译的 OP 代码有点失望 :(【参考方案2】:问题很简单,您正在正确地执行操作,但您没有将结果存储在正确的变量中,复数您有实部和虚部。您要做的是将它们混合在一起并将该值分配给一个复杂的结构(这是非法的 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中的复杂产品?的主要内容,如果未能解决你的问题,请参考以下文章