目录
最后,我们再来补充完整标准答案中没有写的主函数:(具体实例实际具体运算部分)
题目位于:1.3;PPT:第一章29;
(来源自数据结构与算法基础(青岛大学——王卓) note_Tarench的博客-CSDN博客)
- #include
- using namespace std;
-
- typedef struct {
- float realpart; //实部
- float imagpart; //虚部
- }Complex;
-
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
- //加减乘除
- void add(Complex* C, Complex A, Complex B);
- void minus(Complex* C, Complex A, Complex B);
- void mutiply(Complex* C, Complex A, Complex B);
- void divide(Complex* C, Complex A, Complex B);
-
- /*函数实现*/
- void assign(Complex* A, float real, float imag)
- {
- A->realpart = real;
- A->imagpart = imag;
- }
-
- void add(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart + B.realpart;
- C->imagpart = A.imagpart + B.imagpart;
- }
-
- void minus(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart - B.realpart;
- C->imagpart = A.imagpart - B.imagpart;
- }
-
- void mutiply(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;
- C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
- }
-
- void divide(Complex* C, Complex A, Complex B)
- {
- C->realpart = (A.realpart * B.realpart + A.imagpart * B.imagpart) / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- C->imagpart = (B.realpart * A.imagpart - B.imagpart * A.realpart) / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- }
(学习该块知识过程中)碰到的之前没学过的,之前不会的新学的,零碎的知识点和问题:
(1):这是个什么东西?
(2):这个typedef总感觉之前学习C++模块的基础知识时好像看到过
但是具体在哪里真的学过翻书翻了半天好像又找不出来
(3):之前我们在C++里面学习定义一个新的类型(结构体)时不都是用:
struct <新建类型名>
的格式吗?
关于typedef struct的详细解释,详见:typedef struct_宇 -Yu的博客-CSDN博客
在这里,简单来说,我们只需要知道: 模块
- typedef struct {
- float realpart; //实部
- float imagpart; //虚部
- }Complex;
等价于
- struct Complex {
- float realpart; //实部
- float imagpart; //虚部
- };
最终(已经实践验证)结果一样,把这里的typedef struct模块替换为我们熟悉的struct格式的模块即可;
将大段程序简化拆解(把五种运算拆开来一个一个说):
- #include
- using namespace std;
-
- struct Complex
- {//复杂的<复数>
- float realpart; //实部
- float imagpart; //虚部
- };
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
-
- /*函数实现(定义)*/
- void assign(Complex* A, float real, float imag)
- {
- A->realpart = real;
- A->imagpart = imag;
- }
给复数赋值部分,程序运行步骤相当于:
(A->realpart) = real;
(A->imagpart) = imag;
即:
第一个语句:
指针A访问结构体中的realpart部分
相当于(A->realpart)就是(代表)complex结构体中的realpart实数型变量,把这一部分调用出来
并且(然后),把函数给出的实参real赋给这个realpart部分
同样的,第二个语句:
指针A访问结构体中的imagpart部分
相当于(A->imagpart)就是(代表)complex结构体中的imagpart实数型变量,把这一部分调用出来
并且(然后),把函数给出的实参imag赋给这个imagpart部分
于是,赋值操作就完成啦
- #include
- using namespace std;
-
- struct Complex
- {//复杂的<复数>
- float realpart; //实部
- float imagpart; //虚部
- };
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
-
- /*函数实现(定义)*/
- void assign(Complex* A, float real, float imag)
- {
- (A->realpart) = real;
- (A->imagpart) = imag;
- }
- int main()
- {
- Complex n;
- Complex* p = &n;
- assign(p, 1, 2);
- cout << "该复数等于:"<
realpart<<"+"<imagpart<<"i"< - }
结果:

至于后面其他的加减乘除的函数定义,和赋值部分相似
(用“->”调用出所输出结果的实部/虚部部分,然后再针对该部分的运算规则分别给其赋值)
在此不再赘述,唯一有一点需要说明的,就是关于复数的除法公式:(如下)

