我写的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;
}
说了这么多,可能有人问,为什么要有指针?
举一个通俗易懂的例子:把指针比喻成现实中的公寓门牌号,有人点了外卖,外卖小哥要送到你的面前,是不是需要知道你在哪栋楼几零几,知道这个才能准确的快速的送到你的手上。如果没有了这个门牌号,外卖小哥可能得一个一个的敲门,所以门牌号可以提高查找效率。
把这个例子放到计算机上之前,我先向大家阐述一下CPU和内存的关系:
针对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)
...