[ Foro de Pascal ]
Hola a todos.
Tengo una duda de como tratar un error si se introduce por teclado un dato erroneo;
Expongo un ejemplo en mini programa.
program numeros;
var
num:integer;
begin
repeat
writeln('Introduzca un numero: ');
readln(num);
until (num>=1) and (num<=40);
end.
El problema es que al dar un caracter como por ejemplo "c", el programa falla por ser un valor no valido para la variable.
Desearia saber si es posible solucionar este error, de tal forma que si se introduce un caracter por teclado la variable no tome el valor y vuelva a preguntar de nuevo hasta que metan un valor correcto.
Gracias a todos por adelantado
hola!mira te mando un programa muy basico para que veas como se validan las cosas,espero te sea de ayuda!saludos.
Program validar;
uses { Declaración de Unidades o Librerías. }
crt;
var { Decaración de variables del Programa Principal.
No deben usarse en los procedimientos y funciones. }
opcionElegida: char;
{ Declaración de procedimientos y funciones auxilares al Programa Principal. }
{ Procedimiento que imprime el menú. }
procedure imprimirMenu;
var
longitud, posX, posY : byte;
begin
clrscr;
longitud := length ('Menú del programa Validar.');
posX := 40 - longitud div 2;
posY := 1;
gotoxy(posX, posY);
writeln ('Menú del programa Validar.');
writeln;
writeln (' 1. Validar números enteros.');
writeln (' 2. Validar strings sin importar las mayúsculas y minúsculas.');
writeln (' 3. Validar una posición del string.');
writeln;
writeln (' 4. Salir.');
writeln;
end;
function menu: char;
var
linea : string;
opcion, car : char;
entero : integer;
nReal : real;
code : integer;
begin
imprimirMenu;
readln(opcion);
case opcion of
'1': begin { Validar números enteros. }
clrscr;
writeln ('El número a validar será el 7540.');
writeln;
write ('Ingrese el núnero: ');
readln (linea);
writeln;
writeln;
val (linea, entero, code);
if ( code = 0 )
then
if ( entero = 7540 )
then writeln ('Ingresastes el número "7540".')
else writeln ('No ingresaste el número pedido, pero sí un número.')
else writeln ('No ingresaste ningún número.');
readkey;
end;
'2': begin { Validar strings en mayúsculas y minúsculas. }
clrscr;
write ('Ingrese el caracter ''s'' o el ''S'': ');
readln (car);
writeln;
writeln;
if ( upcase(car) = 'S' )
then writeln ('Ingresaste una de las cadenas pedidas.')
else writeln ('No ingresaste ninguna de las cadenas pedidas.');
readkey;
end;
'3': begin { Validar una posición del string. }
clrscr;
writeln ('Ingrese una cadena que tenga como tercer caracter un 3.');
readln (linea);
writeln;
writeln;
if ( linea[3] = '3' )
then writeln ('Ingresaste ', linea, ', y tiene como tercer caracter un 3.')
else writeln ('No ingresaste lo pedido.');
readkey;
end;
'4':; { No quiero que haga nada si ingresan un 4. }
else begin
writeln ('Esa no es una opción válida.');
readkey;
end;
end;
menu := opcion;
end;
{ Programa Principal. }
begin
repeat
opcionElegida := menu;
until opcionElegida = '4';
end.
Perdona, Miguel, se te había pasado tu mensaje. La respuesta de Alfredo es muy detallada, y tiene varias cosas interesantes.
Si quieres ver sólo cómo evitar el problema de que introduzcas incorrectamente algo que no sea un número, la forma es ésta:
- Lees una cadena de texto (string)
- Intentas convertir a número con "val": val (texto, numeroEntero, codigoDeError);
- Si codigoDeError no es cero, quiere decir que no se ha podido convertir a número, y entonces muestras el mensaje de error adecuado; por el contrario, si codigoDeError vale cero, es que se ha podido convertir a número, y no hay caracteres alfabéticos.
Lo habitual, por si el usuario se equivoca varias veces, es que lo encierres en un "repeat..until":
<pre><code>
repeat
readln(texto);
val (texto, numeroEntero, codigoDeError);
if codigoDeError = 0 then
writeln('Número no válido');
until codigoDeError = 0;
</code></pre>
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)