C Program: Quadratic Equation Roots

Formula: x = (-b ± √(b²-4ac)) / 2a

Discriminant D = b²-4ac determines: Real/Distinct (D>0), Equal (D=0), Complex (D<0)

1. Complete Solution (All Cases)

C
Production-ready with validation
#include <stdio.h>
#include <math.h>

int main() {
    double a, b, c, D, r1, r2, real, imag;
    
    printf("Enter a, b, c: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    if(a == 0) {
        printf("Not quadratic! Linear: x = -c/b = %.2lf\n", -c/b);
        return 1;
    }
    
    D = b*b - 4*a*c;
    printf("D = %.2f\n", D);
    
    if(D > 0) {
        r1 = (-b + sqrt(D))/(2*a);
        r2 = (-b - sqrt(D))/(2*a);
        printf("Root1 = %.2lf, Root2 = %.2lf\n", r1, r2);
    }
    else if(D == 0) {
        r1 = -b/(2*a);
        printf("Equal roots: %.2lf\n", r1);
    }
    else {
        real = -b/(2*a);
        imag = sqrt(-D)/(2*a);
        printf("Root1 = %.2lf + %.2lfi\n", real, imag);
        printf("Root2 = %.2lf - %.2lfi\n", real, imag);
    }
    return 0;
}

2. Test Cases

TEXT
Expected outputs verified
a  b  c | D    | Roots
1 -3  2 | 1.00 | 2.00, 1.00
1 -2  1 | 0.00 | 1.00 (equal)
1  2  2 |-4.00 | -1.00 ± 1.00i
1  5  6 | 1.00 | -2.00, -3.00

3. Reusable Function

C
Modular approach
#include <stdio.h>
#include <math.h>
#include <stdbool.h>

typedef struct {
    double r1, r2;
    bool real;
} Roots;

Roots solveQuadratic(double a, double b, double c) {
    Roots result = {0};
    double D = b*b - 4*a*c;
    
    if(D > 0) {
        result.r1 = (-b + sqrt(D))/(2*a);
        result.r2 = (-b - sqrt(D))/(2*a);
        result.real = true;
    } else if(D == 0) {
        result.r1 = result.r2 = -b/(2*a);
        result.real = true;
    } else {
        result.r1 = -b/(2*a);
        result.r2 = sqrt(-D)/(2*a);
        result.real = false;
    }
    return result;
}

int main() {
    Roots roots = solveQuadratic(1, -3, 2);
    if(roots.real)
        printf("Roots: %.2lf, %.2lf\n", roots.r1, roots.r2);
    else
        printf("Roots: %.2lf ± %.2lfi\n", roots.r1, roots.r2);
    return 0;
}

4. Discriminant Decision Table

TEXT
Quick reference
D = b²-4ac    | Roots Type       | Formula
---------------|------------------|--------------------------------
D > 0         | 2 Real/Distinct  | (-b±√D)/(2a)
D = 0         | 1 Real (Equal)   | -b/(2a)
D < 0         | 2 Complex        | -b/(2a) ± i√(-D)/(2a)

5. Production Checklist

6. Common Errors Fixed

TEXT
Avoid these mistakes
❌ Wrong:  if(D >= 0) // Misses exact D=0
❌ Wrong:  float a,b,c;  // Low precision
❌ Wrong:  gcc file.c   // Missing -lm
✅ Correct:(long double)D = b*b - 4*a*c;

7. Interview-Ready Version

C
Shows deeper understanding
#include <stdio.h>
#include <math.h>

int main() {
    double a=1, b=-7, c=12; // x²-7x+12=0
    double D = b*b-4*a*c;
    
    printf("Equation: %.0lfx² + %.0lfx + %.0lf = 0\n", a,b,c);
    printf("Discriminant: %.2f\n", D);
    
    if(D > 0) {
        double r1 = (-b+sqrt(D))/(2*a), r2=(-b-sqrt(D))/(2*a);
        printf("Roots: %.0lf, %.0lf (Real/Distinct)\n", r1>r2?r1:r2, r1>r2?r2:r1);
    } else if(fabs(D) < 1e-9) { // Floating point safe
        printf("Root: %.2lf (Equal)\n", -b/(2*a));
    } else {
        double real = -b/(2*a), imag = sqrt(-D)/(2*a);
        printf("Roots: %.2lf ± %.2lfi (Complex)\n", real, imag);
    }
    return 0;
}

8. One-Liner Formula

C
Core math (copy-paste)
double D = b*b-4*a*c;
double r1 = (-b + sqrt(D))/(2*a), r2 = (-b - sqrt(D))/(2*a);

Compile: gcc quadratic.c -lm