Desarrollo de una rutina
de validación en lenguaje C
Por Oscar Ross
Antecedentes
Durante los últimos 30 años, la historia de la computación electrónica ha sufrido adelantos vertiginosos. Los últimos datos por ejemplo, muestran que internet ha conseguido reunir, desde su nacimiento como un medio de comunicación comercial, un auditorio de 10 millones de personas en tan solamente 5 años; como comparación, podemos citar que la televisión reunió el mismo auditorio en el doble de tiempo desde que nació a la vida pública.
Sin embargo, el corazón de la computación sigue siendo el mismo desde hace unos 30 años, cuando Kernighan y Ritchie diseñan e implementan la primera versión del lenguaje de programación C. Desde su nacimiento, y hasta hace apenas unos años, el lenguaje C ha sido EL lenguaje de programación de computadoras por excelencia. ¿Qué es lo que ha hecho de C la fuerza dominante en el desarrollo de sistemas? Se pueden mencionar multitud de factores contribuyentes al auge del lenguaje, pero podríamos citar como uno de los principales el hecho de que logra envolver y simplificar en un conjunto de instrucciones muy reducido y una librería extensa, la casi totalidad del poder del hardware sin la complejidad de los lenguajes ensambladores. C es un nivel de abstracción superior al lenguaje ensamblador, se halla más cerca de la realidad humana. Adicionalmente, podemos mencionar el hecho de que C es un lenguaje estructurado, modular y funcional, características de las que el lenguaje ensamblador carece; esto representa una ventaja de proporciones inmensas puesto que hace la escritura/lectura del código de programa mucho más sencilla.
El lenguaje no carece de defectos. Uno de los principales es el muy debil chequeo de tipos. ¿Qué pretendo decir con 'chequeo de tipos'? La frase se refiere a que tan estricto es el compilador de C para asegurarse de que, si yo - el programador - declaro una variable entera, pueda asignar valores a esta SI Y SOLO SI estos son enteros. C es un lenguaje muy laxo en sus asignaciones. Pongamos un ejemplo. Si yo declaro una variable entera en Pascal y después pretendo asignarle un caractér, esto es lo que el compilador presenta:
Program Chequeo_De_Tipos;
var SoloEnteros : integer;
begin
SoloEnteros := 'a';
end.
(Compile)
ERROR 26 - Type Mismatch.
¿Qué hace el compilador de C en un caso similar?, veamos:
#include <stdio.h>
main()
{
int SoloEnteros;
SoloEnteros = 'A';
}
(Compile)
No errors - file TypeChk.C
¿Es esto posible? ¿Quiere decir que C es un lenguaje en realidad sin tipos? No, el compilador simplemente asigna a SoloEnteros el valor ASCII de la A mayúscula, si revisamos la tabla ASCII, nos damos cuenta que los caractéres, tienen valores enteros de 0 a 255.
Para muchos, esta 'característica' del lenguaje es un error fatal, sin embargo tiene sus ventajas si se enfoca adecuadamente.
Un segundo problema al momento de capturar datos desde teclado es que C no incluye lo que se conoce como 'manejadores de error'. Por ejemplo supongamos que yo le estoy pidiendo al usuario, desde un programa, que me proporcione su edad. Las restricciones lógicas son:
En un lenguaje como por ejemplo Visual Basic, existen multitud de técnicas incorporadas para el tratamiento de estas rutinas de entrada. Por ejemplo, el programador puede fácilmente eliminar cualquier señal proveniente de teclas específicas que no se desee capturar. Una segunda técnica consistiría en capturar los datos tecleados como cadenas, y realizar comprobaciones y conversiones de tipo mediante las funciones ya incorporadas por el lenguaje. Una tercera técnica consiste en usar tratamiento de errores, si el usuario intenta proporcionar un dato alfanumumérico cuando se le pidió uno numérico, la asignación a la variable producirá un error en tiempo de ejecución, el programador puede (y debe) anticiparse a esto 'atrapando' cualquier error generado, verificando el tipo de error de que se trate y tomando un curso de acción adecuado para el tipo de error.
Entonces, ¿cómo hace un programador C para certificar que si pide un entero el usuario introduzca un entero? Bueno, dado el poder y la flexibilidad del lenguaje, un programador de C escribe las rutinas el mismo.
En las siguientes líneas (corrección: páginas) intentaré exponer el desarrollo de una idea sobre como escribir un conjunto de funciones integradas para la validación y captura de datos desde el teclado utilizando el lenguaje 'C'. Me gustaría también hacer algunas aclaraciones antes de comenzar:
No pretendo que este sea EL conjunto de rutinas de validación para C.- El presente trabajo fue desarrollado para complementar los conocimientos adquiridos en las materias de Algorítmica y Lenguajes Operativos impartidas en la Licenciatura en Ingeniería en sistemas en la Universidad del Valle de México, campus Tlalpan; no es su objetivo presentar ideas absolutas sobre como programar las funciones, ni es la meta el escribir un tutorial de programación avanzada en C. Es también producto del gusto que tengo por la programación y el análisis de diversos problemas y como diferentes lenguajes de programación enfocan la solución e implementación de las soluciones a esos problemas. Si tienes algún conocimiento que desees compartir, comentarios sobre como eficientar las rutinas, algorítmos diferentes de captura y validación, son todos bienvenidos. Puedes enviarme un correo electrónico, e incluiré tus rutinas,algorítmos y código en la página (con el crédito adecuado).
El desarrollo de las rutinas pretende ser didáctico.- Uno de los objetivos primordiales de estas líneas es mostrar como es posible, para los programadores principiantes, el desarrollar procedimientos 'avanzados' utilizando C y al mismo tiempo establecer una conexión entre los conocimientos de las materias de 'Teoría general de sistemas', 'Diseño de sistemas', 'Algorítmica' y 'Lenguajes operativos'. Trataré de mostrar aquí cada paso en el análisis y la implementación del problema y cuales fueron las razones que me llevaron a tomar una solución o algorítmo sobre otro.
Requisitos
Para poder seguir el curso del desarrollo es necesario contar con ciertas herramientas y conocimientos. A continuación viene una lista de recomendaciones:
Conocimientos básicos sobre el lenguaje C - Es obviamente necesario tener ciertos conocimientos de C; sin embargo, no asumo ninguna clase de conocimientos 'avanzados' sobre el lenguaje. El diseño de las rutinas se basará en la utilización óptima de las herramientas básicas del lenguaje: variables, arreglos, apuntadores y las funciones de la biblioteca estándar. Si te interesa aprender más sobre el lenguaje, en internet existen varios excelentes tutoriales, revisa la lista.
Un compilador de C - Podría tratar de seguirse este documento sin el compilador pero el objetivo didáctico se perdería. Para poder aprender a programar en cualquier lenguaje a cualquier nivel, es necesario escribir, compilar, ejecutar y corregir programas. Puedes descargar compiladores de C gratuitos del internet. Revisa la lista aquí.