使用结构的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】:

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

*comp1 = /*some number*/;

*comp1struct 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 部分丢失。

在您的程序中,复数由具有两个字段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

【讨论】:

我正在写一个类似的回复:你打败了我 :) 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中的复杂产品?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的结构体——struct

[ C语言 ]一篇带你初识结构体--用C语言描述一个复杂对象

在 C#/C++ 之间编组复杂结构

C语言结构体

Go语言中的结构体

更为复杂C程序的运行时结构