程序填空题:结构体指针-复数乘积
小可爱们,还记得我们做过实现一个计算复数之积的简单函数吗?
若两个复数分别为:c1=x1+y1i和c2=x2+y2i ,则它们的乘积为 c1×c2=(x1x2−y1y2)+(x1y2+x2y1)i。
#include <stdio.h>
struct complex{
int real;
int imag;
};
struct complex multiply(struct complex x, struct complex y);
int main()
{
struct complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(x, y);
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
struct complex multiply(struct complex x, struct complex y)
{
struct complex result;
result.real=x.real*y.real-x.imag*y.imag;
result.imag=x.real*y.imag+x.imag*y.real;
return result;
}
C 语言中提供了一种为某一已知类型添加别名的方式——typedef(表示 type define)
使用的方法是:
typedef 原类型名 类型别名
那复数的类型定义可以改为
typedef struct complex{
int real;
int imag;
}complex;
那struct complex和complex都是复数的类型名。
那函数接口定义也可以为:
complex multiply(complex x, complex y);
在这题中函数的参数是以结构体变量值的形式进行传递的,这种传值的方式的效率相对来说是低的(如果结构体内成员特别多,效率就会低得很明显)。
其实没有必要采用会使用额外内存并且需要复制传入的值到额外内存的“传值”作参数的方式,可以将传入的参数改写成指针形式。
那在下面的代码中可将multiply函数的参数改为:
complex multiply(complex *x, complex *y);
相应的, multiply函数体中的原来x和y都改成取指针x和y的指向的形式(要使用取值符)
x.real
改为
(*x).real
因为$$*$$运算符的优先级小于圆点运算符,所以$$*$$x要加括号。
不过,聪明的你可能发现了,在函数中,通过(*x).real的方式取结构体指针的指向的值,并访问它的成员元素似乎很麻烦。
设计 C 语言的程序员为我们提供了一种更简单的写法。当x是一个结构体的指针时,我们可以通过x->real访问x指向的结构体的成员real。
那以后再用到
(*结构体指针名).结构体成员元素名形式的代码时,我们都可以将其写为
结构体指针名->结构体成员元素名
那小伙伴们,我们就试着改改复数相乘的代码吧。
c++
#include <stdio.h>
typedef struct complex{
int real;
int imag;
}complex;
complex multiply(complex*, complex*);
int main()
{
complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(@@[&x, &y](1));
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
complex multiply( complex @@[*x](1), complex *y)
{
complex result;
result.real=@@[x->real*y->real-x->imag*y->imag](2);//计算乘积的实部
result.imag=@@[x->real*y->imag+x->imag*y->real](2);//计算乘积的虚部
return result;
}
小伙伴们,思考下:如果返回值也改为结构体指针,那我们返回result的地址可不可以呢?
答案:
第1空:&x, &y
第2空:*x
第3空:x->real*y->real-x->imag*y->imag
第4空:x->real*y->imag+x->imag*y->real
若两个复数分别为:c1=x1+y1i和c2=x2+y2i ,则它们的乘积为 c1×c2=(x1x2−y1y2)+(x1y2+x2y1)i。
#include <stdio.h>
struct complex{
int real;
int imag;
};
struct complex multiply(struct complex x, struct complex y);
int main()
{
struct complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(x, y);
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
struct complex multiply(struct complex x, struct complex y)
{
struct complex result;
result.real=x.real*y.real-x.imag*y.imag;
result.imag=x.real*y.imag+x.imag*y.real;
return result;
}
C 语言中提供了一种为某一已知类型添加别名的方式——typedef(表示 type define)
使用的方法是:
typedef 原类型名 类型别名
那复数的类型定义可以改为
typedef struct complex{
int real;
int imag;
}complex;
那struct complex和complex都是复数的类型名。
那函数接口定义也可以为:
complex multiply(complex x, complex y);
在这题中函数的参数是以结构体变量值的形式进行传递的,这种传值的方式的效率相对来说是低的(如果结构体内成员特别多,效率就会低得很明显)。
其实没有必要采用会使用额外内存并且需要复制传入的值到额外内存的“传值”作参数的方式,可以将传入的参数改写成指针形式。
那在下面的代码中可将multiply函数的参数改为:
complex multiply(complex *x, complex *y);
相应的, multiply函数体中的原来x和y都改成取指针x和y的指向的形式(要使用取值符)
x.real
改为
(*x).real
因为$$*$$运算符的优先级小于圆点运算符,所以$$*$$x要加括号。
不过,聪明的你可能发现了,在函数中,通过(*x).real的方式取结构体指针的指向的值,并访问它的成员元素似乎很麻烦。
设计 C 语言的程序员为我们提供了一种更简单的写法。当x是一个结构体的指针时,我们可以通过x->real访问x指向的结构体的成员real。
那以后再用到
(*结构体指针名).结构体成员元素名形式的代码时,我们都可以将其写为
结构体指针名->结构体成员元素名
那小伙伴们,我们就试着改改复数相乘的代码吧。
c++
#include <stdio.h>
typedef struct complex{
int real;
int imag;
}complex;
complex multiply(complex*, complex*);
int main()
{
complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(@@[&x, &y](1));
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
complex multiply( complex @@[*x](1), complex *y)
{
complex result;
result.real=@@[x->real*y->real-x->imag*y->imag](2);//计算乘积的实部
result.imag=@@[x->real*y->imag+x->imag*y->real](2);//计算乘积的虚部
return result;
}
小伙伴们,思考下:如果返回值也改为结构体指针,那我们返回result的地址可不可以呢?
答案:
第1空:&x, &y
第2空:*x
第3空:x->real*y->real-x->imag*y->imag
第4空:x->real*y->imag+x->imag*y->real