Foros del Web » Programación para mayores de 30 ;) » Programación General »

Comenzando a programar: 10c- Repetición condicional con REPEAT...UNTIL.

Estas en el tema de Comenzando a programar: 10c- Repetición condicional con REPEAT...UNTIL. en el foro de Programación General en Foros del Web. Ejemplo de captura de error: En el siguiente ejemplo veremos un programa simple que le pedirá al usuario que ingrese un valor entero. En esta ...
  #1 (permalink)  
Antiguo 22/11/2011, 11:52
 
Fecha de Ingreso: enero-2011
Mensajes: 51
Antigüedad: 13 años, 3 meses
Puntos: 21
Comenzando a programar: 10c- Repetición condicional con REPEAT...UNTIL.

Ejemplo de captura de error:

En el siguiente ejemplo veremos un programa simple que le pedirá al usuario que ingrese un valor entero. En esta ocasión veremos como leer estos valores como caracteres y luego si son correctos pasarlos a enteros tal como debería ser. Primero veamos algo que debería haber nombrado ya hace bastante pero sin embargo decidí aplazarlo hasta ahora.

En algunas partes de este curso nombré algo así como "el ordinal de un elemento" o "tipos ordinales" y dije que estos eran los tipos que tenían finita cantidad de elementos y que además, dado un elemento, podíamos saber cuál le seguía (sucesor) y cual estaba detrás (predecesor). Los tipos ordinales de Pascal son aquellos que están acotados, o sea, que tienen un inicio y un final. Tal es el caso del tipo INTEGER, que está acotado inferiormente por el valor -32768 y superiormente por MAXINT que vale 32767. Ninguna variable del tipo integer puede exceder estos valores. Si han activado el range checking tal como se los indiqué al inicio del curso deberían recibir un error en tiempo de compilación al intentar guardar en una variable entera algún valor fuera del intervalo [-32768, 32767], de lo contrario el error lo obtendrán en tiempo de ejecución.
Además de esto, el tipo dado un elemento del tipo INTEGER podemos saber quién está detrás y quién delante, por ejemplo, dado el número entero 5 sabemos que detrás está el 4 y delante el 6. Para el número -32768 no existe predecesor porque es el primer entero existente para pascal, al igual que para MAXINT, que no existe sucesor porque es el entero más grande que pascal puede representar.

Tenemos el tipo CHAR, que contiene todos los caracteres existentes. Obviamente este tipo es acotado ya que tiene una cantidad finita de elementos y además, dado un caracter podemos saber cuál es su predecesor y su sucesor.

El tipo REAL no es acotado ya que posee una cantidad infinita de elementos. Nunca se puede determinar el siguiente a un real. ¿Cuál número es el siguiente a 1.5? ¿Tal vez el 1.6? No porque antes está el 1.55, pero antes de ese está el 1.51, pero antes está el 1.501, y así podríamos continuar infinitamente. Siempre entre dos números reales cualesquiera hay infinitos reales. Esto en matemáticas es llamado densidad de los reales.

Lo importante aquí es hablar del ordinal de un carácter. Los caracteres están todos incluidos, para Free Pascal (existen otras tablas), en una tabla llamada Tabla Ascii. Esta tabla le asigna a cada carácter un valor numérico según su posición. Para ver la tabla Ascii en el IDE simplemente vayan al menú Tool --> Ascii table.



En esa imagen el cursor está posicionado sobre el símbolo @. Como vemos, a este carácter le corresponde el valor 64. Ese valor es el ordinal de @. Si nosotros tenemos un carácter cualquiera y queremos saber su ordinal debemos usar la función ORD. Por ejemplo si escribiéramos ORD(@) obtendríamos el entero 64 como resultado. A la inversa tenemos la función CHR que dado un entero nos devuelve su correspondiente carácter en la tabla. Si escribiéramos CHR(64) obtendríamos como valor devuelto el carácter @.
La función CHR dado un elemento del tipo Integer devuelve uno del tipo CHAR. La función ORD transforma un carácter en entero, o sea, de un tipo char obtenemos un tipo integer. Esto es lo que usaremos para, dado un carácter numérico, obtener el entero de ese carácter, o sea, dado el carácter ‘1’ obtener el número 1.

