中M2019春C入门和进阶练习 7-162 复数四则运算 (15 分)

本文介绍了一种使用C语言编写的程序,该程序能够计算两个复数的和、差、积、商,并按照特定格式输出结果。输入为两个复数的实部和虚部,输出为运算结果,精确到小数点后一位。

本题要求编写程序,计算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>    //主要是输出格式控制
void f(double a1,double b1,double a2,double b2,double c1,double c2,char c){
    if(c1>-0.05&&c1<0.05){        //c1,c2四舍五入为零时不输出,参考输入样例1
        c1=0.0;
    }
    if(c2>-0.05&&c2<0.05){
        c2=0.0;
    }
    if(b1>=0&&b2>=0){       //先由b1,b2的正负控制等号前面的格式
        if(c1!=0&&c2>0){      //由c1,c2的正负还是0选择右边的格式
            printf("(%.1lf+%.1fi) %c (%.1lf+%.1lfi) = %.1f+%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c1!=0&&c2<0){
            printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = %.1f%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c2==0&&c1){
            printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = %.1f\n",a1,b1,c,a2,b2,c1);
        }else if(c1==0&&c2){
            printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = %.1fi\n",a1,b1,c,a2,b2,c2);
        }else{
            printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = 0.0\n",a1,b1,c,a2,b2);
        }        
    }else if(b1<0&&b2>=0){
        if(c1!=0&&c2>0){
            printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = %.1f+%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c1!=0&&c2<0){
            printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = %.1f%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c2==0&&c1){
            printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = %.1f\n",a1,b1,c,a2,b2,c1);
        }else if(c1==0&&c2){
            printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = %.1fi\n",a1,b1,c,a2,b2,c2);
        }else{
            printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = 0.0\n",a1,b1,c,a2,b2);
        }
    }else if(b1>=0&&b2<0){
        if(c1!=0&&c2>0){
            printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = %.1f+%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c1!=0&&c2<0){
            printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = %.1f%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c2==0&&c1){
            printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = %.1f\n",a1,b1,c,a2,b2,c1);
        }else if(c1==0&&c2){
            printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = %.1fi\n",a1,b1,c,a2,b2,c2);
        }else{
            printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = 0.0\n",a1,b1,c,a2,b2);
        }
    }else if(b1<0&&b2<0){
        if(c1!=0&&c2>0){
            printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = %.1f+%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c1!=0&&c2<0){
            printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = %.1f%.1fi\n",a1,b1,c,a2,b2,c1,c2);
        }else if(c2==0&&c1){
            printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = %.1f\n",a1,b1,c,a2,b2,c1);
        }else if(c1==0&&c2){
            printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = %.1fi\n",a1,b1,c,a2,b2,c2);
        }else{
            printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = 0.0\n",a1,b1,c,a2,b2);
        }
    }
}
int main(){
    double a1,b1,a2,b2,c1,c2;
    scanf("%lf %lf %lf %lf",&a1,&b1,&a2,&b2);   //c1为结果实部,c2为结果虚部,计算公式可百度
    c1=1.0*(a1+a2);
    c2=1.0*(b1+b2);
    f(a1,b1,a2,b2,c1,c2,'+');
    c1=1.0*(a1-a2);
    c2=1.0*(b1-b2);
    f(a1,b1,a2,b2,c1,c2,'-');
    c1=1.0*(a1*a2-b1*b2);
    c2=1.0*(a2*b1+a1*b2);
    f(a1,b1,a2,b2,c1,c2,'*');
    c1=1.0*(a1*a2+b1*b2)/(a2*a2+b2*b2);
    c2=1.0*(b1*a2-a1*b2)/(a2*a2+b2*b2);
    f(a1,b1,a2,b2,c1,c2,'/');
    return 0;
}

 

 

### PTA 题目 7-9 复数四则运算 C语言实现 以下是针对PTA平台上题目编号为7-9的复数四则运算问题的C语言解决方案。此程序实现了两个复数之间的加法、减法、乘法以及除法操作,并按要求输出结果。 #### 程序设计 1. **数据结构定义** 使用 `struct` 来定义复数类型,包含实部 (`real`) 虚部 (`imag`)。 2. **功能模块划** - 加法函数:接受两个复数参数并返回其- 减法函数:接受两个复数参数并返回差值。 - 乘法函数:基于复数乘法规则 `(a+bi)(c+di)=(ac-bd)+(ad+bc)i` 进行计算[^4]。 - 除法函数:利用共轭原理简化母形式,即 \((\frac{a+bi}{c+di})=\frac{(a+bi)(c-di)}{c^2+d^2}\)[^5]。 3. **主逻辑流程** - 输入两个复数及其对应的操作符。 - 调用相应的方法执行具体运算。 - 输出最终的结果遵循特定格式规定。 ```c #include <stdio.h> // 定义复数结构体 typedef struct { double real; double imag; } Complex; // 加法函数 Complex add(Complex x, Complex y) { Complex result; result.real = x.real + y.real; result.imag = x.imag + y.imag; return result; } // 减法函数 Complex subtract(Complex x, Complex y) { Complex result; result.real = x.real - y.real; result.imag = x.imag - y.imag; return result; } // 乘法函数 Complex multiply(Complex x, Complex y) { Complex result; result.real = x.real * y.real - x.imag * y.imag; result.imag = x.real * y.imag + x.imag * y.real; return result; } // 除法函数 Complex divide(Complex x, Complex y) { Complex result; double denominator = y.real * y.real + y.imag * y.imag; if (denominator != 0) { result.real = (x.real * y.real + x.imag * y.imag) / denominator; result.imag = (x.imag * y.real - x.real * y.imag) / denominator; } else { result.real = 0; result.imag = 0; } return result; } // 打印结果辅助函数 void printComplex(Complex z) { if (z.imag >= 0) printf("%.2f+%.2fi\n", z.real, z.imag); else printf("%.2f-%.2fi\n", z.real, fabs(z.imag)); } int main() { Complex c1, c2, result; char op; // 用户输入部 scanf("%lf%lf %lf%lf %c", &c1.real, &c1.imag, &c2.real, &c2.imag, &op); switch(op) { case '+': result = add(c1, c2); break; case '-': result = subtract(c1, c2); break; case '*': result = multiply(c1, c2); break; case '/': result = divide(c1, c2); break; default: printf("Invalid operation.\n"); return 1; } // 结果展示 printComplex(result); return 0; } ``` --- #### 关键技术点- **结构体应用**: 利用了自定义类型的强大特性使得代码更加清晰易懂[^6]。 - **边界条件处理**: 对于特殊情形比如除数为零做了额外考虑以防运行错误发生[^7]。 - **格式化输出管理**: 根据不同情况调整显示样式确保存在负号时也能正确呈现[^8]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值