UNA PROPOSICIÓN PARA LA ENSEÑANZA DE LENGUAJES DE PROGRAMACIÓN
EN INGENIERÍA
M. Angélica Pinninghoff J.*
Ricardo Contreras A.*
Andreas Polyméris P.*
Marcela Varas C.*
Christian Weldt M.*
*Depto. Ing. Informática y Ciencias de la Computación
Facultad de Ingeniería, U. de Concepción
Dirección Postal: Casilla 1186 Concepción-3
Dirección Electrónica: mpinning@halcon.dpi.udec.cl
Octubre 1995
Resumen.
En este trabajo se presenta una experiencia en desarrollo, que dice
relación con la enseñanza de Lenguajes de Programación
para estudiantes de las distintas especialidades de Ingeniería Civil.
Uno de los objetivos más inmediatos del proyecto, es el conseguir
que el estudiante adquiera una disciplina para enfrentar los problemas
a resolver, con relativa independencia del lenguaje de programación
que se vaya a utilizar para implementar sus soluciones, suministrando los
mecanismos necesarios para que la opción por un lenguaje particular
sea lo más natural posible.
Palabras Clave: Resolución de Problemas, Estructuras de
Control, Seudolenguaje.
Introducción.
Durante años, los lenguajes de programación se han venido
enseñando como herramientas particulares, que se emplean para la
construcción de programas que resuelven muchos de los problemas
que los ingenieros enfrentan cotidianamente. Una de las características
más preocupantes de este proceso enseñanza-aprendizaje, radica
en la insistencia, desde el primer momento en la sintaxis, dejando de lado
aspectos, a nuestro juicio, más relevantes, como resultan ser los
métodos empleados para resolver problemas.
A partir de la experiencia particular de varios académicos de
nuestro departamento, a través de la dictación de la asignatura
de Lenguaje de Programación para las carreras de Ingeniería
Civil, hemos ido rescatando aquellos aspectos que nos han permitido llegar
de mejor forma al estudiante, manteniendo el objetivo inicial de preparar
al alumno para la programación en algún lenguaje de programación.
Lo que se pretende con este proyecto, cuya parte inicial se presenta
en este trabajo es hacer extensivo el uso de nuevas formas de acción
a todas las especialidades de Ingeniería Civil, más algunas
otras carreras de nuestra universidad que también cursan la asignatura
y que involucran un universo anual de aproximadamente 600 alumnos.
Lo primero: Olvidar los Lenguajes de Programación.
Uno de los problemas claros que hemos detectado, es que los estudiantes
rápidamente comienzan a preocuparse del cómo resolver un
problema, sin haberse centrado en el entendimiento del problema en sí,
que es el que se debe resolver. Los estudiantes creen que el empleo de
una sintaxis correcta en la construcción de un programa es garantía
de una adecuada resolución del problema: esta es necesaria, pero
para nada suficiente.
Por tal razón, nuestra preocupación inicial se centró
en el estudio de problemas que, idealmente, no tuvieran connotaciones matemáticas,
excluyendo aquellos como la típica generación de tablas de
números, manejo de factoriales, de secuencias particulares de términos
y otros cansadoramente conocidos. Así, partimos resolviendo problemas
combinatoriales asociados a juegos simples, que pese a no ser tan ingenieriles
como los anteriormente mencionados consiguen captar el interés de
los estudiantes; lo cual bien puede no ser una garantía, pero no
deja de ser un buen comienzo.
La metodología que proponemos parte con la Descripción
del Problema, esto es, el texto que nos permite enterarnos de qué
es lo que se pretende resolver; qué se entiende por solución.
Luego, como segundo elemento tenemos un Análisis del Dominio,
que nos permite identificar los medios, en su sentido más amplio,
de que disponemos para resolver el problema en cuestión. Una vez
clarificados los dos primeros puntos, tarea no siempre sencilla, nos enfrentamos
al tercer paso: la Búsqueda de Representaciones Operacionales.
Esto resulta de alguna complejidad, ya que sabemos que en este punto la
imaginación nos puede llevar a representaciones difíciles
de operacionalizar, pero entendemos que es parte importante del juego del
aprendizaje no podar tempranamente ideas no tradicionales. Eso será
en parte responsabilidad de la etapa siguiente, la Selección
de una Representación. Aquí en base a criterios operacionales,
se deberá optar por alguna de las eventuales representaciones generadas
en el punto anterior. Es claro que puede haber consenso al desarrollar
un problema particular en la elección de una representación,
y no ser necesaria la fase de Selección, pero nos interesa ilustrar
el andamiaje del método general.
La siguiente etapa, Identificación de Estructuras de Control,
nos relaciona con lo que hemos llamado un Seudolenguaje, ya que
de su potencialidad nacerán las distintas formas de expresar los
procesamientos que estarán permitidos. Esto implica que el Seudolenguaje
mencionado debe estar relacionado fuertemente con las estructuras de control
disponibles en los lenguajes de programación, por una parte, y con
una restricción que implique un cierto grado de formalismo por otra,
para ir puliendo aquellas conceptualizaciones que el lenguaje natural no
precisa suficientemente. Del Seudolenguaje hablaremos en el próximo
punto. Una vez identificadas estas estructuras de control estamos en condiciones
de generar el seudoprograma que guiará el proceso de solución
del problema planteado, fase que hemos llamado Estructuración
de la Solución.
Es importante notar que lo que hasta aquí hemos llegado a construir
es un algoritmo, que todavía es independiente de los lenguajes de
programación, y que, en su desarrollo, nos ha permitido focalizarnos
más en el problema mismo a resolver que en las herramientas destinadas
a su implementación. Eso nos parece un logro importante.
El Seudolenguaje.
Sabemos que el lenguaje natural resulta insuficiente para la mayoría
de las descripciones que deben hacerse en el campo de la ingeniería.
Por tal razón se han utilizado desde hace muchos años, fundamentalmente
para expresar algoritmos, lenguajes técnicos especializados, cada
uno con atributos particulares, pero derivados también de manera
importante de lenguajes de programación existentes. Aunque esta
dependencia pueda parecer natural hay que insistir en ella, porque uno
también podría sentirse tentado a librarse de ella: proponer
un seudolenguaje llamado informalmente Cosa-like, para no tener
que comprometerse antes de tiempo con un lenguaje de programación
Cosa. Pero entonces, y aquí viene lo que hay que tener presente,
para entender y usar correctamente Cosa-like, típicamente
resulta necesario conocer previamente Cosa, o al menos lo esencial
de este lenguaje; y así, la proposición del seudolenguaje
empieza a carecer de sentido.
El seudolenguaje utilizado en este trabajo, se basa en una definición
formal de lenguajes de programación [Alagic]. Así decimos
que los elementos del seudolenguaje se definen de la siguiente manera:
0. Declaración de Dominios y variables.
Entenderemos por Dominio un conjunto con sus funciones y relaciones
asociadas, en el cual una variable definida para ese Dominio puede tomar
valores.
Para definir un Dominio, al cual pueden pertenecer una o mas variables,
utilizamos:
Dominioi = (definición por extensión o comprensión
del conjunto), así como de sus funciones y relaciones asociadas.
Para declarar una o más variables y el Dominio al cuál
pertenece se utiliza en el seudoprograma:
variable1j, variable 2j,...,variable kj Dominio j
1. Atribución.
El seudoprograma
variable 1j,...,variablenj valor1j, ..., valornj
atribuye valorij a las respectivas variableij , con i=1..n
valorij puede ser el resultado de una expresión en el
dominio de variableij . Esto significa que el resultado de esta
expresión debe pertenecer al mismo dominio que variableij,
objeto de la atribución.
Una expresión es cualquiera de las alternativas siguientes:
elemento del Dominio
variable del Dominio
expresióni operador expresiónj
donde operador remite a una función de los dominios de
los valores resultantes de expresióni y expresiónj,
y entrega un valor sobre un tercer dominio.
2. Iteración.
El seudoprograma
Realizar, mientras p: seudoprograma
repetirá seudoprograma condicionado al valor que toma
el predicado p (expresión que remite a las relaciones de
los dominios y entrega valores en el particular Dominio Lógico ={verdadero,
falso}). Así, mientras el valor de p es verdadero, se realizará
seudoprograma. Se termina la iteración al evaluar p como
falso.
3. Selección.
El seudoprograma
Si p entonces realizar seudoprograma
realizará seudoprograma en base al valor del predicado
p. Cuando p sea falso, no se realizará seudoprograma.
4. Secuencia
El seudoprograma
inicio
seudoprograma 1
seudoprograma 2
...
seudoprograma n
término
realizará seudoprograma 1, luego seudoprograma 2,
y así sucesivamente en el orden especificado hasta realizar seudoprograma
n.
Teniendo estos elementos, estamos ya en condiciones entonces de manejar
un lenguaje uniforme para la descripción de nuestros algoritmos.
El sentido de las estructuras de control permitidas nos parece simple y
reducido, aspecto de importancia para las proyecciones visualizadas en
este trabajo.
Proyecciones.
El presente trabajo se encuentra en sus etapas iniciales de desarrollo,
actualmente nos encontramos realizando la especificación de requisitos
del software que servirá de apoyo a la utilización de la
metodología propuesta. Entendemos que este software debe suministrar
inicialmente, como mínimo, toda la ayuda necesaria para conseguir
una Estructura de la Solución satisfactoria en el seudolenguaje
adoptado.
El software especificado cuenta principalmente con dos módulos.
Un Tutorial Introductorio y un Módulo de Apoyo a la Construcción
de Algoritmos. En el Tutorial Introductorio se entregarán los elementos
de la metodología de resolución de problemas y ejemplos resueltos
aplicando la misma. Los ejercicios escogidos son dos problemas de índole
distinta. El primero trata de la construcción de figuras en base
a ciertos módulos de construcción (ver Figura 1) y operadores
básicos. El alumno se verá enfrentado al problema de construir
módulos mayores y podrá resolverlo por sí mismo o
ver una de las alternativas de solución. Las operaciones que el
alumno podrá realizar sobre los módulos básicos de
construcción son obtener, mover, rotar, pegar y eliminar.
Figura 1. Módulos Básicos de Construcción
Figura 2. Figuras (Módulos) Compuestos de Módulos
Básicos de Construcción.
La idea es que la construcción de módulos progrese a través
de distintos niveles de complejidad. Con esto se intenta introducir los
conceptos de abstracción ya que en las construcciones más
complejas no existirá preocupación por los módulos
básicos; modularidad y cohesión, ya que cada módulo
de construcción es un ente autónomo.
El segundo ejercicio considerado para este Tutorial Introductorio sitúa
al estudiante en la problemática de la Máquina de Post que,
más allá del Dominio Lógico, visualiza sólo
una variable perteneciente al Dominio de las palabras de
un alfabeto finito, y sólo ofrece un muy reducido número
de funciones y relaciones; ello no obstante es una Máquina Universal
[Manna]. Al alumno se le planteará una clase de problemas sobre
este Dominio de palabras. Él deberá resolverlos limitándose
a usar los escasos medios de esta Máquina de Post y las estructuras
de control de nuestro seudolenguaje. Entonces observará que para
cada uno de estos problemas las necesarias estructuras de solución
resultan ser bastante engorrosas, y por ello será motivado a proceder
modularmente, construyendo primero (sub)seudoprogramas de utilidad múltiple
para toda la clase de problemas planteados.
El módulo de apoyo a la construcción de algoritmos, es
un ambiente de trabajo, que incluye un intérprete, y debe permitir
al alumno construir sus algoritmos en el seudolenguaje propuesto y ejecutarlos
paso a paso, verificando el estado de las variables para cada sentencia
del seudoprograma. En este punto, también se encuentran ejemplos
de problemas resueltos por medio de la metodología de resolución
de problemas, tales como el problema del Puzzle-8 y el de los Misioneros
y Caníbales [Rich].
Objetivos más ambiciosos, planteados como una segunda etapa de este trabajo, tienen que ver con la eventual conectividad del seudolenguaje y lenguajes de programación específicos, siendo C y Pascal los primeros candidatos. Creemos que de esta forma, relegando los lenguajes de programación a su condición de simples elementos de apoyo, eliminamos los compromisos precipitados en la elección de un lenguaje, y complementando el uso del software, al ritmo de cada estudiante, con sesiones regulares de práctica del uso de lenguajes de programación, estaremos en mejores condiciones para incorporar algún nuevo lenguaje que en un momento determinado parezca satisfacer mejor nuestras necesidades.
Referencias.
[Sethi] Sethi, Ravi, "Lenguajes de Programación Conceptos
y Constructores", Addison-Wesley Iberoamericana, 1992.
[RodM] Rodríguez, Miguel, "Metodología de la Programación",
McGraw-Hill, 1991.
[Jaime] Jaime A., Pérez T., Gojenola K., "Una Experiencia
para la Mejora en los Resultados de las Prácticas de Programación",
III Congreso Iberoamericano de Educación Superior en Computación,
Concepción, Chile, 1994.
[Manna] Manna, Zohar, "Mathematical Theory of Computation",
McGraw-Hill, 1974.
[Rich] Rich, Elaine; Knight, Kevin "Inteligencia Artificial",
Segunda Edición, McGraw-Hill, 1991
[Alagic] Alagic, Suad; Arbib, Michael "The Design of Well-Structured
and Correct Programs", Springer-Verlag, 1978.