{$mode objfpc}{$H-}{$R+}{$T+}{$Q+}{$V+}{$D+}{$X-}{$warnings on}
program en_margen_relativo;
	// Queremos saber si todos los valores de un vector cumplen
    // la condición de estar dentro de cierto margen, expresado porcentualmente

const
	TamanioVector = 4;
type
	TipoVector = array[1..TamanioVector] of real;

function comprueba_margen_elemento(
    valor1, valor2, margen_porcentual: real):boolean;
	// Comprueba si valor2 está dentro del rango valor1 +- margen_porcentual;
    // Devuelve TRUE si está en el margen, FALSE en otro caso.
var
	margen_absoluto : real;
begin
	margen_absoluto := valor1 * (margen_porcentual / 100);
	result := abs(valor2 - valor1) <= margen_absoluto;
end;

function todos_en_margen(
    vector: TipoVector; promedio, margen: real): boolean;
	// Comprueba si todos los valores del vector están dentro de un valor
	// promedio, mas menos cierto margen (porcentual)
var
	i: integer;
	sal: boolean;  // Cuando sea cierto, salgo del bucle
begin
	result := TRUE;   // Provisionalmente, todos están en margen
	i := 1;
	sal := FALSE;
	repeat
		if not comprueba_margen_elemento(vector[i],  promedio, margen) then begin
            // Un elemento no cumple la condición
			result := False;   // Revertimos el valor provisional inicial
			sal := TRUE;    // Provocamos la salida del bucle
		end;
		if i= TamanioVector then
			sal := TRUE
		else
			i := i+1;
	until sal;	  
    // Si ningún valor estaba fuera de margen, el valor provisional 
    // inicial de 'result' pasa a definitivo.
end;

procedure test_comprueba_margen_elemento();
	// Para probar la función comprueba_margen_elemento
begin
	writeln(comprueba_margen_elemento(100, 109, 10));	 // TRUE
	writeln(comprueba_margen_elemento(100, 110, 10));	 // TRUE
	writeln(comprueba_margen_elemento(100, 111, 10));	 // FALSE
	writeln(comprueba_margen_elemento(100, 89, 10));	 // FALSE
	writeln(comprueba_margen_elemento(100, 90, 10));	 // TRUE
	writeln(comprueba_margen_elemento(100, 91, 10));	 // TRUE
end;

const
	VectorPrueba1: TipoVector = (115.4, 110.9, 111.9, 114.1);
	VectorPrueba2: TipoVector = (115.4, 126.2, 111.9, 120.7);

	ValorPromedio: real = 113;
    Margen: real = 10 ;
begin
	// Pruebo la función, luego comento la prueba
	//test_comprueba_margen_elemento();

	if Margen > 0 then begin  // Precondición
	    writeln(todos_en_margen(VectorPrueba1, ValorPromedio, Margen)); // TRUE
	    writeln(todos_en_margen(VectorPrueba2, ValorPromedio, Margen));	// FALSE
	end 
    else
		writeln('Margen_porcentual tiene que ser un número positivo');
end.

