{$mode objfpc}{$H-}{$R+}{$T+}{$Q+}{$V+}{$D+}{$X-}{$warnings on}

program letra_o_numero;
uses math;

// Programa que, a partir de 7 dígitos binarios como enteros, indica
// si el caracter ASCII correspondiente es número o letra

function binario_a_decimal( d1, d2, d3, d4, d5, d6, d7 : integer) : integer;
// Recibe 7 dígitos correspondientes a un número binario, lo convierte
// en decimal
begin
	result := d1 * 2 ** 6 + 
	          d2 * 2 ** 5 + 
	          d3 * 2 ** 4 + 
	          d4 * 2 ** 3 + 
	          d5 * 2 ** 2 + 
	          d6 * 2 ** 1 + 
	          d7 * 2 ** 0 ;
end;


function es_digito_ascii( x: integer): boolean;
// Recibe un código ascii como número entero, indica si se corresponde
// con un dígito
begin
    result :=  ( x >= ord('0'))   and   (x <= ord('9'));
end;


function es_minuscula( x: integer): boolean;
// Recibe un código ascii como número entero, indica si se corresponde 
// con una letra minúscula (inglesa)
begin
    result :=  ( x >= ord('a'))   and   (x <= ord('z'));
end;


function es_mayuscula( x: integer): boolean;
// Recibe un código ascii como número entero, indica si se corresponde
// con una letra mayúscula (inglesa)
begin
    result :=  ( x >= ord('A'))   and   (x <= ord('Z'));
end;


function es_numero_o_letra( x: integer): boolean;
// Recibe un código ascii como número entero, indica si se corresponde
// con un digito o con una letra (inglesa)
begin
    result := 
        es_digito_ascii(x) or es_minuscula(x) or es_mayuscula(x);
end;


const
	C1: integer = 1;   // Constantes locales al cuerpo del 
	C2: integer = 0;   // programa principal. (No universales)
	C3: integer = 0;
	C4: integer = 0;
	C5: integer = 0;
	C6: integer = 0;
	C7: integer = 1;


begin   // Cuerpo del programa

    // Probamos cada función por separado

	writeln(binario_a_decimal(C1, C2, C3, C4, C5, C6, C7));

	write(es_digito_ascii(65));  // Letra A, FALSE
	writeln(es_digito_ascii(50));  // Número 2, TRUE

	write(es_mayuscula(75));  // Letra K, TRUE
	writeln(es_mayuscula(102));  // Letra f, FALSE

	write(es_minuscula(75));  // Letra K, FALSE
	writeln(es_minuscula(102));  // Letra f, TRUE
  
    write(es_numero_o_letra(114));  // letra r, TRUE
    writeln(es_numero_o_letra(64));  // arroba, FALSE

    writeln(
        es_numero_o_letra(
            binario_a_decimal(C1, C2, C3, C4, C5, C6, C7)
        )
    );
            
end.