Sin embargo no es tan fácil, observen ustedes en la tabla que al carácter ‘0’ le corresponde el entero 48 ya que está en la posición 49 de la tabla (la primera posición es la 00). Al carácter ‘1’ le corresponde el entero 49 y así sucesivamente. Por lo tanto si nosotros leyéramos un carácter de la entrada estándar, suponiendo que el usuario ingresó el ‘1’, al hacer ORD(‘1’) obtendríamos el número 49 y no el número 1.

¿A alguno de ustedes se les ocurre como, dado un carácter numérico, obtener su valor en entero? O sea, si me dan el ‘2’ obtener el 2, si me dan el ‘8’ obtener el 8, y así. Como pueden observar, los lugares de la tabla están ordenados ascendentemente, por lo cual si al ‘0’ le corresponde el 48, al ‘1’ le corresponde el 49, al ‘2’ el 50 y así hasta el ‘9’ que le corresponde el 57. ¿Entonces que pasa si al ordinal de cualquier carácter numérico le resto el ordinal de ‘0’? Por ejemplo, si me dan el ‘0’, resto ese ordinal con el ordinal de ‘0’:

Ord(‘0’) - Ord(‘0’)= 48 – 48= 0. Obtuve el entero 0. Ahora si me dieran el carácter ‘1’ y a su ordinal le resto el ordinal de ‘0’:

Ord(‘1’) - Ord(‘0’)= 49 – 48= 1. Obtuve el entero 1. De tener el ‘9’ y restarle a su ordinal el ordinal de '0' tendría:

Ord(‘9’) - Ord(‘0’)= 57 – 48= 9. Obtuve el entero 9.

NOTA: El ordinal de un entero es el mismo entero: Ord(57)= 57.
El ordinal de un boolean es 1 para TRUE y 0 para FALSE.

Vayamos al ejemplo entonces. Le pediremos al usuario que ingrese un entero, pero lo leeremos como caracter, o sea, como un elemento del tipo CHAR. Si los caracteres leídos difieren de los numéricos le diremos al usuario que hay error, sino, transformaremos los caracteres a enteros. Para este programa usaremos la función EOLN que es TRUE cuando el cursor de la entrada estándar está en el fin de la línea y FALSE en caso contrario.

Esta función es primitiva de Pascal, o sea, la tenemos siempre disponible. Como pueden ver, es una función booleana ya que nos dará un valor TRUE o un valor FALSE.

Veamos el ejemplo:

Código Pascal:
Ver original
  1. PROGRAM enteros;
  2.  
  3. Var
  4.      car: char; //Caracter leído.
  5.      entero: integer; //Guardará el valor del caracter pero en INTEGER.
  6.      error: boolean; //TRUE si el usuario no ingresa un entero.
  7.  
  8. BEGIN
  9.  
  10.  
  11.  //Mostramos un mensaje al usuario y leemos la entrada.
  12.  write('Ingrese un entero: ');
  13.  read(car);
  14.  //Damos la condición de error.
  15.  error:= (ord(car)<48) or (ord(car)>57);
  16.  
  17.  If not error then
  18.     entero:= ord(car)-ord('0');
  19.  
  20.  //Leemos hasta el fin de línea o hasta que haya error.
  21.  while (not eoln) and (not error) do
  22.  begin
  23.     //Leemos el siguiente caracter.
  24.     read(car);
  25.  
  26.     //Verificamos que el caracter sea uno numérico.
  27.     error:= (ord(car)<48) or (ord(car)>57);
  28.  
  29.     If not error then
  30.        entero:= (entero*10)+(ord(car)-ord('0'));
  31.  end;
  32.  
  33.  If not error then
  34.     writeln('El entero ingresado es: ',entero)
  35.  else
  36.     writeln('No ha introducido un entero.');
  37.  
  38. END.

En este programa se pide un entero, pero el si el usuario ingresa cualquier otra cosa, el programa no caerá, sino que mostrará un mensaje de error.

Como primer ejercicio tienen que entender este programa y modificarlo para que funcione con REPEAT.

Los ejercicios están en la parte d.

Etiquetas: condicional, entrada, ide, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:15.