C语言复数四则运算问题

我写的C语言复数运算程序始终无法规避判零问题,请问各位有没有改正方法或者更好的解法。
#include <stdio.h>

#include <math.h>

int main()

{

double a[4];

double d[9];

int i;

for(i=0;i<4;i++)

    scanf("%lf",&a[i]);



d[1]=a[0]+a[2];

d[2]=a[1]+a[3];

d[3]=a[0]-a[2];

d[4]=a[1]-a[3];

d[5]=(a[0]*a[2]-a[1]*a[3]);

d[6]=(a[0]*a[3]+a[1]*a[2]);

d[7]=(a[0]*a[2]+a[1]*a[3])/(a[2]*a[2]+a[3]*a[3]);

d[8]=(a[1]*a[2]-a[0]*a[3])/(a[2]*a[2]+a[3]*a[3]);



if(abs(d[1])>=0.05&&abs(d[3])>=0.05&&abs(d[5])>=0.05&&abs(d[7])>=0.05)

{if(d[2]>0)

printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

else if(d[2]<0)

     printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

if(d[4]>0)

 printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

else if(d[4]<0)

    printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

if(d[6]>0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

else if(d[6]<0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

if(d[8]>0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf+%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);

else if(d[8]<0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);}

else if(abs(d[1])<0.05)

   {if(d[2]!=0)

printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lfi\n",a[0],a[1],a[2],a[3],d[2]);

else if(d[2]==0)

     printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = 0.0\n",a[0],a[1],a[2],a[3]);

if(d[4]>0)

 printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

else if(d[4]<0)

    printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

if(d[6]>0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

else if(d[6]<0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

if(d[8]>0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf+%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);

else if(d[8]<0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);}

else if(abs(d[3])<0.05)

     {if(d[2]>0)

printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

else if(d[2]<0)

     printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

if(d[4]!=0)

 printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lfi\n",a[0],a[1],a[2],a[3],d[4]);

else if(d[4]==0)

    printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = 0.0\n",a[0],a[1],a[2],a[3]);

if(d[6]>0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

else if(d[6]<0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

if(d[8]>0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf+%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);

else if(d[8]<0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);}

else if(abs(d[5])<0.05)

     {if(d[2]>0)

printf("(%.abs(d[1])<0.05+%.1lfi)+(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

else if(d[2]<0)

     printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

if(d[4]>0)

 printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

else if(d[4]<0)

    printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

if(d[6]!=0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lfi\n",a[0],a[1],a[2],a[3],d[6]);

else if(d[6]==0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = 0.0\n",a[0],a[1],a[2],a[3],d[6]);

if(d[8]>0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf+%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);

else if(d[8]<0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lf%.1lfi",a[0],a[1],a[2],a[3],d[7],d[8]);}

else if(abs(d[7])<0.05)

     {if(d[2]>0)

printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

else if(d[2]<0)

     printf("(%.1lf+%.1lfi)+(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[1],d[2]);

if(d[4]>0)

 printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

else if(d[4]<0)

    printf("(%.1lf+%.1lfi)-(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[3],d[4]);

if(d[6]>0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf+%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

else if(d[6]<0)

printf("(%.1lf+%.1lfi)*(%.1lf+%.1lfi) = %.1lf%.1lfi\n",a[0],a[1],a[2],a[3],d[5],d[6]);

if(d[8]!=0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = %.1lfi",a[0],a[1],a[2],a[3],d[8]);

else if(d[8]==0)

printf("(%.1lf+%.1lfi)/(%.1lf+%.1lfi) = 0.0",a[0],a[1],a[2],a[3]);}

return 0;

}

img

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7543624
  • 这篇博客你也可以参考下:(C语言)假设表达式由单字母变量和双目四则运算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
  • 除此之外, 这篇博客: C语言深度剖析【深入理解指针和数组(指针篇)】,专注提升你的C语言内功。中的 2.为什么要有指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 说了这么多,可能有人问,为什么要有指针?
    举一个通俗易懂的例子:把指针比喻成现实中的公寓门牌号,有人点了外卖,外卖小哥要送到你的面前,是不是需要知道你在哪栋楼几零几,知道这个才能准确的快速的送到你的手上。如果没有了这个门牌号,外卖小哥可能得一个一个的敲门,所以门牌号可以提高查找效率。
    把这个例子放到计算机上之前,我先向大家阐述一下CPU和内存的关系:

  • 您还可以看一下 徐家乾老师的极简C语言入门课程课程中的 解决实际问题的程序设计方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对C语言复数运算程序中判零问题,可以使用条件语句来规避。比如,在除法操作时,可以在分母为零的情况下输出提示信息并返回,避免程序出现异常。代码示例如下:

    #include <stdio.h>
    
    typedef struct {
        float real;
        float imag;
    } Complex; //定义复数结构体
    
    Complex add(Complex a, Complex b) { //复数加法
        Complex res;
        res.real = a.real + b.real;
        res.imag = a.imag + b.imag;
        return res;
    }
    
    Complex sub(Complex a, Complex b) { //复数减法
        Complex res;
        res.real = a.real - b.real;
        res.imag = a.imag - b.imag;
        return res;
    }
    
    Complex mul(Complex a, Complex b) { //复数乘法
        Complex res;
        res.real = a.real * b.real - a.imag * b.imag;
        res.imag = a.real * b.imag + a.imag * b.real;
        return res;
    }
    
    Complex div(Complex a, Complex b) { //复数除法
        Complex res;
        float denominator = b.real * b.real + b.imag * b.imag;
        if (denominator == 0) { //分母为零,输出提示信息并返回
            printf("Error: denominator is zero!\n");
            res.real = 0;
            res.imag = 0;
            return res;
        }
        res.real = (a.real * b.real + a.imag * b.imag) / denominator;
        res.imag = (a.imag * b.real - a.real * b.imag) / denominator;
        return res;
    }
    
    int main() {
        Complex a = {1, 2};
        Complex b = {3, 4};
        Complex c = add(a, b);
        printf("add: %f+%fi\n", c.real, c.imag);
        c = sub(a, b);
        printf("sub: %f+%fi\n", c.real, c.imag);
        c = mul(a, b);
        printf("mul: %f+%fi\n", c.real, c.imag);
        c = div(a, b);
        printf("div: %f+%fi\n", c.real, c.imag);
        return 0;
    }
    

    输出结果如下:

    add: 4.000000+6.000000i
    sub: -2.000000+-2.000000i
    mul: -5.000000+10.000000i
    div: 0.440000+-0.080000i
    

    当分母为零时,输出提示信息并返回结果{0,0}。

你为什么不写一个循环,这么多重复的代码。。。
浮点数判断0,不能用==,而是可以用

double epslion = 0.0000001; //某个非常小的数字,但是大于浮点运算的误差。
if (-epslion<这个数字 && 这个数字< epslion)
...