#include <iostream>
#include <cmath>

using namespace std;

int main(void) {
	
	// Coefficienti della parabola
	float a = 1;
	float b = 5;
	float c = 4;
	
	cout << "Equazione: " << a << "x^2 + " << b << "x + " << c << " = 0" << endl;
	
	// Apertura della parabola
	if (a > 0) {
		cout << "Parabola rivolta verso l'alto." << endl;
	} else if (a < 0) {
		cout << "Parabola rivolta verso il basso." << endl;
	} else {
		cout << "Errore." << endl;
		return 0;
	}
	
	// Calcolo del discriminante
	float delta = (b * b) - (4 * a * c);
	cout << "Delta: " << delta << endl;
	
	if (delta > 0) {
		float x1 = ((-b) - (sqrt(delta))) / (2 * a);
		float x2 = ((-b) + (sqrt(delta))) / (2 * a);
		cout << "S = {x1 = " << x1 << " V " << "x2 = " << x2 << "}" << endl;
	} else if (delta == 0) {
		float x0 = (-b) / (2 * a);
		cout << "S = {x = " << x0 << "}" << endl;
	} else {
		cout << "Soluzioni troppo complesse per ora." << endl;
		return 0;
	}
	
	// Calcolo del vertice
	float xVertice = (-b) / (2 * a);
	float yVertice = (a * xVertice * xVertice) + (b * xVertice) + c;
	cout << "V(" << xVertice << "; " << yVertice << ")" << endl;
	
	// Calcolo del parametro focale
	float parametroFocale = (1) / (4 * a);
	
	// Calcolo del fuoco
	float xFuoco = xVertice;
	float yFuoco = yVertice + parametroFocale;
	cout << "F(" << xFuoco << "; " << yFuoco << ")" << endl;
	
	// Calcolo della direttrice
	float direttrice = yVertice - parametroFocale;
	cout << "d: y = " << direttrice << endl;
	
	// Asse di simmetria
	cout << "s: x = " << xVertice << endl;
	
	// Disegnamo il grafico (solo se le soluzioni sono numeri interi)
	const int width = 20;
	const int height = 10;
	
	for (int y = height; y >= -height; --y) {
        for (int x = -width; x <= width; ++x) {
            float fx = (a * x * x) + (b * x) + c;
            if (round(fx) == y) {
                cout << "*";
            } else if (y == 0 && x == 0) {
                cout << "+";
            } else if (y == 0) {
                cout << "-";
            } else if (x == 0) {
                cout << "|";
			} else {
                cout << " ";
            }
        }
        cout << endl;
    }
	
	return 0;
}