Assignment 5 : Solution
The program
#include <stdio.h>
#include <math.h>
typedef struct {
double real;
double imag;
} complex;
typedef struct {
double r;
double theta;
} polar;
char *cprint ( complex z )
{
char *c;
c = (char *)malloc(100*sizeof(char));
sprintf(c,"%lf%ci%lf",
z.real,
(z.imag==0)?'+':((z.imag>0)?'+':'-'),
(z.imag==0)?0:((z.imag>0)?z.imag:-(z.imag)));
return(c);
}
polar ctop ( complex z )
{
polar w;
w.r = sqrt((z.real*z.real)+(z.imag*z.imag));
w.theta = (w.r==0) ? 0 : atan2(z.imag,z.real);
return(w);
}
complex ptoc ( polar z )
{
complex w;
w.real = (z.r) * cos(z.theta);
w.imag = (z.r) * sin(z.theta);
return(w);
}
complex cadd ( complex z1 , complex z2 )
{
complex z;
z.real = z1.real + z2.real;
z.imag = z1.imag + z2.imag;
return(z);
}
complex csub ( complex z1 , complex z2 )
{
complex z;
z.real = z1.real - z2.real;
z.imag = z1.imag - z2.imag;
return(z);
}
complex cmul ( complex z1 , complex z2 )
{
complex z;
z.real = z1.real*z2.real - z1.imag*z2.imag;
z.imag = z1.real*z2.imag + z1.imag*z2.real;
return(z);
}
complex csqr ( complex z1 )
{
complex z;
z.real = z1.real*z1.real - z1.imag*z1.imag;
z.imag = 2*z1.real*z1.imag;
return(z);
}
complex cdiv ( complex z1 , complex z2 )
{
complex z;
double r;
r = z2.real*z2.real + z2.imag*z2.imag;
if (r == 0) {
fprintf(stderr,"Error: Division by zero\n");
z.real = z.imag = 0;
} else {
z.real = (z1.real*z2.real + z1.imag*z2.imag) / r;
z.imag = (z1.imag*z2.real - z1.real*z2.imag) / r;
}
return(z);
}
complex csqrt ( complex z1 )
{
polar w;
w = ctop(z1);
w.r = sqrt(w.r);
w.theta /= 2;
return(ptoc(w));
}
int findRoots ( complex *z1, complex *z2, complex a, complex b, complex c)
{
complex t, u;
t = csqr(b);
u = cmul(a,c);
u.real *= 4;
u.imag *= 4;
t = csub(t,u);
t = csqrt(t);
u.real = a.real * 2;
u.imag = a.imag * 2;
(*z1).real = (*z2).real = -(b.real);
(*z1).imag = (*z2).imag = -(b.imag);
*z1 = cadd(*z1,t); *z1 = cdiv(*z1,u);
*z2 = csub(*z2,t); *z2 = cdiv(*z2,u);
}
int main ()
{
complex a, b, c;
complex z1,z2;
printf("Enter a (coefficient of x²) : ");
scanf("%lf%lf",&(a.real),&(a.imag));
printf("Enter b (coefficient of x) : ");
scanf("%lf%lf",&(b.real),&(b.imag));
printf("Enter c (constant term) : ");
scanf("%lf%lf",&(c.real),&(c.imag));
printf("The input polynomial is :\n");
printf("(%s)x² + (%s)x + (%s)\n", cprint(a), cprint(b), cprint(c));
findRoots(&z1,&z2,a,b,c);
printf("The two roots of this polynomial are :\n");
printf("%s and %s.\n", cprint(z1),cprint(z2));
}
Output
Enter a (coefficient of x²) : 1 0
Enter b (coefficient of x) : 0 1
Enter c (constant term) : 1 0
The input polynomial is :
(1.000000+i0.000000)x² + (0.000000+i1.000000)x + (1.000000+i0.000000)
The two roots of this polynomial are :
0.000000+i0.618034 and -0.000000-i1.618034.
Enter a (coefficient of x²) : -1 0
Enter b (coefficient of x) : -7 0
Enter c (constant term) : 8 0
The input polynomial is :
(-1.000000+i0.000000)x² + (-7.000000+i0.000000)x + (8.000000+i0.000000)
The two roots of this polynomial are :
-8.000000+i0.000000 and 1.000000+i0.000000.
Enter a (coefficient of x²) : -1 0
Enter b (coefficient of x) : -7 0
Enter c (constant term) : 7 0
The input polynomial is :
(-1.000000+i0.000000)x² + (-7.000000+i0.000000)x + (7.000000+i0.000000)
The two roots of this polynomial are :
-7.887482+i0.000000 and 0.887482+i0.000000.
Enter a (coefficient of x²) : 0 -1
Enter b (coefficient of x) : 0 -7
Enter c (constant term) : 0 8
The input polynomial is :
(0.000000-i1.000000)x² + (0.000000-i7.000000)x + (0.000000+i8.000000)
The two roots of this polynomial are :
1.000000+i0.000000 and -8.000000-i0.000000.
Enter a (coefficient of x²) : -5 12
Enter b (coefficient of x) : 0 0
Enter c (constant term) : 0 0
The input polynomial is :
(-5.000000+i12.000000)x² + (0.000000+i0.000000)x + (0.000000+i0.000000)
The two roots of this polynomial are :
0.000000+i0.000000 and 0.000000+i0.000000.
Enter a (coefficient of x²) : 1 0
Enter b (coefficient of x) : 0 0
Enter c (constant term) : -5 12
The input polynomial is :
(1.000000+i0.000000)x² + (0.000000+i0.000000)x + (-5.000000+i12.000000)
The two roots of this polynomial are :
3.000000-i2.000000 and -3.000000+i2.000000.
Enter a (coefficient of x²) : 1 0
Enter b (coefficient of x) : 6 4
Enter c (constant term) : 5 12
The input polynomial is :
(1.000000+i0.000000)x² + (6.000000+i4.000000)x + (5.000000+i12.000000)
The two roots of this polynomial are :
-3.000000-i2.000000 and -3.000000-i2.000000.
Enter a (coefficient of x²) : 0 0
Enter b (coefficient of x) : 0 -7
Enter c (constant term) : 8 0
The input polynomial is :
(0.000000+i0.000000)x² + (0.000000-i7.000000)x + (8.000000+i0.000000)
Error: Division by zero
Error: Division by zero
The two roots of this polynomial are :
0.000000+i0.000000 and 0.000000+i0.000000.
Enter a (coefficient of x²) : -1.2345 1.2345
Enter b (coefficient of x) : -2.3456 -2.3456
Enter c (constant term) : 3.4567 -3.4567
The input polynomial is :
(-1.234500+i1.234500)x² + (-2.345600-i2.345600)x + (3.456700-i3.456700)
The two roots of this polynomial are :
-1.377513-i0.950020 and 1.377513-i0.950020.
Enter a (coefficient of x²) : -12345 23456
Enter b (coefficient of x) : -23456 -34567
Enter c (constant term) : 34567 -45678
The input polynomial is :
(-12345.000000+i23456.000000)x² + (-23456.000000-i34567.000000)x + (34567.000000-i45678.000000)
The two roots of this polynomial are :
-0.967105-i0.633814 and 1.708995-i0.756646.