#include <iostream>
#include <cmath>
#include <limits>

using namespace std;

void solveQuadratic(float a, float b, float c, float &x1, float &x2, short &type) {
    float delta = (b * b) - (4 * a * c);
    
    type = 0;
    x1 = x2 = 0;
    
    if (a == 0) {
        if (b == 0) {
            if (c == 0) {
                cout << "Równanie jest równaniem tożsamościowym; posiada nieskończenie wiele rozwiązań" << "\n";
                type = 3;
            } else {
                cout << "Równanie nie posiada rozwiązania;" << "\n";
                type = 4;
            }
        } else {
            cout << "Równanie jest równaniem liniowym; posiada rozwiązanie:" << "\n";
            type = 2;
            x1 = -c/b;
        }
        return;
    }

    else if (delta < 0) {
        cout << "Brak pierwiastków w zbiorze liczb rzeczywistych; delta jest ujemna" << "\n";
        type = 1;
        return;
    }

    else if (delta == 0) 
        cout << "Równanie posiada pierwiastek podwójny:" << "\n";
        
    else
        cout << "Równanie posiada pierwiastki:" << "\n";

    x1 = (-b - sqrt(delta)) / (2 * a);
    x2 = (-b + sqrt(delta)) / (2 * a);
}

/* 
types:

## równanie kwadratowe:
0 - posiada pierwiastki / pierwiastek podwójny (4, 3, -1 / 1, 3, 2.25)
1 - brak pierwiastków (1, 2, 3.141593)

## równanie liniowe:
2 - posiada rozwiązanie (0, 5, 1.618034)

## inne
3 - równanie tożsamościowe (0, 0, 0)
4 - brak rozwiązań (0, 0, 2.718282)
*/

void readFromInput(float (&values)[3]) {
    bool correct;
    char prompt;

    for (int i = 0; i < 3; i ++) {
        prompt = ((i == 0) ? 'a' : ((i == 2) ? 'c' : 'b'));

        do {
            cout << prompt << ": ";
            cin >> values[i];
 
            if (!cin) {
                cout << "): Takie równanie możesz sobie rozwiązać samemu – wpisz prawidłowe dane" << "\n";
                correct = false;
                cin.clear();
            } else correct = true;

            cin.ignore(numeric_limits<streamsize>::max(), '\n');

        } while (correct == false);
    }
}

int main() {
    float a, b, c, x1, x2, values[3];
    short type;

    cout << "Wprowadź równanie w postaci ax\u00b2 + bx + c = 0:" << "\n";

    readFromInput(values);

    cout << "\n";

    solveQuadratic(values[0], values[1], values[2], x1, x2, type);

    switch (type) {
    case 1:
    case 4:
        cout << "???";
        break;

    case 0:
    case 2:
        cout << "x\u2081 = " << (x1 == 0.0 ? abs(x1) : x1) << "\n";

        if (type == 0)
            cout << "x\u2082 = " << x2 << endl;
        break;
    }

    cout << endl;

    return 0;
}
