[ Foro de Pascal ]

solucion de error en pascal

05-Mar-2009 21:21
miguel lopez
3 Respuestas

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


09-Mar-2009 01:33
alfredo mercado

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.


10-Mar-2009 00:45
Nacho Cabanes (+31)

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>


10-Mar-2009 18:06
miguel lopez

Muchas gracias a ambos por las costestaciones ya que me han venido genial y me han ayudado para lo que lo necesitaba






(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.)