PROGRAM prueba(input, output);

{*
	
		- Problema: Imposibilidad de controlar excepciones en la entrada 
		de texto por parte del usuario al intentar leer un real.
	
		- Requerimiento: Una función que permita controlar la entrada de 
		texto por parte del usuario cuando se pretende leer un real.
		
		- Consideraciones teóricas:
			- input, el fichero de entrada estándar, es un file of char (o text).
			- read(y) = read(x, y) si, y solo si, x = input.
			- siendo y un real, read(y) lee de la entrada estándar y convierte lo
			leído en un real, a no ser que encuentre un caracter no permitido, en
			cuyo caso fallaría con un error de detención.
			
		- Conclusión: Podemos simplemente volcar la entrada del usuario a otra
		variable userInput (de tipo text), y al tiempo que lo vamos haciendo podemos ir comprobando
		caracter a caracter. Si existe alguno no permitido detenemos la lectura y
		notificamos del error. Si no se encuentra ningún caracter no permitido durante el volcado,
		en userInput tendremos una entrada segura (e igual a input) para ser convertida a real.
		
		NOTA: Esta función sería facilmente ampliable para permitir cosas como
		controlar el número de cifras o el rango del real a introducir, o para
		controlar (truncar o redondear) el número de cifras decimales.
	
	Valentín Barros.
	
	Pascal Estándar Extendido (ISO 10206).
	
*}

CONST
	
	ZERO	= ord('0');
	NINE	= ord('9');
	POINT	= '.';
	PLUS	= '+';
	MINUS	= '-';
	
VAR
	
	number:real;
	valid:boolean;
	
function readReal(var r:real):boolean;
var
	
	c:integer value 0;
	userInput:text;
	invalid, decimal:boolean value false;
	
begin
	
	rewrite(userInput);
	
	while not eoln and not invalid do
	begin
		
		c := c + 1;
		
		read(input, userInput^);
		
		{*
			Números del 0 al 9.
		*}
		if ((ord(userInput^) >= ZERO) and (ord(userInput^) <= NINE)) then put(userInput)
		{*
			El punto, siempre y cuando no haya sido introducido anteriormente y
			tampoco estemos hablando de que es el primer caracter.
		*}
		else if (userInput^ = POINT) and not decimal and (c <> 1) then
		begin
			
			put(userInput);
			decimal := true;
			
		end
		{*
			El signo, positivo o negativo, y pudiendo ocupar únicamente
			la primera posición.
		*}
		else if ((userInput^ = PLUS) or (userInput^ = MINUS)) and (c = 1) then put(userInput)
		else invalid := true;
			
		
		
	end;
	
	reset(userInput);
	
	if invalid or eof(userInput) then readReal := false
	else
	begin
		
		read(userInput, r);
		readReal := true;
		
	end;
	
end;
	
BEGIN
	
	valid := readReal(number);
	if valid then writeln(number)
	else writeln('El texto introducido no es un real.');
	
END.