{$mode objfpc}{$H-}{$R+}{$T+}{$Q+}{$V+}{$D+}{$X-}{$warnings on}
program ecuaciones_grado2_v02;  // Versión mejorada:
     // El cuerpo del programa principal no toma decisiones
     // Tiene un subprograma que devuelve código de éxito/error
uses math;

// Resolución de ecuaciones de 2º grado 

const
	Epsilon: real = 0.00001;

function discriminante(a, b, c: real): real;
begin
	result := b ** 2 - 4.0 * a * c;
end;


function tiene_solucion(a, b, c: real): integer;
    // Si la ecuación tiene solución, devuelve el código 0
    // Si no la tiene ('a' nulo), devuelve el código 1
    // Si no la tiene (discriminante negativo), devuelve el código 2
begin
    if a = 0 then
        result := 1   // código de error, falla precondición
    else if discriminante(a,b,c) < 0 then
        result := 2   // código de error, falla precondición
    else
        result := 0  // código de 'ok'
end;

  
procedure resuelve_ecuacion(a, b, c: real; var x1, x2: real;
    var codigo: integer);

begin
    codigo := tiene_solucion(a, b, c);
    if codigo = 0 then begin
        x1 := (-b + sqrt(discriminante(a, b, c))) / (2.0 * a);
        x2 := (-b - sqrt(discriminante(a, b, c))) / (2.0 * a);
    end;
end;


procedure escribe_solucion(a, b, c: real; x1,x2: real; codigo:integer);
begin
	writeln(a:0:2, '*x**2 + ', b:0:2, '*x +', c:0:2, ' = 0');

    if (codigo = 0) and (abs(x1-x2) < Epsilon) then  // Una solución
		writeln(' x = ', x1:0:2);

    if (codigo = 0) and (abs(x1-x2) >= Epsilon) then begin // 2 soluciones
		writeln(' x1 = ', x1:0:2);
		writeln(' x2 = ', x2:0:2)
    end;

    if codigo = 1 then
        writeln('Error: el primer coeficiente no puede ser nulo');

    if codigo = 2 then
        writeln('Error: el discriminante no puede ser negativo');

    writeln();  // Escribe línea en blanco adicional
end;


var 
    a, b, c: real;	// ax2+xb+c=0 }
    x1, x2: real;  // Soluciones
    codigo: integer;
    

begin   // Cuerpo principal
	a := 3.0 ;
	b := 7.2 ;
	c := 1.1 ;
    resuelve_ecuacion(a, b, c, x1, x2, codigo);
    escribe_solucion(a, b, c, x1, x2, codigo);

	a := 1.0 ;
	b := 4.0 ;
	c := 4.0 ;
    resuelve_ecuacion(a, b, c, x1, x2, codigo);
    escribe_solucion(a, b, c, x1, x2, codigo);

	a := 0.0 ;
	b := 7.2 ;
	c := 1.1 ;
    resuelve_ecuacion(a, b, c, x1, x2, codigo);
    escribe_solucion(a, b, c, x1, x2, codigo);

	a := 3.0 ;
	b := 7.2 ;
	c := 9.1 ;
    resuelve_ecuacion(a, b, c, x1, x2, codigo);
    escribe_solucion(a, b, c, x1, x2, codigo);
end.
