您的位置:首页 > 其它

基础练习 复数运算

2016-10-28 17:05 162 查看
万事开头难,这句话说的可不假,以前也有人叫我写博客,但是我也是婉言拒绝了,理由就是自己的实力不行,怕会被别人笑话,其实自己实力真的不行。。。但是思来想去,觉得还是要做一些分享性的工作,所以今天在做完一题后,我决定登录CSDN,这是一个很棒的平台,在上面有很多大牛,他们做了很棒的工作,我也很荣幸能在上面写下属于自己的东西,如果一下我有写的不好的地方,欢迎各位指正,我会欣然接受,相信建议对我一个大二的学生也很有帮助。我的email是m13151723992@163.com。话不多说,来点干货。

编程实现两个复数的运算。

要求:(1)定义一个结构体类型来描述复数。

  (2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。

  (3)必须使用结构体指针的方法把函数的计算结果返回。

  说明:用户输入:运算符号(+,-,*,/) a b c d.

  输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。

输入:  - 2.5 3.6 1.5 4.9 输出:  1.00+-1.30i

这是一题挺简单的题目,实现复数的运算,但是题目中要求了要运用结构体去实现,加了一点难度,对于已经学过结构体的读者来说,这也不是什么难事。

但是如何做到代码精简化呢,也是一种艺术,在此,笔者写下的代码,没有追求简练,而且想以一种通俗易懂的方式来展现给读者。

#include<stdio.h>
#include<stdlib.h>
typedef struct FuShu{
double real;
double xu;
}FuShu;
FuShu *add(FuShu *p,FuShu *q){
FuShu *c=(FuShu*)malloc(sizeof(FuShu));
c->real=p->real+q->real;
c->xu=p->xu+q->xu;
return c;
}
FuShu *reduce(FuShu *p,FuShu *q){
FuShu *c=(FuShu*)malloc(sizeof(FuShu));
c->real=p->real-q->real;
c->xu=p->xu-q->xu;
return c;
}
FuShu *multiple(FuShu *p,FuShu *q){
FuShu *c=(FuShu*)malloc(sizeof(FuShu));
c->real=p->real*q->real-p->xu*q->xu;
c->xu=p->xu*q->real+p->real*q->xu;
return c;
}
FuShu *division(FuShu *p,FuShu *q){
FuShu *c=(FuShu*)malloc(sizeof(FuShu));
double a=(q->real*q->real+q->xu*q->xu);
c->real=(p->real*q->real+p->xu*q->xu)/a;
c->xu=(p->xu*q->real-p->real*q->xu)/a;
return c;
}
int main(){
FuShu a[2];
char c;
scanf("%c%lf%lf%lf%lf",&c,&a[0].real,&a[0].xu,&a[1].real,&a[1].xu);
FuShu *p=&a[0],*q=&a[1];
switch(c){
case '+':printf("%.2lf+%.2lfi\n",add(p,q)->real,add(p,q)->xu);break;
case '-':printf("%.2lf+%.2lfi\n",reduce(p,q)->real,reduce(p,q)->xu);break;
case '*':printf("%.2lf+%.2lfi\n",multiple(p,q)->real,multiple(p,q)->xu);break;
case '/':printf("%.2lf+%.2lfi\n",division(p,q)->real,division(p,q)->xu);break;
}
return 0;
}


1.四个函数编写

首先呢,我们要了解复数的运算法则,相加和相减的话就是实部和虚部对应的加减,得到的值作为和(差)的实部和虚部,乘除呢比较麻烦一点。我们以

a,b,c,d作为输入的两个复数的实部和虚部,积的实部则为ac-bd,虚部为bc+ad,除法的话实部为(ac+bd)/(c^2+d^2) ,虚部为(bc-ad)/(c^2+d^2)。有了

这些知识我们就可以编写程序了。接下来定义了加减乘除四个函数,对应上述的运算法则,注意返回值为指针类型。

2.结构体的定义

首先得话定义一个结构体FuShu代表复数,结构体有两个成员为real(实部)和xu(虚部),这里用了自定义类型typedef,这样方便以后要定义复数就可以直接写成FuShu a;但是若要定义为指针类型,则要开辟相应的存储空间,用的是(FuShu*)malloc(sizeof(FuShu))。要转换为指针型,所以前面加(FuShu*)。

3.主函数的定义

定义了一个结构体数组,存放两个运算的复数。函数调用和输出写成了一个多分支语句。对输入的运算符进行判断,调用对应的函数,把两个运算数的地址传递给相应的函数进行运算,add(p,q)就是表示加法运算后的和复数的地址,加上指向运算符后,就可以输出对应的实部和虚部了。另外使用了动态开辟内存函数,头文件要加上#include“stdlib.h” 。

致此,程序编写完毕。谢谢阅读,希望对你有所帮助。

之前一直在上面看文章,到了自己写的时候发现,那么空洞,还有很长的路要走啊,写技术博客可谓是程序员很好的习惯,希望自己能坚持下去。帮助了他人(或许可能没有),也成就了自己。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: