| functions/eq-sec-degree-with-struct-result.c - Løsning af andengradsligning - resultater via returneret objekt af struct type. | Lektion 12 - slide 17 : 36 Program 2 |
#include <stdio.h>
#include <math.h>
struct rootPack{
int numberOfRoots;
double firstRoot;
double secondRoot;
};
typedef struct rootPack rootPack;
rootPack solveQuadraticEquation(double a, double b, double c);
void printRoots(rootPack rp);
int main(void) {
double a, b, c;
rootPack rp1, rp2;
printf("Enter coeficients a, b, and c: ");
scanf("%lf %lf %lf", &a, &b, &c);
if (a != 0){
rp1 = solveQuadraticEquation(a, b, c);
printRoots(rp1);
}
else
printf("The coeficient a must be non-zero");
/* Solve another quadractic Equation */
rp2 = solveQuadraticEquation(1.0, 1.0, -30.0);
printRoots(rp2);
return 0;
}
/* Find roots in the quadratic equation a * x*x + b * x + c = 0.
Assume as a precondition that a is not zero */
rootPack solveQuadraticEquation(double a, double b, double c){
rootPack result;
double discriminant;
discriminant = b * b - 4 * a * c;
if (discriminant < 0){
result.numberOfRoots = 0;
/* result.firstRoot and result.secondRoot undefined */
}
else if (discriminant == 0){
result.numberOfRoots = 1;
result.firstRoot = -b/(2*a);
/* result.secondRoot undefined */
}
else{
result.numberOfRoots = 2;
result.firstRoot = (-b + sqrt(discriminant))/(2*a);
result.secondRoot = (-b - sqrt(discriminant))/(2*a);
}
return result;
}
void printRoots(rootPack rp){
if (rp.numberOfRoots == 0)
printf("No roots\n");
else if (rp.numberOfRoots == 1)
printf("One root: %f\n", rp.firstRoot);
else
printf("Two roots: %f and %f\n", rp.firstRoot, rp.secondRoot);
}