另外,在除法运算中其实还默认要求分母不等于0,补充程序为:(标准答案multiply打错了)
- #include
- using namespace std;
-
- typedef struct //复杂的<复数>
- {
- float realpart; //实部
- float imagpart; //虚部
- }Complex;
-
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
- //加减乘除
- void add(Complex* C, Complex A, Complex B);
- void minus(Complex* C, Complex A, Complex B);
- void mutiply(Complex* C, Complex A, Complex B);
- void divide(Complex* C, Complex A, Complex B);
-
- /*函数实现*/
- void assign(Complex* A, float real, float imag)
- {
- A->realpart = real;
- A->imagpart = imag;
- }
-
- void add(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart + B.realpart;
- C->imagpart = A.imagpart + B.imagpart;
- }
-
- void minus(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart - B.realpart;
- C->imagpart = A.imagpart - B.imagpart;
- }
-
- void multiply(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;
- C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
- }
-
- void divide(Complex* C, Complex A, Complex B)
- {
- while (B.realpart * B.realpart + B.imagpart * B.imagpart != 0)
- C->realpart = (A.realpart * B.realpart + A.imagpart * B.imagpart) / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- C->imagpart = (B.realpart * A.imagpart - B.imagpart * A.realpart) / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- }
最后,我们再来补充完整标准答案中没有写的主函数:(具体实例实际具体运算部分)
以PPT中的具体运算为例
- void 输出结果(Complex a)
- {
- cout << "结果为: " << a.realpart
- << "+" << a.imagpart << "i;" << endl;
- }
- int main()
- {
- Complex z1, z2,a,m,result;
- assign(&z1, 8, 6);
- assign(&z2, 4, 3);
- add(&a,z1,z2);
- multiply(&m, z1, z2);
- divide(&result, m, a);
- 输出结果(result);
- }
最终:
- #include
- using namespace std;
-
- typedef struct //复杂的<复数>
- {
- float realpart; //实部
- float imagpart; //虚部
- }Complex;
-
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
- //加减乘除
- void add(Complex* C, Complex A, Complex B);
- void minus(Complex* C, Complex A, Complex B);
- void mutiply(Complex* C, Complex A, Complex B);
- void divide(Complex* C, Complex A, Complex B);
-
- /*函数实现*/
- void assign(Complex* A, float real, float imag)
- {
- A->realpart = real;
- A->imagpart = imag;
- }
-
- void add(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart + B.realpart;
- C->imagpart = A.imagpart + B.imagpart;
- }
-
- void minus(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart - B.realpart;
- C->imagpart = A.imagpart - B.imagpart;
- }
-
- void multiply(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;
- C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
- }
-
- void divide(Complex* C, Complex A, Complex B)
- {
- while (B.realpart * B.realpart + B.imagpart * B.imagpart != 0)
- C->realpart = (A.realpart * B.realpart + A.imagpart * B.imagpart)
- / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- C->imagpart = (B.realpart * A.imagpart - B.imagpart * A.realpart)
- / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- }
- void 输出结果(Complex a)
- {
- cout << "结果为: " << a.realpart
- << "+" << a.imagpart << "i;" << endl;
- }
- int main()
- {
- Complex z1, z2,a,m,result;
- assign(&z1, 8, 6);
- assign(&z2, 4, 3);
- add(&a,z1,z2);
- multiply(&m, z1, z2);
- divide(&result, m, a);
- 输出结果(result);
- }
但是为啥运行不出来嘞???
md你一个判断语句,你在这放while循环干什么???这不是陷入死循环么??
把while改成if即可:
- #include
- using namespace std;
-
- typedef struct //复杂的<复数>
- {
- float realpart; //实部
- float imagpart; //虚部
- }Complex;
-
- /*函数声明*/
- void assign(Complex* A, float real, float imag); //赋值
- //加减乘除
- void add(Complex* C, Complex A, Complex B);
- void minus(Complex* C, Complex A, Complex B);
- void mutiply(Complex* C, Complex A, Complex B);
- void divide(Complex* C, Complex A, Complex B);
-
- /*函数实现*/
- void assign(Complex* A, float real, float imag)
- {
- A->realpart = real;
- A->imagpart = imag;
- }
-
- void add(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart + B.realpart;
- C->imagpart = A.imagpart + B.imagpart;
- }
-
- void minus(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart - B.realpart;
- C->imagpart = A.imagpart - B.imagpart;
- }
-
- void multiply(Complex* C, Complex A, Complex B)
- {
- C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;
- C->imagpart = A.realpart * B.imagpart + A.imagpart * B.realpart;
- }
-
- void divide(Complex* C, Complex A, Complex B)
- {
- if(B.realpart * B.realpart + B.imagpart * B.imagpart != 0)
- {
- C->realpart = (A.realpart * B.realpart + A.imagpart * B.imagpart)
- / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- C->imagpart = (B.realpart * A.imagpart - B.imagpart * A.realpart)
- / (B.realpart * B.realpart + B.imagpart * B.imagpart);
- }
- }
- void 输出结果(Complex a)
- {
- cout << "结果为: " << a.realpart
- << "+" << a.imagpart << "i;" << endl;
- }
- int main()
- {
- Complex z1, z2, a, m, result;
- assign(&z1, 8, 6);
- assign(&z2, 4, 3);
- add(&a, z1, z2);
- multiply(&m, z1, z2);
- divide(&result, m, a);
- 输出结果(result);
- }
结果:
