#笔记:pta题笔记:注意:double不能直接比较大小!!!///////计算2个复数的和、差、积、商。

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:

输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:

分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

输入样例1:

2 3.08 -2.04 5.06

  
  

输出样例1:

(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i

  
  

输入样例2:

1 1 -1 -1.01

  
  

输出样例2:

(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0

  
  
```
 ``
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//虚数结构体
struct imaginaryNum 
{
    double a;
    double b;
};
typedef struct imaginaryNum cnum;
cnum* addition(cnum* c1,cnum* c2);//虚数加法
cnum* subtraction(cnum* c1,cnum* c2);//虚数减法
cnum* multiplication(cnum* c1,cnum* c2);//虚数乘法
cnum* division(cnum* c1,cnum* c2);//虚数除法
*/
//(2.0+3.1i) + (-2.0+5.1i) = 8.1i
int main(void)
{
    int ii=0;
    cnum c1,c2;
    memset(&c1,0,sizeof(c1));
    memset(&c2,0,sizeof(c2));
    cnum* c3=NULL;

    scanf("%lf %lf %lf %lf",&c1.a,&c1.b,&c2.a,&c2.b);//输入虚数

    for(ii=0;ii<4;ii++)
    {
//打印 算式
        printf("(%.1lf",c1.a);
        if(c1.b<0)printf("");else printf("+");
        printf("%.1lfi)",c1.b);
  //给出 运算符号,顺便利用 已有的函数 运算
        switch(ii)
        {
            case 0:{printf(" + ");c3=addition(&c1,&c2);};break;
            case 1:{printf(" - ");c3=subtraction(&c1,&c2);};break;
            case 2:{printf(" * ");c3=multiplication(&c1,&c2);};break;
            case 3:{printf(" / ");c3=division(&c1,&c2);};break;
        }

        printf("(%.1lf",c2.a);
        if(c2.b<0)printf("");else printf("+");
        printf("%.1lfi)",c2.b);

        printf(" = ");

        if(c3->a>(0-0.1)&&c3->a<(0+0.1)&&c3->b>(0-0.1)&&c3->b<(0+0.1))printf("0.0");
        else if(!(c3->a>(0-0.1)&&c3->a<(0+0.1)||c3->b>(0-0.1)&&c3->b<(0+0.1)))
        {
          
            printf("%.1lf",c3->a);
         
            if(c3->b<0)printf("");else printf("+");
            printf("%.1lfi",c3->b);

        }
        else 
        {
            if(!(c3->a>(0-0.1)&&c3->a<(0+0.1)))printf("%.1lf",c3->a);
            else printf("%.1lfi",c3->b);
        }
                    printf("\n");
    }
    return 0;
}
//下面是构造的虚数运算函数
cnum* addition(cnum* c1,cnum* c2)
{
    cnum* c3=(cnum*)malloc(sizeof(cnum));
    c3->a=c1->a+c2->a;
    c3->b=c1->b+c2->b;
    return c3;
}
cnum* subtraction(cnum* c1,cnum* c2)
{
    cnum* c3=(cnum*)malloc(sizeof(cnum));
    c3->a=c1->a-c2->a;
    c3->b=c1->b-c2->b;
    return c3;
}
cnum* multiplication(cnum* c1,cnum* c2)
{
    cnum* c3=(cnum*)malloc(sizeof(cnum));
    c3->a=c1->a*c2->a - c1->b*c2->b;
    c3->b=c1->a*c2->b + c1->b*c2->a;
    return c3;
}
cnum* division(cnum* c1,cnum* c2)
{
    cnum* c3=(cnum*)malloc(sizeof(cnum));
    c3->a=c1->a*c2->a + c1->b*c2->b;
    c3->b=-c1->a*c2->b + c1->b*c2->a;

    c3->a=c3->a/(c2->a*c2->a+c2->b*c2->b);
    c3->b=c3->b/(c2->a*c2->a+c2->b*c2->b);
    return c3;       
}

特别注意,题目要求中

如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

这个步骤涉及到浮点数的比较大小的问题,我最开始是直接用==0来处理,但是提交上去一直显示错误,后来想起来浮点数不能直接比较大小,就让 c3->a在 -0.01 到 +0.01的范围内就认为是0 了(因为 结果精度为0.1),但是还不对,最后调整到(+0.1~0.1)认为是0,终于提交正确

这个题给我的教训是,再次强调了 “浮点数不能直接比较大小这个知识点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值